12 #include <linux/module.h>
13 #include <linux/signal.h>
20 #include <linux/sched.h>
23 #include <asm/pgtable.h>
24 #include <asm/tlbflush.h>
29 #define FSR_LNX_PF (1 << 31)
31 static inline int fsr_fs(
unsigned int fsr)
34 return (fsr & 31) + ((fsr & (3 << 5)) >> 5);
91 static void __do_kernel_fault(
struct mm_struct *mm,
unsigned long addr,
105 "Unable to handle kernel %s at virtual address %08lx\n",
106 (addr <
PAGE_SIZE) ?
"NULL pointer dereference" :
107 "paging request", addr);
110 die(
"Oops", regs, fsr);
119 static void __do_user_fault(
struct task_struct *tsk,
unsigned long addr,
120 unsigned int fsr,
unsigned int sig,
int code,
126 tsk->
thread.error_code = fsr;
131 si.si_addr = (
void __user *)addr;
147 __do_kernel_fault(mm, addr, fsr, regs);
150 #define VM_FAULT_BADMAP 0x010000
151 #define VM_FAULT_BADACCESS 0x020000
158 static inline bool access_error(
unsigned int fsr,
struct vm_area_struct *vma)
160 unsigned int mask = VM_READ | VM_WRITE | VM_EXEC;
167 return vma->
vm_flags & mask ?
false :
true;
170 static int __do_pf(
struct mm_struct *mm,
unsigned long addr,
unsigned int fsr,
188 if (access_error(fsr, vma)) {
207 static int do_pf(
unsigned long addr,
unsigned int fsr,
struct pt_regs *regs)
212 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
213 ((!(fsr ^ 0x12)) ? FAULT_FLAG_WRITE : 0);
243 #ifdef CONFIG_DEBUG_VM
250 fault = __do_pf(mm, addr, fsr, flags, tsk);
256 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(
current))
259 if (!(fault & VM_FAULT_ERROR) && (flags & FAULT_FLAG_ALLOW_RETRY)) {
260 if (fault & VM_FAULT_MAJOR)
264 if (fault & VM_FAULT_RETRY) {
267 flags &= ~FAULT_FLAG_ALLOW_RETRY;
281 if (fault & VM_FAULT_OOM) {
298 if (fault & VM_FAULT_SIGBUS) {
314 __do_user_fault(tsk, addr, fsr, sig, code, regs);
318 __do_kernel_fault(mm, addr, fsr, regs);
339 static int do_ifault(
unsigned long addr,
unsigned int fsr,
struct pt_regs *regs)
346 return do_pf(addr, fsr, regs);
353 pgd = cpu_get_pgd() +
index;
366 flush_pmd_entry(pmd);
377 static int do_bad(
unsigned long addr,
unsigned int fsr,
struct pt_regs *regs)
382 static int do_good(
unsigned long addr,
unsigned int fsr,
struct pt_regs *regs)
386 printk(
"dabt exception but no error!\n");
391 :
"=r"(res1),
"=r"(res2)
409 { do_good,
SIGBUS, 0,
"no error" },
412 { do_bad,
SIGBUS, 0,
"burst operation" },
413 { do_bad,
SIGBUS, 0,
"unknown 00100" },
415 { do_bad,
SIGBUS, 0,
"2nd lvl large pt non-exist" },
416 { do_bad,
SIGBUS, 0,
"invalid pte" },
418 { do_bad,
SIGBUS, 0,
"middle page miss" },
419 { do_bad,
SIGBUS, 0,
"large page miss" },
421 { do_bad,
SIGBUS, 0,
"unknown 01100" },
422 { do_bad,
SIGBUS, 0,
"unknown 01101" },
423 { do_bad,
SIGBUS, 0,
"unknown 01110" },
424 { do_bad,
SIGBUS, 0,
"unknown 01111" },
425 { do_bad,
SIGBUS, 0,
"addr: up 3G or IO" },
429 { do_bad,
SIGBUS, 0,
"unknown 10100" },
430 { do_bad,
SIGBUS, 0,
"unknown 10101" },
431 { do_bad,
SIGBUS, 0,
"unknown 10110" },
432 { do_bad,
SIGBUS, 0,
"unknown 10111" },
433 { do_bad,
SIGBUS, 0,
"unknown 11000" },
434 { do_bad,
SIGBUS, 0,
"unknown 11001" },
435 { do_bad,
SIGBUS, 0,
"unknown 11010" },
436 { do_bad,
SIGBUS, 0,
"unknown 11011" },
437 { do_bad,
SIGBUS, 0,
"unknown 11100" },
438 { do_bad,
SIGBUS, 0,
"unknown 11101" },
439 { do_bad,
SIGBUS, 0,
"unknown 11110" },
440 { do_bad,
SIGBUS, 0,
"unknown 11111" }
444 int (*
fn) (
unsigned long,
unsigned int,
struct pt_regs *),
445 int sig,
int code,
const char *
name)
469 inf->
name, fsr, addr);
474 info.si_addr = (
void __user *)addr;
479 unsigned int ifsr,
struct pt_regs *regs)
488 inf->
name, ifsr, addr);
493 info.si_addr = (
void __user *)addr;