aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel/trap_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/kernel/trap_kern.c')
-rw-r--r--arch/um/kernel/trap_kern.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/um/kernel/trap_kern.c b/arch/um/kernel/trap_kern.c
index 87cc6fd76ced..90690b9b1f30 100644
--- a/arch/um/kernel/trap_kern.c
+++ b/arch/um/kernel/trap_kern.c
@@ -18,6 +18,7 @@
18#include "asm/a.out.h" 18#include "asm/a.out.h"
19#include "asm/current.h" 19#include "asm/current.h"
20#include "asm/irq.h" 20#include "asm/irq.h"
21#include "sysdep/sigcontext.h"
21#include "user_util.h" 22#include "user_util.h"
22#include "kern_util.h" 23#include "kern_util.h"
23#include "kern.h" 24#include "kern.h"
@@ -125,7 +126,15 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc)
125 } 126 }
126 else if(current->mm == NULL) 127 else if(current->mm == NULL)
127 panic("Segfault with no mm"); 128 panic("Segfault with no mm");
128 err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); 129
130 if (SEGV_IS_FIXABLE(&fi))
131 err = handle_page_fault(address, ip, is_write, is_user, &si.si_code);
132 else {
133 err = -EFAULT;
134 /* A thread accessed NULL, we get a fault, but CR2 is invalid.
135 * This code is used in __do_copy_from_user() of TT mode. */
136 address = 0;
137 }
129 138
130 catcher = current->thread.fault_catcher; 139 catcher = current->thread.fault_catcher;
131 if(!err) 140 if(!err)