[PATCH] BUG preserve registers

From: Hugh Dickins (hugh@veritas.com)
Date: Sat Feb 09 2002 - 03:13:12 EST


It's frustrating that when Verbose BUG() reporting is configured,
info gets lost: fix for i386 below. This is your area, Andrew:
please confirm to Marcelo if you'd like him to apply this.

Example: in hpa's recent prune_dcache crash, %eax showed the length of
the kernel BUG printk, when we'd have liked to see the invalid d_count:
off-by-one or obviously corrupted?

Hugh

--- 2.4.18-pre9/arch/i386/kernel/entry.S Thu Feb 7 14:38:06 2002
+++ linux/arch/i386/kernel/entry.S Fri Feb 8 21:47:39 2002
@@ -132,6 +132,30 @@
         movl $-8192, reg; \
         andl %esp, reg
 
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+BUG_format:
+ .asciz "kernel BUG at %s:%d!\n"
+ENTRY(do_BUG)
+ pushfl # Save flags and registers changed in C
+ pushl %eax
+ pushl %ecx
+ pushl %edx
+ pushl $1
+ call SYMBOL_NAME(bust_spinlocks)
+ movl 28(%esp),%eax
+ movl 24(%esp),%ecx
+ pushl %eax
+ pushl %ecx
+ pushl $BUG_format
+ call SYMBOL_NAME(printk)
+ addl $16,%esp
+ popl %edx # Restore registers and flags for display
+ popl %ecx
+ popl %eax
+ popfl
+ ret
+#endif /* CONFIG_DEBUG_BUGVERBOSE */
+
 ENTRY(lcall7)
         pushfl # We get a different stack layout with call gates,
         pushl %eax # which has to be cleaned up later..
--- 2.4.18-pre9/arch/i386/mm/fault.c Thu Feb 7 14:38:07 2002
+++ linux/arch/i386/mm/fault.c Fri Feb 8 19:06:45 2002
@@ -125,12 +125,6 @@
         }
 }
 
-void do_BUG(const char *file, int line)
-{
- bust_spinlocks(1);
- printk("kernel BUG at %s:%d!\n", file, line);
-}
-
 asmlinkage void do_invalid_op(struct pt_regs *, unsigned long);
 extern unsigned long idt;
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Feb 15 2002 - 21:00:25 EST