[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] 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. 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é <roger.pau@xxxxxxxxxx> --- Cc: Igor Druzhinin <igor.druzhinin@xxxxxxxxxx> Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> --- This commit should fix the qumu-trad Windows errors seen by osstest. --- tools/firmware/hvmloader/ovmf.c | 7 ++++++- tools/firmware/hvmloader/rombios.c | 6 ++++++ tools/firmware/hvmloader/seabios.c | 5 +++++ tools/firmware/hvmloader/util.c | 10 ++++++++++ tools/libacpi/build.c | 9 +++++++++ tools/libacpi/libacpi.h | 7 +++++++ 6 files changed, 43 insertions(+), 1 deletion(-) 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 <libacpi.h> #include <xen/hvm/params.h> +#include <xen/hvm/ioreq.h> #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 @@ -537,6 +537,15 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) } /* + * 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); -- 2.11.0 (Apple Git-81) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |