diff --git a/arch/i386/mm/fault.c b/arch/i386/mm/fault.c index 01ffdd4..c405802 100644 --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -47,14 +47,15 @@ int unregister_page_fault_notifier(struct notifier_block *nb) } EXPORT_SYMBOL_GPL(unregister_page_fault_notifier); -static inline int notify_page_fault(struct pt_regs *regs, long err) +static inline int notify_page_fault(struct pt_regs *regs, long err, unsigned long address) { struct die_args args = { .regs = regs, .str = "page fault", .err = err, .trapnr = 14, - .signr = SIGSEGV + .signr = SIGSEGV, + .address = address }; return atomic_notifier_call_chain(¬ify_page_fault_chain, DIE_PAGE_FAULT, &args); @@ -330,7 +331,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs, if (unlikely(address >= TASK_SIZE)) { if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0) return; - if (notify_page_fault(regs, error_code) == NOTIFY_STOP) + if (notify_page_fault(regs, error_code, address) == NOTIFY_STOP) return; /* * Don't take the mm semaphore here. If we fixup a prefetch @@ -339,7 +340,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs, goto bad_area_nosemaphore; } - if (notify_page_fault(regs, error_code) == NOTIFY_STOP) + if (notify_page_fault(regs, error_code, address) == NOTIFY_STOP) return; /* It's safe to allow irq's after cr2 has been saved and the vmalloc diff --git a/include/linux/kdebug.h b/include/linux/kdebug.h index 5db38d6..e8005c2 100644 --- a/include/linux/kdebug.h +++ b/include/linux/kdebug.h @@ -9,6 +9,7 @@ struct die_args { long err; int trapnr; int signr; + unsigned long address; }; int register_die_notifier(struct notifier_block *nb);