Re: [PATCH] Fix paranoia about using BIOS quickboot mechanism.

From: Alok Kataria
Date: Mon Apr 07 2008 - 14:38:57 EST


On Mon, 2008-04-07 at 10:22 +0200, Ingo Molnar wrote:
> * Alok Kataria <akataria@xxxxxxxxxx> wrote:
>
> > 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.

>
> > Tested on the X86 tree.
>
> > + * Cleanup possible dangling ends...
> > + */
> > + smpboot_restore_warm_reset_vector();
> > +
> > return boot_error;
> > }
>
> patch got whitespace damaged - have a look at
> Documentation/email-clients.txt for details about how to send patches as
> in-line text. (or send the patch as an attachment - we accept x86
> patches as attachments too)

Ah...I think i followed the instructions there, will have to look what
went wrong, anyways, will go for the easier solution, here is the patch
attached.

Thanks & Regards,
Alok

>
> Ingo
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@xxxxxxxxxx>
Signed-off-by: Dan Arai <arai@xxxxxxxxxx>

---
arch/x86/kernel/smpboot.c | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 5321e35..0b8bba8 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -1010,6 +1010,11 @@ do_rest:
/* mark "stuck" area as not stuck */
*((volatile unsigned long *)trampoline_base) = 0;

+ /*
+ * Cleanup possible dangling ends...
+ */
+ smpboot_restore_warm_reset_vector();
+
return boot_error;
}

@@ -1263,11 +1268,6 @@ void __init native_smp_prepare_boot_cpu(void)

void __init native_smp_cpus_done(unsigned int max_cpus)
{
- /*
- * Cleanup possible dangling ends...
- */
- smpboot_restore_warm_reset_vector();
-
Dprintk("Boot done.\n");

impress_friends();
--
1.5.4