]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
configs/tools: Describe MMCONFIG region in config files
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 30 Jul 2014 14:11:30 +0000 (16:11 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Thu, 7 Aug 2014 11:29:35 +0000 (13:29 +0200)
This prepares to switch from ACPI parsing to config file based MMCONFIG
discovery.

Update the qemu-vm and h87i configs accordingly.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
configs/h87i.c
configs/qemu-vm.c
hypervisor/include/jailhouse/cell-config.h
tools/jailhouse-config-create
tools/root-cell-config.c.tmpl

index 2972b29c59d77bf4a36db5d6c4c2a224ed300620..73dae62986cfca8d41d438e802c1e8794e79dc64 100644 (file)
@@ -36,6 +36,8 @@ struct {
                        .size = 0x15000,
                },
                .platform_info.x86 = {
+                       .mmconfig_base = 0xf8000000,
+                       .mmconfig_end_bus = 0x3f,
                        .pm_timer_address = 0x1808,
                },
                .root_cell = {
index 55d9cb3724d45d8ce81a24f70108094ceda7b2d4..6ce9b5837a7226b910e6933e01c5e895a9712ca2 100644 (file)
@@ -41,6 +41,8 @@ struct {
                        .size = 0x30000,
                },
                .platform_info.x86 = {
+                       .mmconfig_base = 0xb0000000,
+                       .mmconfig_end_bus = 0xff,
                        .pm_timer_address = 0x608,
                },
                .root_cell = {
index 2ba5b6263c9ecfe82ef1f74641a8d11867bdd5b6..b477b349616afb32885baf3e4144a7a14171f2f1 100644 (file)
@@ -81,6 +81,9 @@ struct jailhouse_system {
        struct jailhouse_memory config_memory;
        union {
                struct {
+                       __u64 mmconfig_base;
+                       __u8 mmconfig_end_bus;
+                       __u8 padding[5];
                        __u16 pm_timer_address;
                } x86;
        } platform_info;
index db55c91c19c949107ed2504c00f7f66aba03c341..8a8397508ff2bad96a844e39b75366a41aa1112b 100755 (executable)
@@ -410,6 +410,31 @@ def parse_ioports():
     return pm_timer_base
 
 
+class MMConfig:
+    def __init__(self, base, end_bus):
+        self.base = base
+        self.end_bus = end_bus
+
+    @staticmethod
+    def parse():
+        f = input_open('/sys/firmware/acpi/tables/MCFG', 'rb')
+        signature = f.read(4)
+        if signature != b'MCFG':
+            if options.generate_collector:
+                return MMConfig(0, 0)
+            raise RuntimeError('incorrect input file format %s' % signature)
+        (length,) = struct.unpack('<I', f.read(4))
+        if length > 60:
+            raise RuntimeError('Multiple MMCONFIG regions found! '
+                               'This is not supported')
+        f.seek(44)
+        (base, segment, start_bus, end_bus) = \
+            struct.unpack('<QHBB', f.read(12))
+        if segment != 0 or start_bus != 0:
+            raise RuntimeError('Invalid MCFG structure found')
+        return MMConfig(base, end_bus)
+
+
 (pcidevices, pcicaps) = parse_pcidevices()
 
 product = [input_readline('/sys/class/dmi/id/sys_vendor',
@@ -425,6 +450,8 @@ regions = parse_iomem()
 ourmem = parse_cmdline()
 total = hvmem[1] + inmatemem
 
+mmconfig = MMConfig.parse()
+
 ioapic_id, rmrr_regs = parse_dmar()
 regions += rmrr_regs
 
@@ -481,6 +508,7 @@ else:
                         pcicaps=pcicaps,
                         cpucount=cpucount,
                         ioapic_id=ioapic_id,
-                        pm_timer_base=pm_timer_base))
+                        pm_timer_base=pm_timer_base,
+                        mmconfig=mmconfig))
 
 f.close()
index ccd5508b8b14bb35c93a0bf60594c243fbfb1fbe..bfcb1f07df1f4c30c5804a340adf0154e0efec77 100644 (file)
@@ -37,6 +37,8 @@ struct {
                        .size = ${hex(confmem[1])},
                },
                .platform_info.x86 = {
+                       .mmconfig_base = ${hex(mmconfig.base)},
+                       .mmconfig_end_bus = ${hex(mmconfig.end_bus)},
                        .pm_timer_address = ${hex(pm_timer_base)},
                },
                .root_cell = {