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 ---