From: Roger Pau Monne Date: Tue, 29 Aug 2017 08:50:24 +0000 (+0100) Subject: acpi: set correct address of the control/event blocks in the FADT X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1534 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a8c87a8788e5ce21d6e55e0acdc64a8f26cf5687;p=xen.git acpi: set correct address of the control/event blocks in the FADT Commit 149c6b unmasked an issue long present in Xen: the control/event block addresses provided in the ACPI FADT table where hardcoded to the V1 version. This was papered over because hvmloader would also always set HVM_PARAM_ACPI_IOPORTS_LOCATION to 1 regardless of the BIOS version. The most notable issue caused by the above bug was that the QEMU traditional GPE0 block was out of sync: the address provided in the FADT didn't match the address QEMU was using. Note that PM1a and TMR worked fine because the V1 address was hardcoded in the FADT and HVM_PARAM_ACPI_IOPORTS_LOCATION was unconditionally set to 1 by hvmloader. Fix this by passing the address of the control/event blocks to acpi_build_tables, so the values can be properly set in the FADT table provided to the guest. Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich --- diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 17bd0fe95f..64806b6764 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -121,7 +121,12 @@ static void ovmf_acpi_build_tables(void) .dsdt_anycpu = dsdt_anycpu_qemu_xen, .dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len, .dsdt_15cpu = NULL, - .dsdt_15cpu_len = 0 + .dsdt_15cpu_len = 0, + .pm1a_evt = ACPI_PM1A_EVT_BLK_ADDRESS_V1, + .pm1a_cnt = ACPI_PM1A_CNT_BLK_ADDRESS_V1, + .pm_tmr = ACPI_PM_TMR_BLK_ADDRESS_V1, + .gpe0 = ACPI_GPE0_BLK_ADDRESS_V1, + .gpe0_len = ACPI_GPE0_BLK_LEN_V1, }; hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c index b14d1f2af3..9591bbb0aa 100644 --- a/tools/firmware/hvmloader/rombios.c +++ b/tools/firmware/hvmloader/rombios.c @@ -31,6 +31,7 @@ #include #include +#include #define ROM_INCLUDE_ROMBIOS #define ROM_INCLUDE_VGABIOS @@ -176,6 +177,11 @@ static void rombios_acpi_build_tables(void) .dsdt_anycpu_len = dsdt_anycpu_len, .dsdt_15cpu = dsdt_15cpu, .dsdt_15cpu_len = dsdt_15cpu_len, + .pm1a_evt = ACPI_PM1A_EVT_BLK_ADDRESS_V0, + .pm1a_cnt = ACPI_PM1A_CNT_BLK_ADDRESS_V0, + .pm_tmr = ACPI_PM_TMR_BLK_ADDRESS_V0, + .gpe0 = ACPI_GPE0_BLK_ADDRESS_V0, + .gpe0_len = ACPI_GPE0_BLK_LEN_V0, }; hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0); diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c index c8792cd42b..0375407ca7 100644 --- a/tools/firmware/hvmloader/seabios.c +++ b/tools/firmware/hvmloader/seabios.c @@ -95,6 +95,11 @@ static void seabios_acpi_build_tables(void) .dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len, .dsdt_15cpu = NULL, .dsdt_15cpu_len = 0, + .pm1a_evt = ACPI_PM1A_EVT_BLK_ADDRESS_V1, + .pm1a_cnt = ACPI_PM1A_CNT_BLK_ADDRESS_V1, + .pm_tmr = ACPI_PM_TMR_BLK_ADDRESS_V1, + .gpe0 = ACPI_GPE0_BLK_ADDRESS_V1, + .gpe0_len = ACPI_GPE0_BLK_LEN_V1, }; hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 934b566a5d..82171252a1 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -905,6 +905,11 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, config->dsdt_anycpu_len = dsdt_anycpu_len; config->dsdt_15cpu = dsdt_15cpu; config->dsdt_15cpu_len = dsdt_15cpu_len; + config->pm1a_evt = ACPI_PM1A_EVT_BLK_ADDRESS_V0; + config->pm1a_cnt = ACPI_PM1A_CNT_BLK_ADDRESS_V0; + config->pm_tmr = ACPI_PM_TMR_BLK_ADDRESS_V0; + config->gpe0 = ACPI_GPE0_BLK_ADDRESS_V0; + config->gpe0_len = ACPI_GPE0_BLK_LEN_V0; hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0); } @@ -914,6 +919,11 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len; config->dsdt_15cpu = NULL; config->dsdt_15cpu_len = 0; + config->pm1a_evt = ACPI_PM1A_EVT_BLK_ADDRESS_V1; + config->pm1a_cnt = ACPI_PM1A_CNT_BLK_ADDRESS_V1; + config->pm_tmr = ACPI_PM_TMR_BLK_ADDRESS_V1; + config->gpe0 = ACPI_GPE0_BLK_ADDRESS_V1; + config->gpe0_len = ACPI_GPE0_BLK_LEN_V1; hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); } diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index f9881c9604..50242f34c5 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -536,6 +536,15 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) acpi_info->pci_hi_len = config->pci_hi_len; } + /* + * Set location of the control/event registers. + */ + Fadt.pm1a_evt_blk = config->pm1a_evt; + Fadt.pm1a_cnt_blk = config->pm1a_cnt; + Fadt.pm_tmr_blk = config->pm_tmr; + Fadt.gpe0_blk = config->gpe0; + Fadt.gpe0_blk_len = config->gpe0_len; + /* * Fill in high-memory data structures, starting at @buf. */ diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h index 2ed1ecfc8e..2c56fb7646 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -96,6 +96,13 @@ struct acpi_config { uint32_t ioapic_base_address; uint16_t pci_isa_irq_mask; uint8_t ioapic_id; + + /* Location of the control/event registers */ + uint32_t pm1a_evt; + uint32_t pm1a_cnt; + uint32_t pm_tmr; + uint32_t gpe0; + uint8_t gpe0_len; }; int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config);