aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlok Kataria <akataria@vmware.com>2008-04-07 14:38:33 -0400
committerIngo Molnar <mingo@elte.hu>2008-04-17 11:41:36 -0400
commit63d38198a0f57dca87e6cb79931c7bedbb7ab069 (patch)
tree8786c3f0be8ee0f80b76cf30a34433ac8425ffd9
parent711554dbc4d5402338ce115dca0df38e9f633330 (diff)
x86: fix paranoia about using BIOS quickboot mechanism.
> > Make sure that we clear the "shutdown status flag" in the CMOS > > register after each CPU is brought up. This fixes a problem where the > > "shutdown status flag" may remain set when a CPU is brought up after > > booting. > > btw., what problem does this result in, exactly? The shutdown status flag set to "0xA", corresponds to "JMP double word request without INT init". This JMP at reboot time is at an unintended location. And results in Triple faults in our case. Though this error at reboot can be safely ignored in a VM environment, am not sure what the effect would be on a physical system. May be it will result in a triple fault and an eventual hardware reset thus masking this BUG in the kernel. This fix just makes sure that we reset that status flag after initialization is done. Fix paranoia about using BIOS quickboot mechanism. Make sure that we clear the "shutdown status flag" in the CMOS register after each CPU is brought up. This fixes a problem where the "shutdown status flag" may remain set when a CPU is brought up after booting. Signed-off-by: Alok N Kataria <akataria@vmware.com> Signed-off-by: Dan Arai <arai@vmware.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--arch/x86/kernel/smpboot.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 21ad3f396a05..4517d1c01eb5 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1001,6 +1001,11 @@ do_rest:
1001 /* mark "stuck" area as not stuck */ 1001 /* mark "stuck" area as not stuck */
1002 *((volatile unsigned long *)trampoline_base) = 0; 1002 *((volatile unsigned long *)trampoline_base) = 0;
1003 1003
1004 /*
1005 * Cleanup possible dangling ends...
1006 */
1007 smpboot_restore_warm_reset_vector();
1008
1004 return boot_error; 1009 return boot_error;
1005} 1010}
1006 1011
@@ -1254,11 +1259,6 @@ void __init native_smp_prepare_boot_cpu(void)
1254 1259
1255void __init native_smp_cpus_done(unsigned int max_cpus) 1260void __init native_smp_cpus_done(unsigned int max_cpus)
1256{ 1261{
1257 /*
1258 * Cleanup possible dangling ends...
1259 */
1260 smpboot_restore_warm_reset_vector();
1261
1262 Dprintk("Boot done.\n"); 1262 Dprintk("Boot done.\n");
1263 1263
1264 impress_friends(); 1264 impress_friends();