aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/mm/fault.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/mm/fault.c')
-rw-r--r--arch/arm64/mm/fault.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 0bb7db41f4fe..6d6acf153bff 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -199,13 +199,6 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
199 unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC; 199 unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
200 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 200 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
201 201
202 if (esr & ESR_LNX_EXEC) {
203 vm_flags = VM_EXEC;
204 } else if ((esr & ESR_WRITE) && !(esr & ESR_CM)) {
205 vm_flags = VM_WRITE;
206 mm_flags |= FAULT_FLAG_WRITE;
207 }
208
209 tsk = current; 202 tsk = current;
210 mm = tsk->mm; 203 mm = tsk->mm;
211 204
@@ -220,6 +213,16 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
220 if (in_atomic() || !mm) 213 if (in_atomic() || !mm)
221 goto no_context; 214 goto no_context;
222 215
216 if (user_mode(regs))
217 mm_flags |= FAULT_FLAG_USER;
218
219 if (esr & ESR_LNX_EXEC) {
220 vm_flags = VM_EXEC;
221 } else if ((esr & ESR_WRITE) && !(esr & ESR_CM)) {
222 vm_flags = VM_WRITE;
223 mm_flags |= FAULT_FLAG_WRITE;
224 }
225
223 /* 226 /*
224 * As per x86, we may deadlock here. However, since the kernel only 227 * As per x86, we may deadlock here. However, since the kernel only
225 * validly references user space from well defined areas of the code, 228 * validly references user space from well defined areas of the code,