fault.c (9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e) | fault.c (a050ba1e7422f2cc60ff8bfde3f96d34d00cb585) |
---|---|
1/* 2 * Copyright (C) 2009 Wind River Systems Inc 3 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com 4 * 5 * based on arch/mips/mm/fault.c which is: 6 * 7 * Copyright (C) 1995-2000 Ralf Baechle 8 * --- 72 unchanged lines hidden (view full) --- 81 if (faulthandler_disabled() || !mm) 82 goto bad_area_nosemaphore; 83 84 if (user_mode(regs)) 85 flags |= FAULT_FLAG_USER; 86 87 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 88 | 1/* 2 * Copyright (C) 2009 Wind River Systems Inc 3 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com 4 * 5 * based on arch/mips/mm/fault.c which is: 6 * 7 * Copyright (C) 1995-2000 Ralf Baechle 8 * --- 72 unchanged lines hidden (view full) --- 81 if (faulthandler_disabled() || !mm) 82 goto bad_area_nosemaphore; 83 84 if (user_mode(regs)) 85 flags |= FAULT_FLAG_USER; 86 87 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 88 |
89 if (!mmap_read_trylock(mm)) { 90 if (!user_mode(regs) && !search_exception_tables(regs->ea)) 91 goto bad_area_nosemaphore; | |
92retry: | 89retry: |
93 mmap_read_lock(mm); 94 } 95 96 vma = find_vma(mm, address); | 90 vma = lock_mm_and_find_vma(mm, address, regs); |
97 if (!vma) | 91 if (!vma) |
98 goto bad_area; 99 if (vma->vm_start <= address) 100 goto good_area; 101 if (!(vma->vm_flags & VM_GROWSDOWN)) 102 goto bad_area; 103 if (expand_stack(vma, address)) 104 goto bad_area; | 92 goto bad_area_nosemaphore; |
105/* 106 * Ok, we have a good vm_area for this memory access, so 107 * we can handle it.. 108 */ | 93/* 94 * Ok, we have a good vm_area for this memory access, so 95 * we can handle it.. 96 */ |
109good_area: | |
110 code = SEGV_ACCERR; 111 112 switch (cause) { 113 case EXC_SUPERV_INSN_ACCESS: 114 goto bad_area; 115 case EXC_SUPERV_DATA_ACCESS: 116 goto bad_area; 117 case EXC_X_PROTECTION_FAULT: --- 160 unchanged lines hidden --- | 97 code = SEGV_ACCERR; 98 99 switch (cause) { 100 case EXC_SUPERV_INSN_ACCESS: 101 goto bad_area; 102 case EXC_SUPERV_DATA_ACCESS: 103 goto bad_area; 104 case EXC_X_PROTECTION_FAULT: --- 160 unchanged lines hidden --- |