diff options
author | Pekka Enberg <penberg@kernel.org> | 2020-08-25 18:41:17 +0200 |
---|---|---|
committer | Palmer Dabbelt <palmerdabbelt@google.com> | 2020-09-16 03:46:05 +0200 |
commit | afb8c6fee8ce9b54b9c810eea0597ef6a876abb7 (patch) | |
tree | b7b31318e373878e66f1324e7a00a275769adece /arch/riscv | |
parent | riscv/mm/fault: Move FAULT_FLAG_WRITE handling in do_page_fault() (diff) | |
download | linux-afb8c6fee8ce9b54b9c810eea0597ef6a876abb7.tar.xz linux-afb8c6fee8ce9b54b9c810eea0597ef6a876abb7.zip |
riscv/mm/fault: Move access error check to function
Move the access error check into a access_error() function to simplify
the control flow in do_page_fault().
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
Diffstat (limited to 'arch/riscv')
-rw-r--r-- | arch/riscv/mm/fault.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c index bdc70d3d507f..a23eaf5ce95c 100644 --- a/arch/riscv/mm/fault.c +++ b/arch/riscv/mm/fault.c @@ -156,6 +156,30 @@ static void inline vmalloc_fault(struct pt_regs *regs, int code, unsigned long a local_flush_tlb_page(addr); } +static inline bool access_error(unsigned long cause, struct vm_area_struct *vma) +{ + switch (cause) { + case EXC_INST_PAGE_FAULT: + if (!(vma->vm_flags & VM_EXEC)) { + return true; + } + break; + case EXC_LOAD_PAGE_FAULT: + if (!(vma->vm_flags & VM_READ)) { + return true; + } + break; + case EXC_STORE_PAGE_FAULT: + if (!(vma->vm_flags & VM_WRITE)) { + return true; + } + break; + default: + panic("%s: unhandled cause %lu", __func__, cause); + } + return false; +} + /* * This routine handles page faults. It determines the address and the * problem, and then passes it off to one of the appropriate routines. @@ -236,27 +260,9 @@ retry: good_area: code = SEGV_ACCERR; - switch (cause) { - case EXC_INST_PAGE_FAULT: - if (!(vma->vm_flags & VM_EXEC)) { - bad_area(regs, mm, code, addr); - return; - } - break; - case EXC_LOAD_PAGE_FAULT: - if (!(vma->vm_flags & VM_READ)) { - bad_area(regs, mm, code, addr); - return; - } - break; - case EXC_STORE_PAGE_FAULT: - if (!(vma->vm_flags & VM_WRITE)) { - bad_area(regs, mm, code, addr); - return; - } - break; - default: - panic("%s: unhandled cause %lu", __func__, cause); + if (unlikely(access_error(cause, vma))) { + bad_area(regs, mm, code, addr); + return; } /* |