vm_fault.c (9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e) | vm_fault.c (a050ba1e7422f2cc60ff8bfde3f96d34d00cb585) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Memory fault handling for Hexagon 4 * 5 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 6 */ 7 8/* --- 43 unchanged lines hidden (view full) --- 52 53 local_irq_enable(); 54 55 if (user_mode(regs)) 56 flags |= FAULT_FLAG_USER; 57 58 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 59retry: | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Memory fault handling for Hexagon 4 * 5 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 6 */ 7 8/* --- 43 unchanged lines hidden (view full) --- 52 53 local_irq_enable(); 54 55 if (user_mode(regs)) 56 flags |= FAULT_FLAG_USER; 57 58 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 59retry: |
60 mmap_read_lock(mm); 61 vma = find_vma(mm, address); 62 if (!vma) 63 goto bad_area; | 60 vma = lock_mm_and_find_vma(mm, address, regs); 61 if (unlikely(!vma)) 62 goto bad_area_nosemaphore; |
64 | 63 |
65 if (vma->vm_start <= address) 66 goto good_area; 67 68 if (!(vma->vm_flags & VM_GROWSDOWN)) 69 goto bad_area; 70 71 if (expand_stack(vma, address)) 72 goto bad_area; 73 74good_area: | |
75 /* Address space is OK. Now check access rights. */ 76 si_code = SEGV_ACCERR; 77 78 switch (cause) { 79 case FLT_IFETCH: 80 if (!(vma->vm_flags & VM_EXEC)) 81 goto bad_area; 82 break; --- 55 unchanged lines hidden (view full) --- 138 si_code = SEGV_ACCERR; 139 } 140 force_sig_fault(si_signo, si_code, (void __user *)address); 141 return; 142 143bad_area: 144 mmap_read_unlock(mm); 145 | 64 /* Address space is OK. Now check access rights. */ 65 si_code = SEGV_ACCERR; 66 67 switch (cause) { 68 case FLT_IFETCH: 69 if (!(vma->vm_flags & VM_EXEC)) 70 goto bad_area; 71 break; --- 55 unchanged lines hidden (view full) --- 127 si_code = SEGV_ACCERR; 128 } 129 force_sig_fault(si_signo, si_code, (void __user *)address); 130 return; 131 132bad_area: 133 mmap_read_unlock(mm); 134 |
135bad_area_nosemaphore: |
|
146 if (user_mode(regs)) { 147 force_sig_fault(SIGSEGV, si_code, (void __user *)address); 148 return; 149 } 150 /* Kernel-mode fault falls through */ 151 152no_context: 153 fixup = search_exception_tables(pt_elr(regs)); --- 33 unchanged lines hidden --- | 136 if (user_mode(regs)) { 137 force_sig_fault(SIGSEGV, si_code, (void __user *)address); 138 return; 139 } 140 /* Kernel-mode fault falls through */ 141 142no_context: 143 fixup = search_exception_tables(pt_elr(regs)); --- 33 unchanged lines hidden --- |