|
@@ -33,13 +33,13 @@
|
|
|
#include <linux/ratelimit.h>
|
|
|
#include <linux/context_tracking.h>
|
|
|
#include <linux/hugetlb.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
|
|
|
#include <asm/firmware.h>
|
|
|
#include <asm/page.h>
|
|
|
#include <asm/pgtable.h>
|
|
|
#include <asm/mmu.h>
|
|
|
#include <asm/mmu_context.h>
|
|
|
-#include <asm/uaccess.h>
|
|
|
#include <asm/tlbflush.h>
|
|
|
#include <asm/siginfo.h>
|
|
|
#include <asm/debug.h>
|
|
@@ -272,15 +272,16 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
|
|
|
if (!arch_irq_disabled_regs(regs))
|
|
|
local_irq_enable();
|
|
|
|
|
|
- if (in_atomic() || mm == NULL) {
|
|
|
+ if (faulthandler_disabled() || mm == NULL) {
|
|
|
if (!user_mode(regs)) {
|
|
|
rc = SIGSEGV;
|
|
|
goto bail;
|
|
|
}
|
|
|
- /* in_atomic() in user mode is really bad,
|
|
|
+ /* faulthandler_disabled() in user mode is really bad,
|
|
|
as is current->mm == NULL. */
|
|
|
printk(KERN_EMERG "Page fault in user mode with "
|
|
|
- "in_atomic() = %d mm = %p\n", in_atomic(), mm);
|
|
|
+ "faulthandler_disabled() = %d mm = %p\n",
|
|
|
+ faulthandler_disabled(), mm);
|
|
|
printk(KERN_EMERG "NIP = %lx MSR = %lx\n",
|
|
|
regs->nip, regs->msr);
|
|
|
die("Weird page fault", regs, SIGSEGV);
|