In order to access the PCI express extended configuration space, a linux inmate needs to have access to the PCI mmconfig base address. As inmates doesn't have access to this information using ACPI, we need to export it using the cell comm_region.
Note that the updates in Linux kernel used as inmate are also necessary in order to use the exported value as the PCI mmconfig base address. Signed-off-by: Otavio Pontes <[email protected]> --- hypervisor/arch/x86/control.c | 2 ++ hypervisor/arch/x86/include/asm/jailhouse_hypercall.h | 2 ++ inmates/tools/x86/linux-loader.c | 2 ++ tools/jailhouse-cell-linux | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hypervisor/arch/x86/control.c b/hypervisor/arch/x86/control.c index a33b007..7fe701a 100644 --- a/hypervisor/arch/x86/control.c +++ b/hypervisor/arch/x86/control.c @@ -53,6 +53,8 @@ int arch_cell_create(struct cell *cell) cell->comm_page.comm_region.pm_timer_address = system_config->platform_info.x86.pm_timer_address; + cell->comm_page.comm_region.pci_mmconfig_base = + system_config->platform_info.pci_mmconfig_base; cell->comm_page.comm_region.num_cpus = 0; for_each_cpu(cpu, cell->cpu_set) cell->comm_page.comm_region.num_cpus++; diff --git a/hypervisor/arch/x86/include/asm/jailhouse_hypercall.h b/hypervisor/arch/x86/include/asm/jailhouse_hypercall.h index ee97732..ad4ba3e 100644 --- a/hypervisor/arch/x86/include/asm/jailhouse_hypercall.h +++ b/hypervisor/arch/x86/include/asm/jailhouse_hypercall.h @@ -99,6 +99,8 @@ extern bool jailhouse_use_vmcall; struct jailhouse_comm_region { COMM_REGION_GENERIC_HEADER; + /** Base address of PCI memory mapped config (x86-specific). */ + __u64 pci_mmconfig_base; /** I/O port address of the PM timer (x86-specific). */ __u16 pm_timer_address; /** Number of CPUs available to the cell (x86-specific). */ diff --git a/inmates/tools/x86/linux-loader.c b/inmates/tools/x86/linux-loader.c index d4a9de7..78bb9c7 100644 --- a/inmates/tools/x86/linux-loader.c +++ b/inmates/tools/x86/linux-loader.c @@ -27,6 +27,7 @@ struct setup_data { u64 next; u32 type; u32 length; + u64 pci_mmconfig_base; u16 pm_timer_address; u16 num_cpus; u8 cpu_ids[SMP_MAX_CPUS]; @@ -45,6 +46,7 @@ void inmate_main(void) setup_data = (struct setup_data *)boot_params->setup_data; setup_data->pm_timer_address = comm_region->pm_timer_address; + setup_data->pci_mmconfig_base = comm_region->pci_mmconfig_base; setup_data->num_cpus = comm_region->num_cpus; smp_wait_for_all_cpus(); diff --git a/tools/jailhouse-cell-linux b/tools/jailhouse-cell-linux index f453805..c49e57b 100755 --- a/tools/jailhouse-cell-linux +++ b/tools/jailhouse-cell-linux @@ -690,7 +690,7 @@ class JailhouseCell: def x86_gen_setup_data(): MAX_CPUS = 255 - return struct.pack('8x4sI4x', b'JLHS', 4 + MAX_CPUS) + bytearray(MAX_CPUS) + return struct.pack('8x4sI12x', b'JLHS', 12 + MAX_CPUS) + bytearray(MAX_CPUS) # pretend to be part of the jailhouse tool -- 2.14.3 -- You received this message because you are subscribed to the Google Groups "Jailhouse" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
