Both the 32bit and 64bit waking vector will be set for the ACPI 2.0 FACS. The waking vector will also be set when the system enters the S4. Signed-off-by: Zhao Yakui --- arch/x86/kernel/acpi/sleep.c | 2 ++ drivers/acpi/hardware/hwsleep.c | 14 +++++++------- drivers/acpi/sleep/main.c | 3 ++- 3 files changed, 11 insertions(+), 8 deletions(-) Index: linux-2.6/drivers/acpi/hardware/hwsleep.c =================================================================== --- linux-2.6.orig/drivers/acpi/hardware/hwsleep.c +++ linux-2.6/drivers/acpi/hardware/hwsleep.c @@ -80,14 +80,14 @@ acpi_set_firmware_waking_vector(acpi_phy /* Set the vector */ - if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) { - /* - * ACPI 1.0 FACS or short table or optional X_ field is zero - */ - facs->firmware_waking_vector = (u32) physical_address; - } else { + /* 32 Bit wakeing vector is always set */ + facs->firmware_waking_vector = (u32) physical_address; + + if (facs->length >= 32) { /* - * ACPI 2.0 FACS with valid X_ field + * ACPI 2.0 FACS with the valid X_filed. Its length + * will be more than 32 bytes. In such case the 64 bit + * waking vector is also set. */ facs->xfirmware_waking_vector = physical_address; } Index: linux-2.6/drivers/acpi/sleep/main.c =================================================================== --- linux-2.6.orig/drivers/acpi/sleep/main.c +++ linux-2.6/drivers/acpi/sleep/main.c @@ -28,7 +28,8 @@ static int acpi_sleep_prepare(u32 acpi_s { #ifdef CONFIG_ACPI_SLEEP /* do we have a wakeup address for S2 and S3? */ - if (acpi_state == ACPI_STATE_S3) { + if ((acpi_state == ACPI_STATE_S3) || + (acpi_state == ACPI_STATE_S4)) { if (!acpi_wakeup_address) { return -EFAULT; } Index: linux-2.6/arch/x86/kernel/acpi/sleep.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/acpi/sleep.c +++ linux-2.6/arch/x86/kernel/acpi/sleep.c @@ -138,6 +138,8 @@ void __init acpi_reserve_bootmem(void) } acpi_wakeup_address = virt_to_phys((void *)acpi_realmode); + printk(KERN_DEBUG "acpi_wakeup_address is %p \n", + (void *)(acpi_wakeup_address)); }