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