1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/signal.h>
19#include <linux/sched.h>
20#include <linux/kernel.h>
21#include <linux/errno.h>
22#include <linux/string.h>
23#include <linux/types.h>
24#include <linux/ptrace.h>
25#include <linux/mman.h>
26#include <linux/mm.h>
27#include <linux/interrupt.h>
28#include <linux/highmem.h>
29#include <linux/module.h>
30#include <linux/kprobes.h>
31#include <linux/kdebug.h>
32
33#include <asm/page.h>
34#include <asm/pgtable.h>
35#include <asm/mmu.h>
36#include <asm/mmu_context.h>
37#include <asm/system.h>
38#include <asm/uaccess.h>
39#include <asm/tlbflush.h>
40#include <asm/siginfo.h>
41
42
43#ifdef CONFIG_KPROBES
44static inline int notify_page_fault(struct pt_regs *regs)
45{
46 int ret = 0;
47
48
49 if (!user_mode(regs)) {
50 preempt_disable();
51 if (kprobe_running() && kprobe_fault_handler(regs, 11))
52 ret = 1;
53 preempt_enable();
54 }
55
56 return ret;
57}
58#else
59static inline int notify_page_fault(struct pt_regs *regs)
60{
61 return 0;
62}
63#endif
64
65
66
67
68
69static int store_updates_sp(struct pt_regs *regs)
70{
71 unsigned int inst;
72
73 if (get_user(inst, (unsigned int __user *)regs->nip))
74 return 0;
75
76 if (((inst >> 16) & 0x1f) != 1)
77 return 0;
78
79 switch (inst >> 26) {
80 case 37:
81 case 39:
82 case 45:
83 case 53:
84 case 55:
85 return 1;
86 case 62:
87 return (inst & 3) == 1;
88 case 31:
89
90 switch ((inst >> 1) & 0x3ff) {
91 case 181:
92 case 183:
93 case 247:
94 case 439:
95 case 695:
96 case 759:
97 return 1;
98 }
99 }
100 return 0;
101}
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
117 unsigned long error_code)
118{
119 struct vm_area_struct * vma;
120 struct mm_struct *mm = current->mm;
121 siginfo_t info;
122 int code = SEGV_MAPERR;
123 int is_write = 0, ret;
124 int trap = TRAP(regs);
125 int is_exec = trap == 0x400;
126
127#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
128
129
130
131
132
133
134 if (trap == 0x400)
135 error_code &= 0x48200000;
136 else
137 is_write = error_code & DSISR_ISSTORE;
138#else
139 is_write = error_code & ESR_DST;
140#endif
141
142 if (notify_page_fault(regs))
143 return 0;
144
145 if (unlikely(debugger_fault_handler(regs)))
146 return 0;
147
148
149 if (!user_mode(regs) && (address >= TASK_SIZE))
150 return SIGSEGV;
151
152#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
153 if (error_code & DSISR_DABRMATCH) {
154
155 do_dabr(regs, address, error_code);
156 return 0;
157 }
158#endif
159
160 if (in_atomic() || mm == NULL) {
161 if (!user_mode(regs))
162 return SIGSEGV;
163
164
165 printk(KERN_EMERG "Page fault in user mode with "
166 "in_atomic() = %d mm = %p\n", in_atomic(), mm);
167 printk(KERN_EMERG "NIP = %lx MSR = %lx\n",
168 regs->nip, regs->msr);
169 die("Weird page fault", regs, SIGSEGV);
170 }
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 if (!down_read_trylock(&mm->mmap_sem)) {
188 if (!user_mode(regs) && !search_exception_tables(regs->nip))
189 goto bad_area_nosemaphore;
190
191 down_read(&mm->mmap_sem);
192 }
193
194 vma = find_vma(mm, address);
195 if (!vma)
196 goto bad_area;
197 if (vma->vm_start <= address)
198 goto good_area;
199 if (!(vma->vm_flags & VM_GROWSDOWN))
200 goto bad_area;
201
202
203
204
205
206
207
208
209
210
211 if (address + 0x100000 < vma->vm_end) {
212
213 struct pt_regs *uregs = current->thread.regs;
214 if (uregs == NULL)
215 goto bad_area;
216
217
218
219
220
221
222
223
224
225
226
227
228
229 if (address + 2048 < uregs->gpr[1]
230 && (!user_mode(regs) || !store_updates_sp(regs)))
231 goto bad_area;
232 }
233 if (expand_stack(vma, address))
234 goto bad_area;
235
236good_area:
237 code = SEGV_ACCERR;
238#if defined(CONFIG_6xx)
239 if (error_code & 0x95700000)
240
241
242 goto bad_area;
243#endif
244#if defined(CONFIG_8xx)
245
246
247
248
249 if (error_code & 0x10000000)
250
251 goto bad_area;
252#endif
253
254 if (is_exec) {
255#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
256
257 if (error_code & DSISR_PROTFAULT)
258 goto bad_area;
259
260
261
262
263 if (!(vma->vm_flags & VM_EXEC) &&
264 (cpu_has_feature(CPU_FTR_NOEXECUTE) ||
265 !(vma->vm_flags & (VM_READ | VM_WRITE))))
266 goto bad_area;
267#else
268 pte_t *ptep;
269 pmd_t *pmdp;
270
271
272
273 ptep = NULL;
274 if (get_pteptr(mm, address, &ptep, &pmdp)) {
275 spinlock_t *ptl = pte_lockptr(mm, pmdp);
276 spin_lock(ptl);
277 if (pte_present(*ptep)) {
278 struct page *page = pte_page(*ptep);
279
280 if (!test_bit(PG_arch_1, &page->flags)) {
281 flush_dcache_icache_page(page);
282 set_bit(PG_arch_1, &page->flags);
283 }
284 pte_update(ptep, 0, _PAGE_HWEXEC |
285 _PAGE_ACCESSED);
286 _tlbie(address, mm->context.id);
287 pte_unmap_unlock(ptep, ptl);
288 up_read(&mm->mmap_sem);
289 return 0;
290 }
291 pte_unmap_unlock(ptep, ptl);
292 }
293#endif
294
295 } else if (is_write) {
296 if (!(vma->vm_flags & VM_WRITE))
297 goto bad_area;
298
299 } else {
300
301 if (error_code & 0x08000000)
302 goto bad_area;
303 if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))
304 goto bad_area;
305 }
306
307
308
309
310
311
312 survive:
313 ret = handle_mm_fault(mm, vma, address, is_write);
314 if (unlikely(ret & VM_FAULT_ERROR)) {
315 if (ret & VM_FAULT_OOM)
316 goto out_of_memory;
317 else if (ret & VM_FAULT_SIGBUS)
318 goto do_sigbus;
319 BUG();
320 }
321 if (ret & VM_FAULT_MAJOR)
322 current->maj_flt++;
323 else
324 current->min_flt++;
325 up_read(&mm->mmap_sem);
326 return 0;
327
328bad_area:
329 up_read(&mm->mmap_sem);
330
331bad_area_nosemaphore:
332
333 if (user_mode(regs)) {
334 _exception(SIGSEGV, regs, code, address);
335 return 0;
336 }
337
338 if (is_exec && (error_code & DSISR_PROTFAULT)
339 && printk_ratelimit())
340 printk(KERN_CRIT "kernel tried to execute NX-protected"
341 " page (%lx) - exploit attempt? (uid: %d)\n",
342 address, current->uid);
343
344 return SIGSEGV;
345
346
347
348
349
350out_of_memory:
351 up_read(&mm->mmap_sem);
352 if (is_global_init(current)) {
353 yield();
354 down_read(&mm->mmap_sem);
355 goto survive;
356 }
357 printk("VM: killing process %s\n", current->comm);
358 if (user_mode(regs))
359 do_group_exit(SIGKILL);
360 return SIGKILL;
361
362do_sigbus:
363 up_read(&mm->mmap_sem);
364 if (user_mode(regs)) {
365 info.si_signo = SIGBUS;
366 info.si_errno = 0;
367 info.si_code = BUS_ADRERR;
368 info.si_addr = (void __user *)address;
369 force_sig_info(SIGBUS, &info, current);
370 return 0;
371 }
372 return SIGBUS;
373}
374
375
376
377
378
379
380void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
381{
382 const struct exception_table_entry *entry;
383
384
385 if ((entry = search_exception_tables(regs->nip)) != NULL) {
386 regs->nip = entry->fixup;
387 return;
388 }
389
390
391
392 switch (regs->trap) {
393 case 0x300:
394 case 0x380:
395 printk(KERN_ALERT "Unable to handle kernel paging request for "
396 "data at address 0x%08lx\n", regs->dar);
397 break;
398 case 0x400:
399 case 0x480:
400 printk(KERN_ALERT "Unable to handle kernel paging request for "
401 "instruction fetch\n");
402 break;
403 default:
404 printk(KERN_ALERT "Unable to handle kernel paging request for "
405 "unknown fault\n");
406 break;
407 }
408 printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
409 regs->nip);
410
411 die("Kernel access of bad area", regs, sig);
412}
413