|
@@ -30,6 +30,7 @@
|
|
|
#include <linux/kprobes.h>
|
|
|
#include <linux/kdebug.h>
|
|
|
#include <linux/perf_event.h>
|
|
|
+#include <linux/magic.h>
|
|
|
|
|
|
#include <asm/firmware.h>
|
|
|
#include <asm/page.h>
|
|
@@ -385,6 +386,7 @@ do_sigbus:
|
|
|
void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
|
|
{
|
|
|
const struct exception_table_entry *entry;
|
|
|
+ unsigned long *stackend;
|
|
|
|
|
|
/* Are we prepared to handle this fault? */
|
|
|
if ((entry = search_exception_tables(regs->nip)) != NULL) {
|
|
@@ -413,5 +415,9 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
|
|
|
printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
|
|
|
regs->nip);
|
|
|
|
|
|
+ stackend = end_of_stack(current);
|
|
|
+ if (current != &init_task && *stackend != STACK_END_MAGIC)
|
|
|
+ printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
|
|
|
+
|
|
|
die("Kernel access of bad area", regs, sig);
|
|
|
}
|