diff options
Diffstat (limited to 'arch/x86/kernel/reboot.c')
-rw-r--r-- | arch/x86/kernel/reboot.c | 25 |
1 files changed, 3 insertions, 22 deletions
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 77215c23fba..79c45af8160 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #ifdef CONFIG_X86_32 | 24 | #ifdef CONFIG_X86_32 |
25 | # include <linux/ctype.h> | 25 | # include <linux/ctype.h> |
26 | # include <linux/mc146818rtc.h> | 26 | # include <linux/mc146818rtc.h> |
27 | # include <asm/realmode.h> | ||
27 | #else | 28 | #else |
28 | # include <asm/x86_init.h> | 29 | # include <asm/x86_init.h> |
29 | #endif | 30 | #endif |
@@ -156,15 +157,10 @@ static int __init set_bios_reboot(const struct dmi_system_id *d) | |||
156 | return 0; | 157 | return 0; |
157 | } | 158 | } |
158 | 159 | ||
159 | extern const unsigned char machine_real_restart_asm[]; | ||
160 | extern const u64 machine_real_restart_gdt[3]; | ||
161 | |||
162 | void machine_real_restart(unsigned int type) | 160 | void machine_real_restart(unsigned int type) |
163 | { | 161 | { |
164 | void *restart_va; | 162 | void (*restart_lowmem)(unsigned int) = (void (*)(unsigned int)) |
165 | unsigned long restart_pa; | 163 | real_mode_header->machine_real_restart_asm; |
166 | void (*restart_lowmem)(unsigned int); | ||
167 | u64 *lowmem_gdt; | ||
168 | 164 | ||
169 | local_irq_disable(); | 165 | local_irq_disable(); |
170 | 166 | ||
@@ -195,21 +191,6 @@ void machine_real_restart(unsigned int type) | |||
195 | * too. */ | 191 | * too. */ |
196 | *((unsigned short *)0x472) = reboot_mode; | 192 | *((unsigned short *)0x472) = reboot_mode; |
197 | 193 | ||
198 | /* Patch the GDT in the low memory trampoline */ | ||
199 | lowmem_gdt = TRAMPOLINE_SYM(machine_real_restart_gdt); | ||
200 | |||
201 | restart_va = TRAMPOLINE_SYM(machine_real_restart_asm); | ||
202 | restart_pa = virt_to_phys(restart_va); | ||
203 | restart_lowmem = (void (*)(unsigned int))restart_pa; | ||
204 | |||
205 | /* GDT[0]: GDT self-pointer */ | ||
206 | lowmem_gdt[0] = | ||
207 | (u64)(sizeof(machine_real_restart_gdt) - 1) + | ||
208 | ((u64)virt_to_phys(lowmem_gdt) << 16); | ||
209 | /* GDT[1]: 64K real mode code segment */ | ||
210 | lowmem_gdt[1] = | ||
211 | GDT_ENTRY(0x009b, restart_pa, 0xffff); | ||
212 | |||
213 | /* Jump to the identity-mapped low memory code */ | 194 | /* Jump to the identity-mapped low memory code */ |
214 | restart_lowmem(type); | 195 | restart_lowmem(type); |
215 | } | 196 | } |