aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-02-25 20:56:43 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-02-25 20:56:43 +0000
commit515a6e93aa21be184141ed4c3a8e4f2352ecc7d2 (patch)
tree47881d3354503018be8ad3afbc0fa961afd6bdcd
parentd421338ccc43c606326be459664d6881c3deec46 (diff)
downloadxen-515a6e93aa21be184141ed4c3a8e4f2352ecc7d2.tar.gz
xen-515a6e93aa21be184141ed4c3a8e4f2352ecc7d2.tar.bz2
xen-515a6e93aa21be184141ed4c3a8e4f2352ecc7d2.zip
ACPI: workaround for S3 fail in two facs tables case
Some legacy BIOS which support ACPI2.0+ may expose two FACS tables via both FADT->FIRMWARE_CTRL and FADT->X_FIRMWARE_CTRL, but only lookup S3 waking_vector in the first one. Signed-off-by: Wei Gang <gang.wei@intel.com> Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r--xen/arch/x86/acpi/boot.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
index 8e67cde539..5a1dda0ee6 100644
--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -365,10 +365,15 @@ acpi_fadt_parse_sleep_info(struct acpi_table_fadt *fadt)
acpi_sinfo.pm1b_evt_blk.address);
/* Now FACS... */
- if (fadt->header.revision >= FADT2_REVISION_ID)
- facs_pa = fadt->Xfacs;
- else
+ facs_pa = ((fadt->header.revision >= FADT2_REVISION_ID)
+ ? fadt->Xfacs : (uint64_t)fadt->facs);
+ if (fadt->facs && ((uint64_t)fadt->facs != facs_pa)) {
+ printk(KERN_WARNING PREFIX
+ "32/64X FACS address mismatch in FADT - "
+ "%08x/%016"PRIx64", using 32",
+ fadt->facs, facs_pa);
facs_pa = (uint64_t)fadt->facs;
+ }
facs = (struct acpi_table_facs *)
__acpi_map_table(facs_pa, sizeof(struct acpi_table_facs));