linux/arch/arm/mm/fault.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/mm/fault.c
   3 *
   4 *  Copyright (C) 1995  Linus Torvalds
   5 *  Modifications for ARM processor (c) 1995-2004 Russell King
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11#include <linux/module.h>
  12#include <linux/signal.h>
  13#include <linux/mm.h>
  14#include <linux/hardirq.h>
  15#include <linux/init.h>
  16#include <linux/kprobes.h>
  17#include <linux/uaccess.h>
  18#include <linux/page-flags.h>
  19#include <linux/sched.h>
  20#include <linux/highmem.h>
  21#include <linux/perf_event.h>
  22
  23#include <asm/system.h>
  24#include <asm/pgtable.h>
  25#include <asm/tlbflush.h>
  26
  27#include "fault.h"
  28
  29/*
  30 * Fault status register encodings.  We steal bit 31 for our own purposes.
  31 */
  32#define FSR_LNX_PF              (1 << 31)
  33#define FSR_WRITE               (1 << 11)
  34#define FSR_FS4                 (1 << 10)
  35#define FSR_FS3_0               (15)
  36
  37static inline int fsr_fs(unsigned int fsr)
  38{
  39        return (fsr & FSR_FS3_0) | (fsr & FSR_FS4) >> 6;
  40}
  41
  42#ifdef CONFIG_MMU
  43
  44#ifdef CONFIG_KPROBES
  45static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr)
  46{
  47        int ret = 0;
  48
  49        if (!user_mode(regs)) {
  50                /* kprobe_running() needs smp_processor_id() */
  51                preempt_disable();
  52                if (kprobe_running() && kprobe_fault_handler(regs, fsr))
  53                        ret = 1;
  54                preempt_enable();
  55        }
  56
  57        return ret;
  58}
  59#else
  60static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr)
  61{
  62        return 0;
  63}
  64#endif
  65
  66/*
  67 * This is useful to dump out the page tables associated with
  68 * 'addr' in mm 'mm'.
  69 */
  70void show_pte(struct mm_struct *mm, unsigned long addr)
  71{
  72        pgd_t *pgd;
  73
  74        if (!mm)
  75                mm = &init_mm;
  76
  77        printk(KERN_ALERT "pgd = %p\n", mm->pgd);
  78        pgd = pgd_offset(mm, addr);
  79        printk(KERN_ALERT "[%08lx] *pgd=%08llx",
  80                        addr, (long long)pgd_val(*pgd));
  81
  82        do {
  83                pud_t *pud;
  84                pmd_t *pmd;
  85                pte_t *pte;
  86
  87                if (pgd_none(*pgd))
  88                        break;
  89
  90                if (pgd_bad(*pgd)) {
  91                        printk("(bad)");
  92                        break;
  93                }
  94
  95                pud = pud_offset(pgd, addr);
  96                if (PTRS_PER_PUD != 1)
  97                        printk(", *pud=%08llx", (long long)pud_val(*pud));
  98
  99                if (pud_none(*pud))
 100                        break;
 101
 102                if (pud_bad(*pud)) {
 103                        printk("(bad)");
 104                        break;
 105                }
 106
 107                pmd = pmd_offset(pud, addr);
 108                if (PTRS_PER_PMD != 1)
 109                        printk(", *pmd=%08llx", (long long)pmd_val(*pmd));
 110
 111                if (pmd_none(*pmd))
 112                        break;
 113
 114                if (pmd_bad(*pmd)) {
 115                        printk("(bad)");
 116                        break;
 117                }
 118
 119                /* We must not map this if we have highmem enabled */
 120                if (PageHighMem(pfn_to_page(pmd_val(*pmd) >> PAGE_SHIFT)))
 121                        break;
 122
 123                pte = pte_offset_map(pmd, addr);
 124                printk(", *pte=%08llx", (long long)pte_val(*pte));
 125                printk(", *ppte=%08llx",
 126                       (long long)pte_val(pte[PTE_HWTABLE_PTRS]));
 127                pte_unmap(pte);
 128        } while(0);
 129
 130        printk("\n");
 131}
 132#else                                   /* CONFIG_MMU */
 133void show_pte(struct mm_struct *mm, unsigned long addr)
 134{ }
 135#endif                                  /* CONFIG_MMU */
 136
 137/*
 138 * Oops.  The kernel tried to access some page that wasn't present.
 139 */
 140static void
 141__do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 142                  struct pt_regs *regs)
 143{
 144        /*
 145         * Are we prepared to handle this kernel fault?
 146         */
 147        if (fixup_exception(regs))
 148                return;
 149
 150        /*
 151         * No handler, we'll have to terminate things with extreme prejudice.
 152         */
 153        bust_spinlocks(1);
 154        printk(KERN_ALERT
 155                "Unable to handle kernel %s at virtual address %08lx\n",
 156                (addr < PAGE_SIZE) ? "NULL pointer dereference" :
 157                "paging request", addr);
 158
 159        show_pte(mm, addr);
 160        die("Oops", regs, fsr);
 161        bust_spinlocks(0);
 162        do_exit(SIGKILL);
 163}
 164
 165/*
 166 * Something tried to access memory that isn't in our memory map..
 167 * User mode accesses just cause a SIGSEGV
 168 */
 169static void
 170__do_user_fault(struct task_struct *tsk, unsigned long addr,
 171                unsigned int fsr, unsigned int sig, int code,
 172                struct pt_regs *regs)
 173{
 174        struct siginfo si;
 175
 176#ifdef CONFIG_DEBUG_USER
 177        if (user_debug & UDBG_SEGV) {
 178                printk(KERN_DEBUG "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
 179                       tsk->comm, sig, addr, fsr);
 180                show_pte(tsk->mm, addr);
 181                show_regs(regs);
 182        }
 183#endif
 184
 185        tsk->thread.address = addr;
 186        tsk->thread.error_code = fsr;
 187        tsk->thread.trap_no = 14;
 188        si.si_signo = sig;
 189        si.si_errno = 0;
 190        si.si_code = code;
 191        si.si_addr = (void __user *)addr;
 192        force_sig_info(sig, &si, tsk);
 193}
 194
 195void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 196{
 197        struct task_struct *tsk = current;
 198        struct mm_struct *mm = tsk->active_mm;
 199
 200        /*
 201         * If we are in kernel mode at this point, we
 202         * have no context to handle this fault with.
 203         */
 204        if (user_mode(regs))
 205                __do_user_fault(tsk, addr, fsr, SIGSEGV, SEGV_MAPERR, regs);
 206        else
 207                __do_kernel_fault(mm, addr, fsr, regs);
 208}
 209
 210#ifdef CONFIG_MMU
 211#define VM_FAULT_BADMAP         0x010000
 212#define VM_FAULT_BADACCESS      0x020000
 213
 214/*
 215 * Check that the permissions on the VMA allow for the fault which occurred.
 216 * If we encountered a write fault, we must have write permission, otherwise
 217 * we allow any permission.
 218 */
 219static inline bool access_error(unsigned int fsr, struct vm_area_struct *vma)
 220{
 221        unsigned int mask = VM_READ | VM_WRITE | VM_EXEC;
 222
 223        if (fsr & FSR_WRITE)
 224                mask = VM_WRITE;
 225        if (fsr & FSR_LNX_PF)
 226                mask = VM_EXEC;
 227
 228        return vma->vm_flags & mask ? false : true;
 229}
 230
 231static int __kprobes
 232__do_page_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 233                struct task_struct *tsk)
 234{
 235        struct vm_area_struct *vma;
 236        int fault;
 237
 238        vma = find_vma(mm, addr);
 239        fault = VM_FAULT_BADMAP;
 240        if (unlikely(!vma))
 241                goto out;
 242        if (unlikely(vma->vm_start > addr))
 243                goto check_stack;
 244
 245        /*
 246         * Ok, we have a good vm_area for this
 247         * memory access, so we can handle it.
 248         */
 249good_area:
 250        if (access_error(fsr, vma)) {
 251                fault = VM_FAULT_BADACCESS;
 252                goto out;
 253        }
 254
 255        /*
 256         * If for any reason at all we couldn't handle the fault, make
 257         * sure we exit gracefully rather than endlessly redo the fault.
 258         */
 259        fault = handle_mm_fault(mm, vma, addr & PAGE_MASK, (fsr & FSR_WRITE) ? FAULT_FLAG_WRITE : 0);
 260        if (unlikely(fault & VM_FAULT_ERROR))
 261                return fault;
 262        if (fault & VM_FAULT_MAJOR)
 263                tsk->maj_flt++;
 264        else
 265                tsk->min_flt++;
 266        return fault;
 267
 268check_stack:
 269        if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr))
 270                goto good_area;
 271out:
 272        return fault;
 273}
 274
 275static int __kprobes
 276do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 277{
 278        struct task_struct *tsk;
 279        struct mm_struct *mm;
 280        int fault, sig, code;
 281
 282        if (notify_page_fault(regs, fsr))
 283                return 0;
 284
 285        tsk = current;
 286        mm  = tsk->mm;
 287
 288        /* Enable interrupts if they were enabled in the parent context. */
 289        if (interrupts_enabled(regs))
 290                local_irq_enable();
 291
 292        /*
 293         * If we're in an interrupt or have no user
 294         * context, we must not take the fault..
 295         */
 296        if (in_atomic() || !mm)
 297                goto no_context;
 298
 299        /*
 300         * As per x86, we may deadlock here.  However, since the kernel only
 301         * validly references user space from well defined areas of the code,
 302         * we can bug out early if this is from code which shouldn't.
 303         */
 304        if (!down_read_trylock(&mm->mmap_sem)) {
 305                if (!user_mode(regs) && !search_exception_tables(regs->ARM_pc))
 306                        goto no_context;
 307                down_read(&mm->mmap_sem);
 308        } else {
 309                /*
 310                 * The above down_read_trylock() might have succeeded in
 311                 * which case, we'll have missed the might_sleep() from
 312                 * down_read()
 313                 */
 314                might_sleep();
 315#ifdef CONFIG_DEBUG_VM
 316                if (!user_mode(regs) &&
 317                    !search_exception_tables(regs->ARM_pc))
 318                        goto no_context;
 319#endif
 320        }
 321
 322        fault = __do_page_fault(mm, addr, fsr, tsk);
 323        up_read(&mm->mmap_sem);
 324
 325        perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr);
 326        if (fault & VM_FAULT_MAJOR)
 327                perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MAJ, 1, regs, addr);
 328        else if (fault & VM_FAULT_MINOR)
 329                perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS_MIN, 1, regs, addr);
 330
 331        /*
 332         * Handle the "normal" case first - VM_FAULT_MAJOR / VM_FAULT_MINOR
 333         */
 334        if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
 335                return 0;
 336
 337        if (fault & VM_FAULT_OOM) {
 338                /*
 339                 * We ran out of memory, call the OOM killer, and return to
 340                 * userspace (which will retry the fault, or kill us if we
 341                 * got oom-killed)
 342                 */
 343                pagefault_out_of_memory();
 344                return 0;
 345        }
 346
 347        /*
 348         * If we are in kernel mode at this point, we
 349         * have no context to handle this fault with.
 350         */
 351        if (!user_mode(regs))
 352                goto no_context;
 353
 354        if (fault & VM_FAULT_SIGBUS) {
 355                /*
 356                 * We had some memory, but were unable to
 357                 * successfully fix up this page fault.
 358                 */
 359                sig = SIGBUS;
 360                code = BUS_ADRERR;
 361        } else {
 362                /*
 363                 * Something tried to access memory that
 364                 * isn't in our memory map..
 365                 */
 366                sig = SIGSEGV;
 367                code = fault == VM_FAULT_BADACCESS ?
 368                        SEGV_ACCERR : SEGV_MAPERR;
 369        }
 370
 371        __do_user_fault(tsk, addr, fsr, sig, code, regs);
 372        return 0;
 373
 374no_context:
 375        __do_kernel_fault(mm, addr, fsr, regs);
 376        return 0;
 377}
 378#else                                   /* CONFIG_MMU */
 379static int
 380do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 381{
 382        return 0;
 383}
 384#endif                                  /* CONFIG_MMU */
 385
 386/*
 387 * First Level Translation Fault Handler
 388 *
 389 * We enter here because the first level page table doesn't contain
 390 * a valid entry for the address.
 391 *
 392 * If the address is in kernel space (>= TASK_SIZE), then we are
 393 * probably faulting in the vmalloc() area.
 394 *
 395 * If the init_task's first level page tables contains the relevant
 396 * entry, we copy the it to this task.  If not, we send the process
 397 * a signal, fixup the exception, or oops the kernel.
 398 *
 399 * NOTE! We MUST NOT take any locks for this case. We may be in an
 400 * interrupt or a critical region, and should only copy the information
 401 * from the master page table, nothing more.
 402 */
 403#ifdef CONFIG_MMU
 404static int __kprobes
 405do_translation_fault(unsigned long addr, unsigned int fsr,
 406                     struct pt_regs *regs)
 407{
 408        unsigned int index;
 409        pgd_t *pgd, *pgd_k;
 410        pud_t *pud, *pud_k;
 411        pmd_t *pmd, *pmd_k;
 412
 413        if (addr < TASK_SIZE)
 414                return do_page_fault(addr, fsr, regs);
 415
 416        if (user_mode(regs))
 417                goto bad_area;
 418
 419        index = pgd_index(addr);
 420
 421        /*
 422         * FIXME: CP15 C1 is write only on ARMv3 architectures.
 423         */
 424        pgd = cpu_get_pgd() + index;
 425        pgd_k = init_mm.pgd + index;
 426
 427        if (pgd_none(*pgd_k))
 428                goto bad_area;
 429        if (!pgd_present(*pgd))
 430                set_pgd(pgd, *pgd_k);
 431
 432        pud = pud_offset(pgd, addr);
 433        pud_k = pud_offset(pgd_k, addr);
 434
 435        if (pud_none(*pud_k))
 436                goto bad_area;
 437        if (!pud_present(*pud))
 438                set_pud(pud, *pud_k);
 439
 440        pmd = pmd_offset(pud, addr);
 441        pmd_k = pmd_offset(pud_k, addr);
 442
 443        /*
 444         * On ARM one Linux PGD entry contains two hardware entries (see page
 445         * tables layout in pgtable.h). We normally guarantee that we always
 446         * fill both L1 entries. But create_mapping() doesn't follow the rule.
 447         * It can create inidividual L1 entries, so here we have to call
 448         * pmd_none() check for the entry really corresponded to address, not
 449         * for the first of pair.
 450         */
 451        index = (addr >> SECTION_SHIFT) & 1;
 452        if (pmd_none(pmd_k[index]))
 453                goto bad_area;
 454
 455        copy_pmd(pmd, pmd_k);
 456        return 0;
 457
 458bad_area:
 459        do_bad_area(addr, fsr, regs);
 460        return 0;
 461}
 462#else                                   /* CONFIG_MMU */
 463static int
 464do_translation_fault(unsigned long addr, unsigned int fsr,
 465                     struct pt_regs *regs)
 466{
 467        return 0;
 468}
 469#endif                                  /* CONFIG_MMU */
 470
 471/*
 472 * Some section permission faults need to be handled gracefully.
 473 * They can happen due to a __{get,put}_user during an oops.
 474 */
 475static int
 476do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 477{
 478        do_bad_area(addr, fsr, regs);
 479        return 0;
 480}
 481
 482/*
 483 * This abort handler always returns "fault".
 484 */
 485static int
 486do_bad(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 487{
 488        return 1;
 489}
 490
 491static struct fsr_info {
 492        int     (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs);
 493        int     sig;
 494        int     code;
 495        const char *name;
 496} fsr_info[] = {
 497        /*
 498         * The following are the standard ARMv3 and ARMv4 aborts.  ARMv5
 499         * defines these to be "precise" aborts.
 500         */
 501        { do_bad,               SIGSEGV, 0,             "vector exception"                 },
 502        { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
 503        { do_bad,               SIGKILL, 0,             "terminal exception"               },
 504        { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
 505        { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
 506        { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
 507        { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
 508        { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
 509        { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
 510        { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
 511        { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
 512        { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
 513        { do_bad,               SIGBUS,  0,             "external abort on translation"    },
 514        { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
 515        { do_bad,               SIGBUS,  0,             "external abort on translation"    },
 516        { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
 517        /*
 518         * The following are "imprecise" aborts, which are signalled by bit
 519         * 10 of the FSR, and may not be recoverable.  These are only
 520         * supported if the CPU abort handler supports bit 10.
 521         */
 522        { do_bad,               SIGBUS,  0,             "unknown 16"                       },
 523        { do_bad,               SIGBUS,  0,             "unknown 17"                       },
 524        { do_bad,               SIGBUS,  0,             "unknown 18"                       },
 525        { do_bad,               SIGBUS,  0,             "unknown 19"                       },
 526        { do_bad,               SIGBUS,  0,             "lock abort"                       }, /* xscale */
 527        { do_bad,               SIGBUS,  0,             "unknown 21"                       },
 528        { do_bad,               SIGBUS,  BUS_OBJERR,    "imprecise external abort"         }, /* xscale */
 529        { do_bad,               SIGBUS,  0,             "unknown 23"                       },
 530        { do_bad,               SIGBUS,  0,             "dcache parity error"              }, /* xscale */
 531        { do_bad,               SIGBUS,  0,             "unknown 25"                       },
 532        { do_bad,               SIGBUS,  0,             "unknown 26"                       },
 533        { do_bad,               SIGBUS,  0,             "unknown 27"                       },
 534        { do_bad,               SIGBUS,  0,             "unknown 28"                       },
 535        { do_bad,               SIGBUS,  0,             "unknown 29"                       },
 536        { do_bad,               SIGBUS,  0,             "unknown 30"                       },
 537        { do_bad,               SIGBUS,  0,             "unknown 31"                       }
 538};
 539
 540void __init
 541hook_fault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *),
 542                int sig, int code, const char *name)
 543{
 544        if (nr < 0 || nr >= ARRAY_SIZE(fsr_info))
 545                BUG();
 546
 547        fsr_info[nr].fn   = fn;
 548        fsr_info[nr].sig  = sig;
 549        fsr_info[nr].code = code;
 550        fsr_info[nr].name = name;
 551}
 552
 553/*
 554 * Dispatch a data abort to the relevant handler.
 555 */
 556asmlinkage void __exception
 557do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 558{
 559        const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
 560        struct siginfo info;
 561
 562        if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
 563                return;
 564
 565        printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
 566                inf->name, fsr, addr);
 567
 568        info.si_signo = inf->sig;
 569        info.si_errno = 0;
 570        info.si_code  = inf->code;
 571        info.si_addr  = (void __user *)addr;
 572        arm_notify_die("", regs, &info, fsr, 0);
 573}
 574
 575
 576static struct fsr_info ifsr_info[] = {
 577        { do_bad,               SIGBUS,  0,             "unknown 0"                        },
 578        { do_bad,               SIGBUS,  0,             "unknown 1"                        },
 579        { do_bad,               SIGBUS,  0,             "debug event"                      },
 580        { do_bad,               SIGSEGV, SEGV_ACCERR,   "section access flag fault"        },
 581        { do_bad,               SIGBUS,  0,             "unknown 4"                        },
 582        { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
 583        { do_bad,               SIGSEGV, SEGV_ACCERR,   "page access flag fault"           },
 584        { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
 585        { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
 586        { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
 587        { do_bad,               SIGBUS,  0,             "unknown 10"                       },
 588        { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
 589        { do_bad,               SIGBUS,  0,             "external abort on translation"    },
 590        { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
 591        { do_bad,               SIGBUS,  0,             "external abort on translation"    },
 592        { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
 593        { do_bad,               SIGBUS,  0,             "unknown 16"                       },
 594        { do_bad,               SIGBUS,  0,             "unknown 17"                       },
 595        { do_bad,               SIGBUS,  0,             "unknown 18"                       },
 596        { do_bad,               SIGBUS,  0,             "unknown 19"                       },
 597        { do_bad,               SIGBUS,  0,             "unknown 20"                       },
 598        { do_bad,               SIGBUS,  0,             "unknown 21"                       },
 599        { do_bad,               SIGBUS,  0,             "unknown 22"                       },
 600        { do_bad,               SIGBUS,  0,             "unknown 23"                       },
 601        { do_bad,               SIGBUS,  0,             "unknown 24"                       },
 602        { do_bad,               SIGBUS,  0,             "unknown 25"                       },
 603        { do_bad,               SIGBUS,  0,             "unknown 26"                       },
 604        { do_bad,               SIGBUS,  0,             "unknown 27"                       },
 605        { do_bad,               SIGBUS,  0,             "unknown 28"                       },
 606        { do_bad,               SIGBUS,  0,             "unknown 29"                       },
 607        { do_bad,               SIGBUS,  0,             "unknown 30"                       },
 608        { do_bad,               SIGBUS,  0,             "unknown 31"                       },
 609};
 610
 611void __init
 612hook_ifault_code(int nr, int (*fn)(unsigned long, unsigned int, struct pt_regs *),
 613                 int sig, int code, const char *name)
 614{
 615        if (nr < 0 || nr >= ARRAY_SIZE(ifsr_info))
 616                BUG();
 617
 618        ifsr_info[nr].fn   = fn;
 619        ifsr_info[nr].sig  = sig;
 620        ifsr_info[nr].code = code;
 621        ifsr_info[nr].name = name;
 622}
 623
 624asmlinkage void __exception
 625do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
 626{
 627        const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr);
 628        struct siginfo info;
 629
 630        if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))
 631                return;
 632
 633        printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
 634                inf->name, ifsr, addr);
 635
 636        info.si_signo = inf->sig;
 637        info.si_errno = 0;
 638        info.si_code  = inf->code;
 639        info.si_addr  = (void __user *)addr;
 640        arm_notify_die("", regs, &info, ifsr, 0);
 641}
 642
 643static int __init exceptions_init(void)
 644{
 645        if (cpu_architecture() >= CPU_ARCH_ARMv6) {
 646                hook_fault_code(4, do_translation_fault, SIGSEGV, SEGV_MAPERR,
 647                                "I-cache maintenance fault");
 648        }
 649
 650        if (cpu_architecture() >= CPU_ARCH_ARMv7) {
 651                /*
 652                 * TODO: Access flag faults introduced in ARMv6K.
 653                 * Runtime check for 'K' extension is needed
 654                 */
 655                hook_fault_code(3, do_bad, SIGSEGV, SEGV_MAPERR,
 656                                "section access flag fault");
 657                hook_fault_code(6, do_bad, SIGSEGV, SEGV_MAPERR,
 658                                "section access flag fault");
 659        }
 660
 661        return 0;
 662}
 663
 664arch_initcall(exceptions_init);
 665