]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * linux/arch/m32r/mm/fault.c | |
3 | * | |
4 | * Copyright (c) 2001, 2002 Hitoshi Yamamoto, and H. Kondo | |
5 | * | |
6 | * Some code taken from i386 version. | |
7 | * Copyright (C) 1995 Linus Torvalds | |
8 | */ | |
9 | ||
1da177e4 LT |
10 | #include <linux/signal.h> |
11 | #include <linux/sched.h> | |
12 | #include <linux/kernel.h> | |
13 | #include <linux/errno.h> | |
14 | #include <linux/string.h> | |
15 | #include <linux/types.h> | |
16 | #include <linux/ptrace.h> | |
17 | #include <linux/mman.h> | |
18 | #include <linux/mm.h> | |
19 | #include <linux/smp.h> | |
1da177e4 LT |
20 | #include <linux/interrupt.h> |
21 | #include <linux/init.h> | |
22 | #include <linux/vt_kern.h> /* For unblank_screen() */ | |
23 | ||
24 | #include <asm/m32r.h> | |
1da177e4 LT |
25 | #include <asm/uaccess.h> |
26 | #include <asm/pgalloc.h> | |
27 | #include <asm/pgtable.h> | |
28 | #include <asm/hardirq.h> | |
29 | #include <asm/mmu_context.h> | |
30 | ||
31 | extern void die(const char *, struct pt_regs *, long); | |
32 | ||
33 | #ifndef CONFIG_SMP | |
34 | asmlinkage unsigned int tlb_entry_i_dat; | |
35 | asmlinkage unsigned int tlb_entry_d_dat; | |
36 | #define tlb_entry_i tlb_entry_i_dat | |
37 | #define tlb_entry_d tlb_entry_d_dat | |
38 | #else | |
39 | unsigned int tlb_entry_i_dat[NR_CPUS]; | |
40 | unsigned int tlb_entry_d_dat[NR_CPUS]; | |
41 | #define tlb_entry_i tlb_entry_i_dat[smp_processor_id()] | |
42 | #define tlb_entry_d tlb_entry_d_dat[smp_processor_id()] | |
43 | #endif | |
44 | ||
1da177e4 LT |
45 | void do_BUG(const char *file, int line) |
46 | { | |
47 | bust_spinlocks(1); | |
48 | printk("kernel BUG at %s:%d!\n", file, line); | |
49 | } | |
50 | ||
51 | /*======================================================================* | |
52 | * do_page_fault() | |
53 | *======================================================================* | |
54 | * This routine handles page faults. It determines the address, | |
55 | * and the problem, and then passes it off to one of the appropriate | |
56 | * routines. | |
57 | * | |
58 | * ARGUMENT: | |
59 | * regs : M32R SP reg. | |
60 | * error_code : See below | |
61 | * address : M32R MMU MDEVA reg. (Operand ACE) | |
62 | * : M32R BPC reg. (Instruction ACE) | |
63 | * | |
64 | * error_code : | |
65 | * bit 0 == 0 means no page found, 1 means protection fault | |
66 | * bit 1 == 0 means read, 1 means write | |
67 | * bit 2 == 0 means kernel, 1 means user-mode | |
68 | *======================================================================*/ | |
69 | asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, | |
70 | unsigned long address) | |
71 | { | |
72 | ||
73 | /* | |
74 | * Oops. The kernel tried to access some bad page. We'll have to | |
75 | * terminate things with extreme prejudice. | |
76 | */ | |
77 | ||
78 | bust_spinlocks(1); | |
79 | ||
80 | if (address < PAGE_SIZE) | |
81 | printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference"); | |
82 | else | |
83 | printk(KERN_ALERT "Unable to handle kernel paging request"); | |
84 | printk(" at virtual address %08lx\n",address); | |
85 | printk(" printing bpc:\n"); | |
86 | printk(KERN_ALERT "bpc = %08lx\n", regs->bpc); | |
87 | ||
88 | die("Oops", regs, error_code); | |
89 | bust_spinlocks(0); | |
90 | do_exit(SIGKILL); | |
91 | } | |
92 | ||
93 | /*======================================================================* | |
94 | * update_mmu_cache() | |
95 | *======================================================================*/ | |
96 | void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, | |
4b3073e1 | 97 | pte_t *ptep) |
1da177e4 LT |
98 | { |
99 | BUG(); | |
100 | } | |
101 | ||
102 | /*======================================================================* | |
103 | * flush_tlb_page() : flushes one page | |
104 | *======================================================================*/ | |
105 | void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page) | |
106 | { | |
107 | BUG(); | |
108 | } | |
109 | ||
110 | /*======================================================================* | |
111 | * flush_tlb_range() : flushes a range of pages | |
112 | *======================================================================*/ | |
113 | void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |
114 | unsigned long end) | |
115 | { | |
116 | BUG(); | |
117 | } | |
118 | ||
119 | /*======================================================================* | |
120 | * flush_tlb_mm() : flushes the specified mm context TLB's | |
121 | *======================================================================*/ | |
122 | void local_flush_tlb_mm(struct mm_struct *mm) | |
123 | { | |
124 | BUG(); | |
125 | } | |
126 | ||
127 | /*======================================================================* | |
128 | * flush_tlb_all() : flushes all processes TLBs | |
129 | *======================================================================*/ | |
130 | void local_flush_tlb_all(void) | |
131 | { | |
132 | BUG(); | |
133 | } |