diff options
Diffstat (limited to 'arch/arm64/mm/fault.c')
-rw-r--r-- | arch/arm64/mm/fault.c | 17 |
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, |