ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / sparc / mm / fault.c
1 /* $Id: fault.c,v 1.122 2001/11/17 07:19:26 davem Exp $
2  * fault.c:  Page fault handlers for the Sparc.
3  *
4  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
5  * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
6  * Copyright (C) 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7  */
8
9 #include <asm/head.h>
10
11 #include <linux/string.h>
12 #include <linux/types.h>
13 #include <linux/sched.h>
14 #include <linux/ptrace.h>
15 #include <linux/mman.h>
16 #include <linux/threads.h>
17 #include <linux/kernel.h>
18 #include <linux/signal.h>
19 #include <linux/mm.h>
20 #include <linux/smp.h>
21 #include <linux/smp_lock.h>
22 #include <linux/interrupt.h>
23 #include <linux/module.h>
24
25 #include <asm/system.h>
26 #include <asm/segment.h>
27 #include <asm/page.h>
28 #include <asm/pgtable.h>
29 #include <asm/memreg.h>
30 #include <asm/openprom.h>
31 #include <asm/oplib.h>
32 #include <asm/smp.h>
33 #include <asm/traps.h>
34 #include <asm/kdebug.h>
35 #include <asm/uaccess.h>
36
37 #define ELEMENTS(arr) (sizeof (arr)/sizeof (arr[0]))
38
39 extern int prom_node_root;
40
41 /* At boot time we determine these two values necessary for setting
42  * up the segment maps and page table entries (pte's).
43  */
44
45 int num_segmaps, num_contexts;
46 int invalid_segment;
47
48 /* various Virtual Address Cache parameters we find at boot time... */
49
50 int vac_size, vac_linesize, vac_do_hw_vac_flushes;
51 int vac_entries_per_context, vac_entries_per_segment;
52 int vac_entries_per_page;
53
54 /* Nice, simple, prom library does all the sweating for us. ;) */
55 int prom_probe_memory (void)
56 {
57         register struct linux_mlist_v0 *mlist;
58         register unsigned long bytes, base_paddr, tally;
59         register int i;
60
61         i = 0;
62         mlist= *prom_meminfo()->v0_available;
63         bytes = tally = mlist->num_bytes;
64         base_paddr = (unsigned long) mlist->start_adr;
65   
66         sp_banks[0].base_addr = base_paddr;
67         sp_banks[0].num_bytes = bytes;
68
69         while (mlist->theres_more != (void *) 0){
70                 i++;
71                 mlist = mlist->theres_more;
72                 bytes = mlist->num_bytes;
73                 tally += bytes;
74                 if (i > SPARC_PHYS_BANKS-1) {
75                         printk ("The machine has more banks than "
76                                 "this kernel can support\n"
77                                 "Increase the SPARC_PHYS_BANKS "
78                                 "setting (currently %d)\n",
79                                 SPARC_PHYS_BANKS);
80                         i = SPARC_PHYS_BANKS-1;
81                         break;
82                 }
83     
84                 sp_banks[i].base_addr = (unsigned long) mlist->start_adr;
85                 sp_banks[i].num_bytes = mlist->num_bytes;
86         }
87
88         i++;
89         sp_banks[i].base_addr = 0xdeadbeef;
90         sp_banks[i].num_bytes = 0;
91
92         /* Now mask all bank sizes on a page boundary, it is all we can
93          * use anyways.
94          */
95         for(i=0; sp_banks[i].num_bytes != 0; i++)
96                 sp_banks[i].num_bytes &= PAGE_MASK;
97
98         return tally;
99 }
100
101 /* Traverse the memory lists in the prom to see how much physical we
102  * have.
103  */
104 unsigned long
105 probe_memory(void)
106 {
107         int total;
108
109         total = prom_probe_memory();
110
111         /* Oh man, much nicer, keep the dirt in promlib. */
112         return total;
113 }
114
115 extern void sun4c_complete_all_stores(void);
116
117 /* Whee, a level 15 NMI interrupt memory error.  Let's have fun... */
118 asmlinkage void sparc_lvl15_nmi(struct pt_regs *regs, unsigned long serr,
119                                 unsigned long svaddr, unsigned long aerr,
120                                 unsigned long avaddr)
121 {
122         sun4c_complete_all_stores();
123         printk("FAULT: NMI received\n");
124         printk("SREGS: Synchronous Error %08lx\n", serr);
125         printk("       Synchronous Vaddr %08lx\n", svaddr);
126         printk("      Asynchronous Error %08lx\n", aerr);
127         printk("      Asynchronous Vaddr %08lx\n", avaddr);
128         if (sun4c_memerr_reg)
129                 printk("     Memory Parity Error %08lx\n", *sun4c_memerr_reg);
130         printk("REGISTER DUMP:\n");
131         show_regs(regs);
132         prom_halt();
133 }
134
135 static void unhandled_fault(unsigned long, struct task_struct *,
136                 struct pt_regs *) __attribute__ ((noreturn));
137
138 static void unhandled_fault(unsigned long address, struct task_struct *tsk,
139                      struct pt_regs *regs)
140 {
141         if((unsigned long) address < PAGE_SIZE) {
142                 printk(KERN_ALERT
143                     "Unable to handle kernel NULL pointer dereference\n");
144         } else {
145                 printk(KERN_ALERT "Unable to handle kernel paging request "
146                        "at virtual address %08lx\n", address);
147         }
148         printk(KERN_ALERT "tsk->{mm,active_mm}->context = %08lx\n",
149                 (tsk->mm ? tsk->mm->context : tsk->active_mm->context));
150         printk(KERN_ALERT "tsk->{mm,active_mm}->pgd = %08lx\n",
151                 (tsk->mm ? (unsigned long) tsk->mm->pgd :
152                         (unsigned long) tsk->active_mm->pgd));
153         die_if_kernel("Oops", regs);
154 }
155
156 asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc, 
157                             unsigned long address)
158 {
159         struct pt_regs regs;
160         unsigned long g2;
161         unsigned int insn;
162         int i;
163         
164         i = search_extables_range(ret_pc, &g2);
165         switch (i) {
166         case 3:
167                 /* load & store will be handled by fixup */
168                 return 3;
169
170         case 1:
171                 /* store will be handled by fixup, load will bump out */
172                 /* for _to_ macros */
173                 insn = *((unsigned int *) pc);
174                 if ((insn >> 21) & 1)
175                         return 1;
176                 break;
177
178         case 2:
179                 /* load will be handled by fixup, store will bump out */
180                 /* for _from_ macros */
181                 insn = *((unsigned int *) pc);
182                 if (!((insn >> 21) & 1) || ((insn>>19)&0x3f) == 15)
183                         return 2; 
184                 break; 
185
186         default:
187                 break;
188         };
189
190         memset(&regs, 0, sizeof (regs));
191         regs.pc = pc;
192         regs.npc = pc + 4;
193         __asm__ __volatile__(
194                 "rd %%psr, %0\n\t"
195                 "nop\n\t"
196                 "nop\n\t"
197                 "nop\n" : "=r" (regs.psr));
198         unhandled_fault(address, current, &regs);
199
200         /* Not reached */
201         return 0;
202 }
203
204 asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
205                                unsigned long address)
206 {
207         struct vm_area_struct *vma;
208         struct task_struct *tsk = current;
209         struct mm_struct *mm = tsk->mm;
210         unsigned int fixup;
211         unsigned long g2;
212         siginfo_t info;
213         int from_user = !(regs->psr & PSR_PS);
214
215         if(text_fault)
216                 address = regs->pc;
217
218         /*
219          * We fault-in kernel-space virtual memory on-demand. The
220          * 'reference' page table is init_mm.pgd.
221          *
222          * NOTE! We MUST NOT take any locks for this case. We may
223          * be in an interrupt or a critical region, and should
224          * only copy the information from the master page table,
225          * nothing more.
226          */
227         if (!ARCH_SUN4C_SUN4 && address >= TASK_SIZE)
228                 goto vmalloc_fault;
229
230         info.si_code = SEGV_MAPERR;
231
232         /*
233          * If we're in an interrupt or have no user
234          * context, we must not take the fault..
235          */
236         if (in_atomic() || !mm)
237                 goto no_context;
238
239         down_read(&mm->mmap_sem);
240
241         /*
242          * The kernel referencing a bad kernel pointer can lock up
243          * a sun4c machine completely, so we must attempt recovery.
244          */
245         if(!from_user && address >= PAGE_OFFSET)
246                 goto bad_area;
247
248         vma = find_vma(mm, address);
249         if(!vma)
250                 goto bad_area;
251         if(vma->vm_start <= address)
252                 goto good_area;
253         if(!(vma->vm_flags & VM_GROWSDOWN))
254                 goto bad_area;
255         if(expand_stack(vma, address))
256                 goto bad_area;
257         /*
258          * Ok, we have a good vm_area for this memory access, so
259          * we can handle it..
260          */
261 good_area:
262         info.si_code = SEGV_ACCERR;
263         if(write) {
264                 if(!(vma->vm_flags & VM_WRITE))
265                         goto bad_area;
266         } else {
267                 /* Allow reads even for write-only mappings */
268                 if(!(vma->vm_flags & (VM_READ | VM_EXEC)))
269                         goto bad_area;
270         }
271
272         /*
273          * If for any reason at all we couldn't handle the fault,
274          * make sure we exit gracefully rather than endlessly redo
275          * the fault.
276          */
277         switch (handle_mm_fault(mm, vma, address, write)) {
278         case 1:
279                 current->min_flt++;
280                 break;
281         case 2:
282                 current->maj_flt++;
283                 break;
284         case 0:
285                 goto do_sigbus;
286         default:
287                 goto out_of_memory;
288         }
289         up_read(&mm->mmap_sem);
290         return;
291
292         /*
293          * Something tried to access memory that isn't in our memory map..
294          * Fix it, but check if it's kernel or user first..
295          */
296 bad_area:
297         up_read(&mm->mmap_sem);
298
299 bad_area_nosemaphore:
300         /* User mode accesses just cause a SIGSEGV */
301         if(from_user) {
302 #if 0
303                 printk("Fault whee %s [%d]: segfaults at %08lx pc=%08lx\n",
304                        tsk->comm, tsk->pid, address, regs->pc);
305 #endif
306                 info.si_signo = SIGSEGV;
307                 info.si_errno = 0;
308                 /* info.si_code set above to make clear whether
309                    this was a SEGV_MAPERR or SEGV_ACCERR fault.  */
310                 info.si_addr = (void *)address;
311                 info.si_trapno = 0;
312                 force_sig_info (SIGSEGV, &info, tsk);
313                 return;
314         }
315
316         /* Is this in ex_table? */
317 no_context:
318         g2 = regs->u_regs[UREG_G2];
319         if (!from_user && (fixup = search_extables_range(regs->pc, &g2))) {
320                 if (fixup > 10) { /* Values below are reserved for other things */
321                         extern const unsigned __memset_start[];
322                         extern const unsigned __memset_end[];
323                         extern const unsigned __csum_partial_copy_start[];
324                         extern const unsigned __csum_partial_copy_end[];
325
326 #ifdef DEBUG_EXCEPTIONS
327                         printk("Exception: PC<%08lx> faddr<%08lx>\n", regs->pc, address);
328                         printk("EX_TABLE: insn<%08lx> fixup<%08x> g2<%08lx>\n",
329                                 regs->pc, fixup, g2);
330 #endif
331                         if ((regs->pc >= (unsigned long)__memset_start &&
332                              regs->pc < (unsigned long)__memset_end) ||
333                             (regs->pc >= (unsigned long)__csum_partial_copy_start &&
334                              regs->pc < (unsigned long)__csum_partial_copy_end)) {
335                                 regs->u_regs[UREG_I4] = address;
336                                 regs->u_regs[UREG_I5] = regs->pc;
337                         }
338                         regs->u_regs[UREG_G2] = g2;
339                         regs->pc = fixup;
340                         regs->npc = regs->pc + 4;
341                         return;
342                 }
343         }
344         
345         unhandled_fault (address, tsk, regs);
346         do_exit(SIGKILL);
347
348 /*
349  * We ran out of memory, or some other thing happened to us that made
350  * us unable to handle the page fault gracefully.
351  */
352 out_of_memory:
353         up_read(&mm->mmap_sem);
354         printk("VM: killing process %s\n", tsk->comm);
355         if (from_user)
356                 do_exit(SIGKILL);
357         goto no_context;
358
359 do_sigbus:
360         up_read(&mm->mmap_sem);
361         info.si_signo = SIGBUS;
362         info.si_errno = 0;
363         info.si_code = BUS_ADRERR;
364         info.si_addr = (void *)address;
365         info.si_trapno = 0;
366         force_sig_info (SIGBUS, &info, tsk);
367         if (!from_user)
368                 goto no_context;
369
370 vmalloc_fault:
371         {
372                 /*
373                  * Synchronize this task's top level page-table
374                  * with the 'reference' page table.
375                  */
376                 int offset = pgd_index(address);
377                 pgd_t *pgd, *pgd_k;
378                 pmd_t *pmd, *pmd_k;
379
380                 pgd = tsk->active_mm->pgd + offset;
381                 pgd_k = init_mm.pgd + offset;
382
383                 if (!pgd_present(*pgd)) {
384                         if (!pgd_present(*pgd_k))
385                                 goto bad_area_nosemaphore;
386                         pgd_val(*pgd) = pgd_val(*pgd_k);
387                         return;
388                 }
389
390                 pmd = pmd_offset(pgd, address);
391                 pmd_k = pmd_offset(pgd_k, address);
392
393                 if (pmd_present(*pmd) || !pmd_present(*pmd_k))
394                         goto bad_area_nosemaphore;
395                 *pmd = *pmd_k;
396                 return;
397         }
398 }
399
400 asmlinkage void do_sun4c_fault(struct pt_regs *regs, int text_fault, int write,
401                                unsigned long address)
402 {
403         extern void sun4c_update_mmu_cache(struct vm_area_struct *,
404                                            unsigned long,pte_t);
405         extern pte_t *sun4c_pte_offset_kernel(pmd_t *,unsigned long);
406         struct task_struct *tsk = current;
407         struct mm_struct *mm = tsk->mm;
408         pgd_t *pgdp;
409         pte_t *ptep;
410
411         if (text_fault) {
412                 address = regs->pc;
413         } else if (!write &&
414                    !(regs->psr & PSR_PS)) {
415                 unsigned int insn, *ip;
416
417                 ip = (unsigned int *)regs->pc;
418                 if (! get_user(insn, ip)) {
419                         if ((insn & 0xc1680000) == 0xc0680000)
420                                 write = 1;
421                 }
422         }
423
424         if (!mm) {
425                 /* We are oopsing. */
426                 do_sparc_fault(regs, text_fault, write, address);
427                 BUG();  /* P3 Oops already, you bitch */
428         }
429
430         pgdp = pgd_offset(mm, address);
431         ptep = sun4c_pte_offset_kernel((pmd_t *) pgdp, address);
432
433         if (pgd_val(*pgdp)) {
434             if (write) {
435                 if ((pte_val(*ptep) & (_SUN4C_PAGE_WRITE|_SUN4C_PAGE_PRESENT))
436                                    == (_SUN4C_PAGE_WRITE|_SUN4C_PAGE_PRESENT)) {
437                         unsigned long flags;
438
439                         *ptep = __pte(pte_val(*ptep) | _SUN4C_PAGE_ACCESSED |
440                                       _SUN4C_PAGE_MODIFIED |
441                                       _SUN4C_PAGE_VALID |
442                                       _SUN4C_PAGE_DIRTY);
443
444                         local_irq_save(flags);
445                         if (sun4c_get_segmap(address) != invalid_segment) {
446                                 sun4c_put_pte(address, pte_val(*ptep));
447                                 local_irq_restore(flags);
448                                 return;
449                         }
450                         local_irq_restore(flags);
451                 }
452             } else {
453                 if ((pte_val(*ptep) & (_SUN4C_PAGE_READ|_SUN4C_PAGE_PRESENT))
454                                    == (_SUN4C_PAGE_READ|_SUN4C_PAGE_PRESENT)) {
455                         unsigned long flags;
456
457                         *ptep = __pte(pte_val(*ptep) | _SUN4C_PAGE_ACCESSED |
458                                       _SUN4C_PAGE_VALID);
459
460                         local_irq_save(flags);
461                         if (sun4c_get_segmap(address) != invalid_segment) {
462                                 sun4c_put_pte(address, pte_val(*ptep));
463                                 local_irq_restore(flags);
464                                 return;
465                         }
466                         local_irq_restore(flags);
467                 }
468             }
469         }
470
471         /* This conditional is 'interesting'. */
472         if (pgd_val(*pgdp) && !(write && !(pte_val(*ptep) & _SUN4C_PAGE_WRITE))
473             && (pte_val(*ptep) & _SUN4C_PAGE_VALID))
474                 /* Note: It is safe to not grab the MMAP semaphore here because
475                  *       we know that update_mmu_cache() will not sleep for
476                  *       any reason (at least not in the current implementation)
477                  *       and therefore there is no danger of another thread getting
478                  *       on the CPU and doing a shrink_mmap() on this vma.
479                  */
480                 sun4c_update_mmu_cache (find_vma(current->mm, address), address,
481                                         *ptep);
482         else
483                 do_sparc_fault(regs, text_fault, write, address);
484 }
485
486 /* This always deals with user addresses. */
487 inline void force_user_fault(unsigned long address, int write)
488 {
489         struct vm_area_struct *vma;
490         struct task_struct *tsk = current;
491         struct mm_struct *mm = tsk->mm;
492         siginfo_t info;
493
494         info.si_code = SEGV_MAPERR;
495
496 #if 0
497         printk("wf<pid=%d,wr=%d,addr=%08lx>\n",
498                tsk->pid, write, address);
499 #endif
500         down_read(&mm->mmap_sem);
501         vma = find_vma(mm, address);
502         if(!vma)
503                 goto bad_area;
504         if(vma->vm_start <= address)
505                 goto good_area;
506         if(!(vma->vm_flags & VM_GROWSDOWN))
507                 goto bad_area;
508         if(expand_stack(vma, address))
509                 goto bad_area;
510 good_area:
511         info.si_code = SEGV_ACCERR;
512         if(write) {
513                 if(!(vma->vm_flags & VM_WRITE))
514                         goto bad_area;
515         } else {
516                 if(!(vma->vm_flags & (VM_READ | VM_EXEC)))
517                         goto bad_area;
518         }
519         if (!handle_mm_fault(mm, vma, address, write))
520                 goto do_sigbus;
521         up_read(&mm->mmap_sem);
522         return;
523 bad_area:
524         up_read(&mm->mmap_sem);
525 #if 0
526         printk("Window whee %s [%d]: segfaults at %08lx\n",
527                tsk->comm, tsk->pid, address);
528 #endif
529         info.si_signo = SIGSEGV;
530         info.si_errno = 0;
531         /* info.si_code set above to make clear whether
532            this was a SEGV_MAPERR or SEGV_ACCERR fault.  */
533         info.si_addr = (void *)address;
534         info.si_trapno = 0;
535         force_sig_info (SIGSEGV, &info, tsk);
536         return;
537
538 do_sigbus:
539         up_read(&mm->mmap_sem);
540         info.si_signo = SIGBUS;
541         info.si_errno = 0;
542         info.si_code = BUS_ADRERR;
543         info.si_addr = (void *)address;
544         info.si_trapno = 0;
545         force_sig_info (SIGBUS, &info, tsk);
546 }
547
548 void window_overflow_fault(void)
549 {
550         unsigned long sp;
551
552         sp = current_thread_info()->rwbuf_stkptrs[0];
553         if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
554                 force_user_fault(sp + 0x38, 1);
555         force_user_fault(sp, 1);
556 }
557
558 void window_underflow_fault(unsigned long sp)
559 {
560         if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
561                 force_user_fault(sp + 0x38, 0);
562         force_user_fault(sp, 0);
563 }
564
565 void window_ret_fault(struct pt_regs *regs)
566 {
567         unsigned long sp;
568
569         sp = regs->u_regs[UREG_FP];
570         if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
571                 force_user_fault(sp + 0x38, 0);
572         force_user_fault(sp, 0);
573 }