... and use it with both SeaBIOS and OVMF. This may change the behavior of guest using OVMF as the ACPI tables currently loaded are the one for qemu-xen-traditionnal. After this change, the ACPI tables will the one intended for the device model used.
Signed-off-by: Anthony PERARD <anthony.per...@citrix.com> --- tools/firmware/hvmloader/config.h | 2 +- tools/firmware/hvmloader/hvmloader.c | 6 +++++- tools/firmware/hvmloader/ovmf.c | 9 +++------ tools/firmware/hvmloader/seabios.c | 9 +++------ 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index 0ddd897..1df5fd9 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -22,7 +22,7 @@ struct bios_config { void (*e820_setup)(void); - void (*acpi_build_tables)(void); + void (*acpi_build_tables)(void* addr, uint32_t size); void (*create_mp_tables)(void); void (*create_smbios_tables)(void); void (*create_pir_tables)(void); diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index b131b1d..9e5b9d4 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -407,8 +407,12 @@ int main(void) if ( bios->acpi_build_tables ) { + const struct hvm_modlist_entry *acpi_module; + acpi_module = get_module_entry(hvmlite_start_info, "acpi_tables"); + BUG_ON(!acpi_module); printf("Loading ACPI ...\n"); - bios->acpi_build_tables(); + bios->acpi_build_tables((void*)acpi_module->paddr, + acpi_module->size); } acpi_enable_sci(); diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 3c0ec91..1a9d457 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -39,9 +39,6 @@ #define LOWCHUNK_MAXOFFSET 0x0000FFFF #define OVMF_INFO_PHYSICAL_ADDRESS 0x00001000 -extern unsigned char dsdt_anycpu[]; -extern int dsdt_anycpu_len; - #define OVMF_INFO_MAX_TABLES 4 struct ovmf_info { char signature[14]; /* XenHVMOVMF\0\0\0\0 */ @@ -113,11 +110,11 @@ static void ovmf_load(const struct bios_config *config, memcpy((void *) dest, bios_addr, bios_length); } -static void ovmf_acpi_build_tables(void) +static void ovmf_acpi_build_tables(void *addr, uint32_t length) { struct acpi_config config = { - .dsdt_anycpu = dsdt_anycpu, - .dsdt_anycpu_len = dsdt_anycpu_len, + .dsdt_anycpu = addr, + .dsdt_anycpu_len = length, .dsdt_15cpu = NULL, .dsdt_15cpu_len = 0 }; diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c index 766bd6b..4cd035e 100644 --- a/tools/firmware/hvmloader/seabios.c +++ b/tools/firmware/hvmloader/seabios.c @@ -27,9 +27,6 @@ #include "smbios_types.h" #include "acpi/acpi2_0.h" -extern unsigned char dsdt_anycpu_qemu_xen[]; -extern int dsdt_anycpu_qemu_xen_len; - struct seabios_info { char signature[14]; /* XenHVMSeaBIOS\0 */ uint8_t length; /* Length of this struct */ @@ -87,12 +84,12 @@ static void add_table(uint32_t t) info->tables_nr++; } -static void seabios_acpi_build_tables(void) +static void seabios_acpi_build_tables(void *addr, uint32_t length) { uint32_t rsdp = (uint32_t)scratch_alloc(sizeof(struct acpi_20_rsdp), 0); struct acpi_config config = { - .dsdt_anycpu = dsdt_anycpu_qemu_xen, - .dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len, + .dsdt_anycpu = addr, + .dsdt_anycpu_len = length, .dsdt_15cpu = NULL, .dsdt_15cpu_len = 0, }; -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel