diff options
Diffstat (limited to 'arch/x86/kernel/acpi/sleep.c')
| -rw-r--r-- | arch/x86/kernel/acpi/sleep.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index afc25ee9964b..36af01f029ed 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -50,6 +50,20 @@ int acpi_save_state_mem(void) | |||
| 50 | 50 | ||
| 51 | header->video_mode = saved_video_mode; | 51 | header->video_mode = saved_video_mode; |
| 52 | 52 | ||
| 53 | header->wakeup_jmp_seg = acpi_wakeup_address >> 4; | ||
| 54 | /* GDT[0]: GDT self-pointer */ | ||
| 55 | header->wakeup_gdt[0] = | ||
| 56 | (u64)(sizeof(header->wakeup_gdt) - 1) + | ||
| 57 | ((u64)(acpi_wakeup_address + | ||
| 58 | ((char *)&header->wakeup_gdt - (char *)acpi_realmode)) | ||
| 59 | << 16); | ||
| 60 | /* GDT[1]: real-mode-like code segment */ | ||
| 61 | header->wakeup_gdt[1] = (0x009bULL << 40) + | ||
| 62 | ((u64)acpi_wakeup_address << 16) + 0xffff; | ||
| 63 | /* GDT[2]: real-mode-like data segment */ | ||
| 64 | header->wakeup_gdt[2] = (0x0093ULL << 40) + | ||
| 65 | ((u64)acpi_wakeup_address << 16) + 0xffff; | ||
| 66 | |||
| 53 | #ifndef CONFIG_64BIT | 67 | #ifndef CONFIG_64BIT |
| 54 | store_gdt((struct desc_ptr *)&header->pmode_gdt); | 68 | store_gdt((struct desc_ptr *)&header->pmode_gdt); |
| 55 | 69 | ||
| @@ -111,7 +125,7 @@ void __init acpi_reserve_bootmem(void) | |||
| 111 | return; | 125 | return; |
| 112 | } | 126 | } |
| 113 | 127 | ||
| 114 | acpi_wakeup_address = acpi_realmode; | 128 | acpi_wakeup_address = virt_to_phys((void *)acpi_realmode); |
| 115 | } | 129 | } |
| 116 | 130 | ||
| 117 | 131 | ||
