4 * Copyright (C) 2000-2010 Axis Communications AB
8 #include <linux/interrupt.h>
9 #include <linux/extable.h>
10 #include <linux/wait.h>
11 #include <linux/sched/signal.h>
12 #include <linux/uaccess.h>
13 #include <arch/system.h>
15 extern int find_fixup_code(struct pt_regs
*);
16 extern void die_if_kernel(const char *, struct pt_regs
*, long);
17 extern void show_registers(struct pt_regs
*regs
);
19 /* debug of low-level TLB reload */
28 /* debug of higher-level faults */
31 /* current active page directory */
33 DEFINE_PER_CPU(pgd_t
*, current_pgd
);
34 unsigned long cris_signal_return_page
;
37 * This routine handles page faults. It determines the address,
38 * and the problem, and then passes it off to one of the appropriate
41 * Notice that the address we're given is aligned to the page the fault
42 * occurred in, since we only get the PFN in R_MMU_CAUSE not the complete
46 * bit 0 == 0 means no page found, 1 means protection fault
47 * bit 1 == 0 means read, 1 means write
49 * If this routine detects a bad access, it returns 1, otherwise it
54 do_page_fault(unsigned long address
, struct pt_regs
*regs
,
55 int protection
, int writeaccess
)
57 struct task_struct
*tsk
;
59 struct vm_area_struct
* vma
;
62 unsigned int flags
= FAULT_FLAG_ALLOW_RETRY
| FAULT_FLAG_KILLABLE
;
65 "Page fault for %lX on %X at %lX, prot %d write %d\n",
66 address
, smp_processor_id(), instruction_pointer(regs
),
67 protection
, writeaccess
));
72 * We fault-in kernel-space virtual memory on-demand. The
73 * 'reference' page table is init_mm.pgd.
75 * NOTE! We MUST NOT take any locks for this case. We may
76 * be in an interrupt or a critical region, and should
77 * only copy the information from the master page table,
80 * NOTE2: This is done so that, when updating the vmalloc
81 * mappings we don't have to walk all processes pgdirs and
82 * add the high mappings all at once. Instead we do it as they
83 * are used. However vmalloc'ed page entries have the PAGE_GLOBAL
84 * bit set so sometimes the TLB can use a lingering entry.
86 * This verifies that the fault happens in kernel space
87 * and that the fault was not a protection error (error_code & 1).
90 if (address
>= VMALLOC_START
&&
95 /* When stack execution is not allowed we store the signal
96 * trampolines in the reserved cris_signal_return_page.
97 * Handle this in the exact same way as vmalloc (we know
98 * that the mapping is there and is valid so no need to
99 * call handle_mm_fault).
101 if (cris_signal_return_page
&&
102 address
== cris_signal_return_page
&&
103 !protection
&& user_mode(regs
))
106 /* we can and should enable interrupts at this point */
110 info
.si_code
= SEGV_MAPERR
;
113 * If we're in an interrupt, have pagefaults disabled or have no
114 * user context, we must not take the fault.
117 if (faulthandler_disabled() || !mm
)
121 flags
|= FAULT_FLAG_USER
;
123 down_read(&mm
->mmap_sem
);
124 vma
= find_vma(mm
, address
);
127 if (vma
->vm_start
<= address
)
129 if (!(vma
->vm_flags
& VM_GROWSDOWN
))
131 if (user_mode(regs
)) {
133 * accessing the stack below usp is always a bug.
134 * we get page-aligned addresses so we can only check
135 * if we're within a page from usp, but that might be
136 * enough to catch brutal errors at least.
138 if (address
+ PAGE_SIZE
< rdusp())
141 if (expand_stack(vma
, address
))
145 * Ok, we have a good vm_area for this memory access, so
150 info
.si_code
= SEGV_ACCERR
;
152 /* first do some preliminary protection checks */
154 if (writeaccess
== 2){
155 if (!(vma
->vm_flags
& VM_EXEC
))
157 } else if (writeaccess
== 1) {
158 if (!(vma
->vm_flags
& VM_WRITE
))
160 flags
|= FAULT_FLAG_WRITE
;
162 if (!(vma
->vm_flags
& (VM_READ
| VM_EXEC
)))
167 * If for any reason at all we couldn't handle the fault,
168 * make sure we exit gracefully rather than endlessly redo
172 fault
= handle_mm_fault(vma
, address
, flags
);
174 if ((fault
& VM_FAULT_RETRY
) && fatal_signal_pending(current
))
177 if (unlikely(fault
& VM_FAULT_ERROR
)) {
178 if (fault
& VM_FAULT_OOM
)
180 else if (fault
& VM_FAULT_SIGSEGV
)
182 else if (fault
& VM_FAULT_SIGBUS
)
187 if (flags
& FAULT_FLAG_ALLOW_RETRY
) {
188 if (fault
& VM_FAULT_MAJOR
)
192 if (fault
& VM_FAULT_RETRY
) {
193 flags
&= ~FAULT_FLAG_ALLOW_RETRY
;
194 flags
|= FAULT_FLAG_TRIED
;
197 * No need to up_read(&mm->mmap_sem) as we would
198 * have already released it in __lock_page_or_retry
206 up_read(&mm
->mmap_sem
);
210 * Something tried to access memory that isn't in our memory map..
211 * Fix it, but check if it's kernel or user first..
215 up_read(&mm
->mmap_sem
);
217 bad_area_nosemaphore
:
218 DPG(show_registers(regs
));
220 /* User mode accesses just cause a SIGSEGV */
222 if (user_mode(regs
)) {
223 #ifdef CONFIG_NO_SEGFAULT_TERMINATION
224 DECLARE_WAIT_QUEUE_HEAD(wq
);
226 printk(KERN_NOTICE
"%s (pid %d) segfaults for page "
227 "address %08lx at pc %08lx\n",
229 address
, instruction_pointer(regs
));
231 /* With DPG on, we've already dumped registers above. */
233 show_registers(regs
);
235 #ifdef CONFIG_NO_SEGFAULT_TERMINATION
236 wait_event_interruptible(wq
, 0 == 1);
238 info
.si_signo
= SIGSEGV
;
240 /* info.si_code has been set above */
241 info
.si_addr
= (void *)address
;
242 force_sig_info(SIGSEGV
, &info
, tsk
);
249 /* Are we prepared to handle this kernel fault?
251 * (The kernel has valid exception-points in the source
252 * when it accesses user-memory. When it fails in one
253 * of those points, we find it in a table and do a jump
254 * to some fixup code that loads an appropriate error
258 if (find_fixup_code(regs
))
262 * Oops. The kernel tried to access some bad page. We'll have to
263 * terminate things with extreme prejudice.
266 if (!oops_in_progress
) {
267 oops_in_progress
= 1;
268 if ((unsigned long) (address
) < PAGE_SIZE
)
269 printk(KERN_ALERT
"Unable to handle kernel NULL "
270 "pointer dereference");
272 printk(KERN_ALERT
"Unable to handle kernel access"
273 " at virtual address %08lx\n", address
);
275 die_if_kernel("Oops", regs
, (writeaccess
<< 1) | protection
);
276 oops_in_progress
= 0;
282 * We ran out of memory, or some other thing happened to us that made
283 * us unable to handle the page fault gracefully.
287 up_read(&mm
->mmap_sem
);
288 if (!user_mode(regs
))
290 pagefault_out_of_memory();
294 up_read(&mm
->mmap_sem
);
297 * Send a sigbus, regardless of whether we were in kernel
300 info
.si_signo
= SIGBUS
;
302 info
.si_code
= BUS_ADRERR
;
303 info
.si_addr
= (void *)address
;
304 force_sig_info(SIGBUS
, &info
, tsk
);
306 /* Kernel mode? Handle exceptions or die */
307 if (!user_mode(regs
))
314 * Synchronize this task's top level page-table
315 * with the 'reference' page table.
317 * Use current_pgd instead of tsk->active_mm->pgd
318 * since the latter might be unavailable if this
319 * code is executed in a misfortunately run irq
320 * (like inside schedule() between switch_mm and
324 int offset
= pgd_index(address
);
330 pgd
= (pgd_t
*)per_cpu(current_pgd
, smp_processor_id()) + offset
;
331 pgd_k
= init_mm
.pgd
+ offset
;
333 /* Since we're two-level, we don't need to do both
334 * set_pgd and set_pmd (they do the same thing). If
335 * we go three-level at some point, do the right thing
336 * with pgd_present and set_pgd here.
338 * Also, since the vmalloc area is global, we don't
339 * need to copy individual PTE's, it is enough to
340 * copy the pgd pointer into the pte page of the
341 * root task. If that is there, we'll find our pte if
345 pud
= pud_offset(pgd
, address
);
346 pud_k
= pud_offset(pgd_k
, address
);
347 if (!pud_present(*pud_k
))
350 pmd
= pmd_offset(pud
, address
);
351 pmd_k
= pmd_offset(pud_k
, address
);
353 if (!pmd_present(*pmd_k
))
354 goto bad_area_nosemaphore
;
356 set_pmd(pmd
, *pmd_k
);
358 /* Make sure the actual PTE exists as well to
359 * catch kernel vmalloc-area accesses to non-mapped
360 * addresses. If we don't do this, this will just
361 * silently loop forever.
364 pte_k
= pte_offset_kernel(pmd_k
, address
);
365 if (!pte_present(*pte_k
))
372 /* Find fixup code. */
374 find_fixup_code(struct pt_regs
*regs
)
376 const struct exception_table_entry
*fixup
;
377 /* in case of delay slot fault (v32) */
378 unsigned long ip
= (instruction_pointer(regs
) & ~0x1);
380 fixup
= search_exception_tables(ip
);
382 /* Adjust the instruction pointer in the stackframe. */
383 instruction_pointer(regs
) = fixup
->fixup
;