13 #include <linux/signal.h>
14 #include <linux/sched.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/string.h>
18 #include <linux/types.h>
19 #include <linux/ptrace.h>
20 #include <linux/mman.h>
27 #include <asm/uaccess.h>
28 #include <asm/pgalloc.h>
29 #include <asm/hardirq.h>
32 #include <asm/gdb-stub.h>
76 pgd, (
long long)
pgd_val(*pgd));
92 pte, (
long long)
pte_val(*pte));
119 unsigned long address)
128 #ifdef CONFIG_GDBSTUB
139 fault_code & 0x10000 ?
"ins" :
"data",
140 fault_code & 0xffff, address);
158 (fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_SR &&
159 (fault_code & MMUFCR_xFC_PGINVAL) == MMUFCR_xFC_PGINVAL
180 if (!(vma->
vm_flags & VM_GROWSDOWN))
183 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_USR) {
186 if ((address &
PAGE_MASK) + 2 * PAGE_SIZE < regs->
sp) {
189 "[%d] ### Access below stack @%lx (sp=%lx)\n",
192 "vma [%08x - %08x]\n",
196 "[%d] ### Code: [%08lx]"
197 " %02x %02x %02x %02x %02x %02x %02x %02x\n",
200 ((
u8 *) regs->
pc)[0],
201 ((
u8 *) regs->
pc)[1],
202 ((
u8 *) regs->
pc)[2],
203 ((
u8 *) regs->
pc)[3],
204 ((
u8 *) regs->
pc)[4],
205 ((
u8 *) regs->
pc)[5],
206 ((
u8 *) regs->
pc)[6],
224 switch (fault_code & (MMUFCR_xFC_PGINVAL|MMUFCR_xFC_TYPE)) {
226 case MMUFCR_xFC_TYPE_WRITE:
227 #ifdef TEST_VERIFY_AREA
228 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_SR)
232 case MMUFCR_xFC_PGINVAL | MMUFCR_xFC_TYPE_WRITE:
239 case MMUFCR_xFC_TYPE_READ:
243 case MMUFCR_xFC_PGINVAL | MMUFCR_xFC_TYPE_READ:
244 if (!(vma->
vm_flags & (VM_READ | VM_EXEC)))
254 fault =
handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
255 if (
unlikely(fault & VM_FAULT_ERROR)) {
256 if (fault & VM_FAULT_OOM)
258 else if (fault & VM_FAULT_SIGBUS)
262 if (fault & VM_FAULT_MAJOR)
278 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_USR) {
282 info.si_addr = (
void *)address;
301 "Unable to handle kernel NULL pointer dereference");
304 "Unable to handle kernel paging request");
305 printk(
" at virtual address %08lx\n", address);
306 printk(
" printing pc:\n");
313 page = ((
unsigned long *)
__va(page))[address >> 22];
317 address &= 0x003ff000;
322 die(
"Oops", regs, fault_code);
332 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_USR)
346 info.si_addr = (
void *)address;
350 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_SR)
382 pgd = (
pgd_t *) PTBR + index;