Page faults during kernel initialization can be hard to diagnose.
Add a handler that prints the fault address, EIP and top of stack
when an early page fault happens.
Signed-off-by: Chuck Ebbert <[email protected]>
arch/i386/kernel/head.S | 37 +++++++++++++++++++++++++++++++++++++
1 files changed, 37 insertions(+)
--- 2.6.17-nb.orig/arch/i386/kernel/head.S
+++ 2.6.17-nb/arch/i386/kernel/head.S
@@ -378,8 +378,41 @@ rp_sidt:
addl $8,%edi
dec %ecx
jne rp_sidt
+
+ lea page_fault,%edi /* early page fault handler */
+ movw %di,%ax
+ andl $0x0000ffff,%edx
+ andl $0xffff0000,%edi
+ orl %edi,%edx
+ lea idt_table,%edi
+ movl %eax,8*14(%edi)
+ movl %edx,8*14+4(%edi)
+
ret
+/* This is the early page fault handler */
+ ALIGN
+page_fault:
+ cld
+#ifdef CONFIG_PRINTK
+ movl $(__KERNEL_DS),%eax
+ movl %eax,%ds
+ movl %eax,%es
+ movl %cr2,%eax
+ pushl %eax
+ pushl $pf_msg
+#ifdef CONFIG_EARLY_PRINTK
+ call early_printk
+#else
+ call printk
+#endif
+#endif
+hlt_loop:
+ hlt
+1:
+ rep ; nop
+ jmp 1b
+
/* This is the default interrupt "handler" :-) */
ALIGN
ignore_int:
@@ -441,6 +474,10 @@ ready: .byte 0
int_msg:
.asciz "Unknown interrupt or fault at EIP %p %p %p\n"
+pf_msg:
+ .ascii "Pg flt: CR2 %p err %p EIP %p CS %p flags %p\n"
+ .asciz " Stk: %p %p %p %p %p %p %p %p\n"
+
/*
* The IDT and GDT 'descriptors' are a strange 48-bit object
* only used by the lidt and lgdt instructions. They are not
--
Chuck
"You can't read a newspaper if you can't read." --George W. Bush
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]