Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3dab307e527f2a9bbb4f9d00240374bb93d1945f
Commit:     3dab307e527f2a9bbb4f9d00240374bb93d1945f
Parent:     5fe4486c79cdc8dbbb2a9c3f884a5ad0830a5a23
Author:     Chuck Ebbert <[EMAIL PROTECTED]>
AuthorDate: Fri Aug 10 22:31:11 2007 +0200
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Sat Aug 11 15:58:14 2007 -0700

    i386: Fix double fault handler
    
    The new percpu code has apparently broken the doublefault handler
    when CONFIG_DEBUG_SPINLOCK is set. Doublefault is handled by
    a hardware task, making the check
    
            SPIN_BUG_ON(lock->owner == current, lock, "recursion");
    
    fault because it uses the FS register to access the percpu data
    for current, and that register is zero in the new TSS. (The trace
    I saw was on 2.6.20 where it was GS, but it looks like this will
    still happen with FS on 2.6.22.)
    
    Initializing FS in the doublefault_tss should fix it.
    
    AK: Also fix broken ptr_ok() and turn printks into KERN_EMERG
    AK: And add a PANIC prefix to make clear the system will hang
    AK: (e.g. x86-64 will recover)
    
    Signed-off-by: Chuck Ebbert <[EMAIL PROTECTED]>
    Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 arch/i386/kernel/doublefault.c |   13 +++++++------
 1 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/arch/i386/kernel/doublefault.c b/arch/i386/kernel/doublefault.c
index 265c559..40978af 100644
--- a/arch/i386/kernel/doublefault.c
+++ b/arch/i386/kernel/doublefault.c
@@ -13,7 +13,7 @@
 static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];
 #define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)
 
-#define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + 0x1000000)
+#define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + MAXMEM)
 
 static void doublefault_fn(void)
 {
@@ -23,23 +23,23 @@ static void doublefault_fn(void)
        store_gdt(&gdt_desc);
        gdt = gdt_desc.address;
 
-       printk("double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size);
+       printk(KERN_EMERG "PANIC: double fault, gdt at %08lx [%d bytes]\n", 
gdt, gdt_desc.size);
 
        if (ptr_ok(gdt)) {
                gdt += GDT_ENTRY_TSS << 3;
                tss = *(u16 *)(gdt+2);
                tss += *(u8 *)(gdt+4) << 16;
                tss += *(u8 *)(gdt+7) << 24;
-               printk("double fault, tss at %08lx\n", tss);
+               printk(KERN_EMERG "double fault, tss at %08lx\n", tss);
 
                if (ptr_ok(tss)) {
                        struct i386_hw_tss *t = (struct i386_hw_tss *)tss;
 
-                       printk("eip = %08lx, esp = %08lx\n", t->eip, t->esp);
+                       printk(KERN_EMERG "eip = %08lx, esp = %08lx\n", t->eip, 
t->esp);
 
-                       printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = 
%08lx\n",
+                       printk(KERN_EMERG "eax = %08lx, ebx = %08lx, ecx = 
%08lx, edx = %08lx\n",
                                t->eax, t->ebx, t->ecx, t->edx);
-                       printk("esi = %08lx, edi = %08lx\n",
+                       printk(KERN_EMERG "esi = %08lx, edi = %08lx\n",
                                t->esi, t->edi);
                }
        }
@@ -63,6 +63,7 @@ struct tss_struct doublefault_tss __cacheline_aligned = {
                .cs             = __KERNEL_CS,
                .ss             = __KERNEL_DS,
                .ds             = __USER_DS,
+               .fs             = __KERNEL_PERCPU,
 
                .__cr3          = __pa(swapper_pg_dir)
        }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to