diff options
Diffstat (limited to 'arch/x86/kernel/reboot.c')
-rw-r--r-- | arch/x86/kernel/reboot.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index f6be7d5f82f8..06a9f643817e 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
@@ -27,7 +27,7 @@ | |||
27 | void (*pm_power_off)(void); | 27 | void (*pm_power_off)(void); |
28 | EXPORT_SYMBOL(pm_power_off); | 28 | EXPORT_SYMBOL(pm_power_off); |
29 | 29 | ||
30 | static long no_idt[3]; | 30 | static const struct desc_ptr no_idt = {}; |
31 | static int reboot_mode; | 31 | static int reboot_mode; |
32 | enum reboot_type reboot_type = BOOT_KBD; | 32 | enum reboot_type reboot_type = BOOT_KBD; |
33 | int reboot_force; | 33 | int reboot_force; |
@@ -177,6 +177,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { | |||
177 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"), | 177 | DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"), |
178 | }, | 178 | }, |
179 | }, | 179 | }, |
180 | { /* Handle problems with rebooting on Dell T5400's */ | ||
181 | .callback = set_bios_reboot, | ||
182 | .ident = "Dell Precision T5400", | ||
183 | .matches = { | ||
184 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
185 | DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"), | ||
186 | }, | ||
187 | }, | ||
180 | { /* Handle problems with rebooting on HP laptops */ | 188 | { /* Handle problems with rebooting on HP laptops */ |
181 | .callback = set_bios_reboot, | 189 | .callback = set_bios_reboot, |
182 | .ident = "HP Compaq Laptop", | 190 | .ident = "HP Compaq Laptop", |
@@ -201,15 +209,15 @@ core_initcall(reboot_init); | |||
201 | controller to pulse the CPU reset line, which is more thorough, but | 209 | controller to pulse the CPU reset line, which is more thorough, but |
202 | doesn't work with at least one type of 486 motherboard. It is easy | 210 | doesn't work with at least one type of 486 motherboard. It is easy |
203 | to stop this code working; hence the copious comments. */ | 211 | to stop this code working; hence the copious comments. */ |
204 | static unsigned long long | 212 | static const unsigned long long |
205 | real_mode_gdt_entries [3] = | 213 | real_mode_gdt_entries [3] = |
206 | { | 214 | { |
207 | 0x0000000000000000ULL, /* Null descriptor */ | 215 | 0x0000000000000000ULL, /* Null descriptor */ |
208 | 0x00009a000000ffffULL, /* 16-bit real-mode 64k code at 0x00000000 */ | 216 | 0x00009b000000ffffULL, /* 16-bit real-mode 64k code at 0x00000000 */ |
209 | 0x000092000100ffffULL /* 16-bit real-mode 64k data at 0x00000100 */ | 217 | 0x000093000100ffffULL /* 16-bit real-mode 64k data at 0x00000100 */ |
210 | }; | 218 | }; |
211 | 219 | ||
212 | static struct desc_ptr | 220 | static const struct desc_ptr |
213 | real_mode_gdt = { sizeof (real_mode_gdt_entries) - 1, (long)real_mode_gdt_entries }, | 221 | real_mode_gdt = { sizeof (real_mode_gdt_entries) - 1, (long)real_mode_gdt_entries }, |
214 | real_mode_idt = { 0x3ff, 0 }; | 222 | real_mode_idt = { 0x3ff, 0 }; |
215 | 223 | ||
@@ -231,7 +239,7 @@ real_mode_idt = { 0x3ff, 0 }; | |||
231 | 239 | ||
232 | More could be done here to set up the registers as if a CPU reset had | 240 | More could be done here to set up the registers as if a CPU reset had |
233 | occurred; hopefully real BIOSs don't assume much. */ | 241 | occurred; hopefully real BIOSs don't assume much. */ |
234 | static unsigned char real_mode_switch [] = | 242 | static const unsigned char real_mode_switch [] = |
235 | { | 243 | { |
236 | 0x66, 0x0f, 0x20, 0xc0, /* movl %cr0,%eax */ | 244 | 0x66, 0x0f, 0x20, 0xc0, /* movl %cr0,%eax */ |
237 | 0x66, 0x83, 0xe0, 0x11, /* andl $0x00000011,%eax */ | 245 | 0x66, 0x83, 0xe0, 0x11, /* andl $0x00000011,%eax */ |
@@ -245,7 +253,7 @@ static unsigned char real_mode_switch [] = | |||
245 | 0x24, 0x10, /* f: andb $0x10,al */ | 253 | 0x24, 0x10, /* f: andb $0x10,al */ |
246 | 0x66, 0x0f, 0x22, 0xc0 /* movl %eax,%cr0 */ | 254 | 0x66, 0x0f, 0x22, 0xc0 /* movl %eax,%cr0 */ |
247 | }; | 255 | }; |
248 | static unsigned char jump_to_bios [] = | 256 | static const unsigned char jump_to_bios [] = |
249 | { | 257 | { |
250 | 0xea, 0x00, 0x00, 0xff, 0xff /* ljmp $0xffff,$0x0000 */ | 258 | 0xea, 0x00, 0x00, 0xff, 0xff /* ljmp $0xffff,$0x0000 */ |
251 | }; | 259 | }; |
@@ -255,7 +263,7 @@ static unsigned char jump_to_bios [] = | |||
255 | * specified by the code and length parameters. | 263 | * specified by the code and length parameters. |
256 | * We assume that length will aways be less that 100! | 264 | * We assume that length will aways be less that 100! |
257 | */ | 265 | */ |
258 | void machine_real_restart(unsigned char *code, int length) | 266 | void machine_real_restart(const unsigned char *code, int length) |
259 | { | 267 | { |
260 | local_irq_disable(); | 268 | local_irq_disable(); |
261 | 269 | ||
@@ -368,7 +376,7 @@ static void native_machine_emergency_restart(void) | |||
368 | } | 376 | } |
369 | 377 | ||
370 | case BOOT_TRIPLE: | 378 | case BOOT_TRIPLE: |
371 | load_idt((const struct desc_ptr *)&no_idt); | 379 | load_idt(&no_idt); |
372 | __asm__ __volatile__("int3"); | 380 | __asm__ __volatile__("int3"); |
373 | 381 | ||
374 | reboot_type = BOOT_KBD; | 382 | reboot_type = BOOT_KBD; |
@@ -403,24 +411,28 @@ void native_machine_shutdown(void) | |||
403 | { | 411 | { |
404 | /* Stop the cpus and apics */ | 412 | /* Stop the cpus and apics */ |
405 | #ifdef CONFIG_SMP | 413 | #ifdef CONFIG_SMP |
406 | int reboot_cpu_id; | ||
407 | 414 | ||
408 | /* The boot cpu is always logical cpu 0 */ | 415 | /* The boot cpu is always logical cpu 0 */ |
409 | reboot_cpu_id = 0; | 416 | int reboot_cpu_id = 0; |
417 | cpumask_of_cpu_ptr(newmask, reboot_cpu_id); | ||
410 | 418 | ||
411 | #ifdef CONFIG_X86_32 | 419 | #ifdef CONFIG_X86_32 |
412 | /* See if there has been given a command line override */ | 420 | /* See if there has been given a command line override */ |
413 | if ((reboot_cpu != -1) && (reboot_cpu < NR_CPUS) && | 421 | if ((reboot_cpu != -1) && (reboot_cpu < NR_CPUS) && |
414 | cpu_online(reboot_cpu)) | 422 | cpu_online(reboot_cpu)) { |
415 | reboot_cpu_id = reboot_cpu; | 423 | reboot_cpu_id = reboot_cpu; |
424 | cpumask_of_cpu_ptr_next(newmask, reboot_cpu_id); | ||
425 | } | ||
416 | #endif | 426 | #endif |
417 | 427 | ||
418 | /* Make certain the cpu I'm about to reboot on is online */ | 428 | /* Make certain the cpu I'm about to reboot on is online */ |
419 | if (!cpu_online(reboot_cpu_id)) | 429 | if (!cpu_online(reboot_cpu_id)) { |
420 | reboot_cpu_id = smp_processor_id(); | 430 | reboot_cpu_id = smp_processor_id(); |
431 | cpumask_of_cpu_ptr_next(newmask, reboot_cpu_id); | ||
432 | } | ||
421 | 433 | ||
422 | /* Make certain I only run on the appropriate processor */ | 434 | /* Make certain I only run on the appropriate processor */ |
423 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(reboot_cpu_id)); | 435 | set_cpus_allowed_ptr(current, newmask); |
424 | 436 | ||
425 | /* O.K Now that I'm on the appropriate processor, | 437 | /* O.K Now that I'm on the appropriate processor, |
426 | * stop all of the others. | 438 | * stop all of the others. |