]> xenbits.xensource.com Git - xen.git/commitdiff
x86: Fix FADT parsing for PM event blocks.
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 1 May 2008 12:16:32 +0000 (13:16 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 1 May 2008 12:16:32 +0000 (13:16 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
xen/arch/x86/acpi/boot.c

index 28f3595fa907f11e07fb4e26699edc410bac7e4d..a9c013e8eb5a161d2e97a4568f19b6403614c7a6 100644 (file)
@@ -465,15 +465,18 @@ bad:
 static void __init
 acpi_fadt_parse_reg(struct acpi_table_fadt *fadt)
 {
-       memcpy(&acpi_gbl_FADT, fadt, sizeof(acpi_gbl_FADT));
+       unsigned int len = min(fadt->header.length, sizeof(*fadt));
 
-       memcpy(&acpi_gbl_xpm1a_enable, &(fadt->xpm1a_event_block),
-               sizeof(acpi_gbl_xpm1a_enable));
-       memcpy(&acpi_gbl_xpm1b_enable, &(fadt->xpm1b_event_block),
-               sizeof(acpi_gbl_xpm1b_enable));
+       memcpy(&acpi_gbl_FADT, fadt, len);
 
-       acpi_gbl_xpm1a_enable.address += 2;
-       acpi_gbl_xpm1b_enable.address += 2;
+       if (len > offsetof(struct acpi_table_fadt, xpm1b_event_block)) {
+               memcpy(&acpi_gbl_xpm1a_enable, &fadt->xpm1a_event_block,
+                      sizeof(acpi_gbl_xpm1a_enable));
+               memcpy(&acpi_gbl_xpm1b_enable, &fadt->xpm1b_event_block,
+                      sizeof(acpi_gbl_xpm1b_enable));
+               acpi_gbl_xpm1a_enable.address += 2;
+               acpi_gbl_xpm1b_enable.address += 2;
+       }
 }
 
 static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
@@ -523,12 +526,12 @@ static int __init acpi_parse_fadt(unsigned long phys, unsigned long size)
        acpi_enable_value  = fadt->acpi_enable;
        acpi_disable_value = fadt->acpi_disable;
 
+       acpi_fadt_parse_reg(fadt);
+
 #ifdef CONFIG_ACPI_SLEEP
        acpi_fadt_parse_sleep_info(fadt);
 #endif
 
-       acpi_fadt_parse_reg(fadt);
-
        return 0;
 }