ssb bus needs <linux/io.h>
[sfrench/cifs-2.6.git] / arch / sh / mm / fault-nommu.c
1 /*
2  * arch/sh/mm/fault-nommu.c
3  *
4  * Copyright (C) 2002 - 2007 Paul Mundt
5  *
6  * Based on linux/arch/sh/mm/fault.c:
7  *  Copyright (C) 1999  Niibe Yutaka
8  *
9  * Released under the terms of the GNU GPL v2.0.
10  */
11 #include <linux/kernel.h>
12 #include <linux/mm.h>
13 #include <linux/hardirq.h>
14 #include <linux/kprobes.h>
15 #include <asm/system.h>
16 #include <asm/ptrace.h>
17 #include <asm/kgdb.h>
18
19 /*
20  * This routine handles page faults.  It determines the address,
21  * and the problem, and then passes it off to one of the appropriate
22  * routines.
23  */
24 asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
25                                         unsigned long writeaccess,
26                                         unsigned long address)
27 {
28         trace_hardirqs_on();
29         local_irq_enable();
30
31 #if defined(CONFIG_SH_KGDB)
32         if (kgdb_nofault && kgdb_bus_err_hook)
33                 kgdb_bus_err_hook();
34 #endif
35
36         /*
37          * Oops. The kernel tried to access some bad page. We'll have to
38          * terminate things with extreme prejudice.
39          *
40          */
41         if (address < PAGE_SIZE) {
42                 printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
43         } else {
44                 printk(KERN_ALERT "Unable to handle kernel paging request");
45         }
46
47         printk(" at virtual address %08lx\n", address);
48         printk(KERN_ALERT "pc = %08lx\n", regs->pc);
49
50         die("Oops", regs, writeaccess);
51         do_exit(SIGKILL);
52 }
53
54 asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs,
55                                          unsigned long writeaccess,
56                                          unsigned long address)
57 {
58 #if defined(CONFIG_SH_KGDB)
59         if (kgdb_nofault && kgdb_bus_err_hook)
60                 kgdb_bus_err_hook();
61 #endif
62
63         return (address >= TASK_SIZE);
64 }