]> Pileus Git - ~andy/linux/blob - arch/parisc/kernel/traps.c
[PARISC] Generic BUG
[~andy/linux] / arch / parisc / kernel / traps.c
1 /*
2  *  linux/arch/parisc/traps.c
3  *
4  *  Copyright (C) 1991, 1992  Linus Torvalds
5  *  Copyright (C) 1999, 2000  Philipp Rumpf <prumpf@tux.org>
6  */
7
8 /*
9  * 'Traps.c' handles hardware traps and faults after we have saved some
10  * state in 'asm.s'.
11  */
12
13 #include <linux/sched.h>
14 #include <linux/kernel.h>
15 #include <linux/string.h>
16 #include <linux/errno.h>
17 #include <linux/ptrace.h>
18 #include <linux/timer.h>
19 #include <linux/delay.h>
20 #include <linux/mm.h>
21 #include <linux/module.h>
22 #include <linux/smp.h>
23 #include <linux/smp_lock.h>
24 #include <linux/spinlock.h>
25 #include <linux/init.h>
26 #include <linux/interrupt.h>
27 #include <linux/console.h>
28 #include <linux/kallsyms.h>
29 #include <linux/bug.h>
30
31 #include <asm/assembly.h>
32 #include <asm/system.h>
33 #include <asm/uaccess.h>
34 #include <asm/io.h>
35 #include <asm/irq.h>
36 #include <asm/traps.h>
37 #include <asm/unaligned.h>
38 #include <asm/atomic.h>
39 #include <asm/smp.h>
40 #include <asm/pdc.h>
41 #include <asm/pdc_chassis.h>
42 #include <asm/unwind.h>
43 #include <asm/tlbflush.h>
44 #include <asm/cacheflush.h>
45
46 #include "../math-emu/math-emu.h"       /* for handle_fpe() */
47
48 #define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */
49                           /*  dumped to the console via printk)          */
50
51 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
52 DEFINE_SPINLOCK(pa_dbit_lock);
53 #endif
54
55 static int printbinary(char *buf, unsigned long x, int nbits)
56 {
57         unsigned long mask = 1UL << (nbits - 1);
58         while (mask != 0) {
59                 *buf++ = (mask & x ? '1' : '0');
60                 mask >>= 1;
61         }
62         *buf = '\0';
63
64         return nbits;
65 }
66
67 #ifdef __LP64__
68 #define RFMT "%016lx"
69 #else
70 #define RFMT "%08lx"
71 #endif
72 #define FFMT "%016llx"  /* fpregs are 64-bit always */
73
74 #define PRINTREGS(lvl,r,f,fmt,x)        \
75         printk("%s%s%02d-%02d  " fmt " " fmt " " fmt " " fmt "\n",      \
76                 lvl, f, (x), (x+3), (r)[(x)+0], (r)[(x)+1],             \
77                 (r)[(x)+2], (r)[(x)+3])
78
79 static void print_gr(char *level, struct pt_regs *regs)
80 {
81         int i;
82         char buf[64];
83
84         printk("%s\n", level);
85         printk("%s     YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDI\n", level);
86         printbinary(buf, regs->gr[0], 32);
87         printk("%sPSW: %s %s\n", level, buf, print_tainted());
88
89         for (i = 0; i < 32; i += 4)
90                 PRINTREGS(level, regs->gr, "r", RFMT, i);
91 }
92
93 static void print_fr(char *level, struct pt_regs *regs)
94 {
95         int i;
96         char buf[64];
97         struct { u32 sw[2]; } s;
98
99         /* FR are 64bit everywhere. Need to use asm to get the content
100          * of fpsr/fper1, and we assume that we won't have a FP Identify
101          * in our way, otherwise we're screwed.
102          * The fldd is used to restore the T-bit if there was one, as the
103          * store clears it anyway.
104          * PA2.0 book says "thou shall not use fstw on FPSR/FPERs" - T-Bone */
105         asm volatile ("fstd %%fr0,0(%1) \n\t"
106                       "fldd 0(%1),%%fr0 \n\t"
107                       : "=m" (s) : "r" (&s) : "r0");
108
109         printk("%s\n", level);
110         printk("%s      VZOUICununcqcqcqcqcqcrmunTDVZOUI\n", level);
111         printbinary(buf, s.sw[0], 32);
112         printk("%sFPSR: %s\n", level, buf);
113         printk("%sFPER1: %08x\n", level, s.sw[1]);
114
115         /* here we'll print fr0 again, tho it'll be meaningless */
116         for (i = 0; i < 32; i += 4)
117                 PRINTREGS(level, regs->fr, "fr", FFMT, i);
118 }
119
120 void show_regs(struct pt_regs *regs)
121 {
122         int i;
123         char *level;
124         unsigned long cr30, cr31;
125
126         level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT;
127
128         print_gr(level, regs);
129
130         for (i = 0; i < 8; i += 4)
131                 PRINTREGS(level, regs->sr, "sr", RFMT, i);
132
133         if (user_mode(regs))
134                 print_fr(level, regs);
135
136         cr30 = mfctl(30);
137         cr31 = mfctl(31);
138         printk("%s\n", level);
139         printk("%sIASQ: " RFMT " " RFMT " IAOQ: " RFMT " " RFMT "\n",
140                level, regs->iasq[0], regs->iasq[1], regs->iaoq[0], regs->iaoq[1]);
141         printk("%s IIR: %08lx    ISR: " RFMT "  IOR: " RFMT "\n",
142                level, regs->iir, regs->isr, regs->ior);
143         printk("%s CPU: %8d   CR30: " RFMT " CR31: " RFMT "\n",
144                level, current_thread_info()->cpu, cr30, cr31);
145         printk("%s ORIG_R28: " RFMT "\n", level, regs->orig_r28);
146         printk(level);
147         print_symbol(" IAOQ[0]: %s\n", regs->iaoq[0]);
148         printk(level);
149         print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]);
150         printk(level);
151         print_symbol(" RP(r2): %s\n", regs->gr[2]);
152 }
153
154
155 void dump_stack(void)
156 {
157         show_stack(NULL, NULL);
158 }
159
160 EXPORT_SYMBOL(dump_stack);
161
162 static void do_show_stack(struct unwind_frame_info *info)
163 {
164         int i = 1;
165
166         printk("Backtrace:\n");
167         while (i <= 16) {
168                 if (unwind_once(info) < 0 || info->ip == 0)
169                         break;
170
171                 if (__kernel_text_address(info->ip)) {
172                         printk(" [<" RFMT ">] ", info->ip);
173 #ifdef CONFIG_KALLSYMS
174                         print_symbol("%s\n", info->ip);
175 #else
176                         if ((i & 0x03) == 0)
177                                 printk("\n");
178 #endif
179                         i++;
180                 }
181         }
182         printk("\n");
183 }
184
185 void show_stack(struct task_struct *task, unsigned long *s)
186 {
187         struct unwind_frame_info info;
188
189         if (!task) {
190                 unsigned long sp;
191
192 HERE:
193                 asm volatile ("copy %%r30, %0" : "=r"(sp));
194                 {
195                         struct pt_regs r;
196
197                         memset(&r, 0, sizeof(struct pt_regs));
198                         r.iaoq[0] = (unsigned long)&&HERE;
199                         r.gr[2] = (unsigned long)__builtin_return_address(0);
200                         r.gr[30] = sp;
201
202                         unwind_frame_init(&info, current, &r);
203                 }
204         } else {
205                 unwind_frame_init_from_blocked_task(&info, task);
206         }
207
208         do_show_stack(&info);
209 }
210
211 int is_valid_bugaddr(unsigned long iaoq)
212 {
213         return 1;
214 }
215
216 void die_if_kernel(char *str, struct pt_regs *regs, long err)
217 {
218         if (user_mode(regs)) {
219                 if (err == 0)
220                         return; /* STFU */
221
222                 printk(KERN_CRIT "%s (pid %d): %s (code %ld) at " RFMT "\n",
223                         current->comm, current->pid, str, err, regs->iaoq[0]);
224 #ifdef PRINT_USER_FAULTS
225                 /* XXX for debugging only */
226                 show_regs(regs);
227 #endif
228                 return;
229         }
230
231         oops_in_progress = 1;
232
233         /* Amuse the user in a SPARC fashion */
234         if (err) printk(
235 "      _______________________________ \n"
236 "     < Your System ate a SPARC! Gah! >\n"
237 "      ------------------------------- \n"
238 "             \\   ^__^\n"
239 "              \\  (xx)\\_______\n"
240 "                 (__)\\       )\\/\\\n"
241 "                  U  ||----w |\n"
242 "                     ||     ||\n");
243         
244         /* unlock the pdc lock if necessary */
245         pdc_emergency_unlock();
246
247         /* maybe the kernel hasn't booted very far yet and hasn't been able 
248          * to initialize the serial or STI console. In that case we should 
249          * re-enable the pdc console, so that the user will be able to 
250          * identify the problem. */
251         if (!console_drivers)
252                 pdc_console_restart();
253         
254         if (err)
255                 printk(KERN_CRIT "%s (pid %d): %s (code %ld)\n",
256                         current->comm, current->pid, str, err);
257         show_regs(regs);
258
259         if (in_interrupt())
260                 panic("Fatal exception in interrupt");
261
262         if (panic_on_oops) {
263                 printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
264                 ssleep(5);
265                 panic("Fatal exception");
266         }
267
268         /* Wot's wrong wif bein' racy? */
269         if (current->thread.flags & PARISC_KERNEL_DEATH) {
270                 printk(KERN_CRIT "%s() recursion detected.\n", __FUNCTION__);
271                 local_irq_enable();
272                 while (1);
273         }
274
275         current->thread.flags |= PARISC_KERNEL_DEATH;
276         do_exit(SIGSEGV);
277 }
278
279 int syscall_ipi(int (*syscall) (struct pt_regs *), struct pt_regs *regs)
280 {
281         return syscall(regs);
282 }
283
284 /* gdb uses break 4,8 */
285 #define GDB_BREAK_INSN 0x10004
286 static void handle_gdb_break(struct pt_regs *regs, int wot)
287 {
288         struct siginfo si;
289
290         si.si_signo = SIGTRAP;
291         si.si_errno = 0;
292         si.si_code = wot;
293         si.si_addr = (void __user *) (regs->iaoq[0] & ~3);
294         force_sig_info(SIGTRAP, &si, current);
295 }
296
297 static void handle_break(struct pt_regs *regs)
298 {
299         unsigned iir = regs->iir;
300
301         if (unlikely(iir == PARISC_BUG_BREAK_INSN && !user_mode(regs))) {
302                 /* check if a BUG() or WARN() trapped here.  */
303                 enum bug_trap_type tt;
304                 tt = report_bug(regs->iaoq[0] & ~3);
305                 if (tt == BUG_TRAP_TYPE_WARN) {
306                         regs->iaoq[0] += 4;
307                         regs->iaoq[1] += 4;
308                         return; /* return to next instruction when WARN_ON().  */
309                 }
310                 die_if_kernel("Unknown kernel breakpoint", regs,
311                         (tt == BUG_TRAP_TYPE_NONE) ? 9 : 0);
312         }
313
314 #ifdef PRINT_USER_FAULTS
315         if (unlikely(iir != GDB_BREAK_INSN)) {
316                 printk(KERN_DEBUG "break %d,%d: pid=%d command='%s'\n",
317                         (iir>>13) & ((1<<13)-1), iir & 31,
318                         current->pid, current->comm);
319                 show_regs(regs);
320         }
321 #endif
322
323         /* send standard GDB signal */
324         handle_gdb_break(regs, TRAP_BRKPT);
325 }
326
327 static void default_trap(int code, struct pt_regs *regs)
328 {
329         printk(KERN_ERR "Trap %d on CPU %d\n", code, smp_processor_id());
330         show_regs(regs);
331 }
332
333 void (*cpu_lpmc) (int code, struct pt_regs *regs) __read_mostly = default_trap;
334
335
336 void transfer_pim_to_trap_frame(struct pt_regs *regs)
337 {
338     register int i;
339     extern unsigned int hpmc_pim_data[];
340     struct pdc_hpmc_pim_11 *pim_narrow;
341     struct pdc_hpmc_pim_20 *pim_wide;
342
343     if (boot_cpu_data.cpu_type >= pcxu) {
344
345         pim_wide = (struct pdc_hpmc_pim_20 *)hpmc_pim_data;
346
347         /*
348          * Note: The following code will probably generate a
349          * bunch of truncation error warnings from the compiler.
350          * Could be handled with an ifdef, but perhaps there
351          * is a better way.
352          */
353
354         regs->gr[0] = pim_wide->cr[22];
355
356         for (i = 1; i < 32; i++)
357             regs->gr[i] = pim_wide->gr[i];
358
359         for (i = 0; i < 32; i++)
360             regs->fr[i] = pim_wide->fr[i];
361
362         for (i = 0; i < 8; i++)
363             regs->sr[i] = pim_wide->sr[i];
364
365         regs->iasq[0] = pim_wide->cr[17];
366         regs->iasq[1] = pim_wide->iasq_back;
367         regs->iaoq[0] = pim_wide->cr[18];
368         regs->iaoq[1] = pim_wide->iaoq_back;
369
370         regs->sar  = pim_wide->cr[11];
371         regs->iir  = pim_wide->cr[19];
372         regs->isr  = pim_wide->cr[20];
373         regs->ior  = pim_wide->cr[21];
374     }
375     else {
376         pim_narrow = (struct pdc_hpmc_pim_11 *)hpmc_pim_data;
377
378         regs->gr[0] = pim_narrow->cr[22];
379
380         for (i = 1; i < 32; i++)
381             regs->gr[i] = pim_narrow->gr[i];
382
383         for (i = 0; i < 32; i++)
384             regs->fr[i] = pim_narrow->fr[i];
385
386         for (i = 0; i < 8; i++)
387             regs->sr[i] = pim_narrow->sr[i];
388
389         regs->iasq[0] = pim_narrow->cr[17];
390         regs->iasq[1] = pim_narrow->iasq_back;
391         regs->iaoq[0] = pim_narrow->cr[18];
392         regs->iaoq[1] = pim_narrow->iaoq_back;
393
394         regs->sar  = pim_narrow->cr[11];
395         regs->iir  = pim_narrow->cr[19];
396         regs->isr  = pim_narrow->cr[20];
397         regs->ior  = pim_narrow->cr[21];
398     }
399
400     /*
401      * The following fields only have meaning if we came through
402      * another path. So just zero them here.
403      */
404
405     regs->ksp = 0;
406     regs->kpc = 0;
407     regs->orig_r28 = 0;
408 }
409
410
411 /*
412  * This routine is called as a last resort when everything else
413  * has gone clearly wrong. We get called for faults in kernel space,
414  * and HPMC's.
415  */
416 void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long offset)
417 {
418         static DEFINE_SPINLOCK(terminate_lock);
419
420         oops_in_progress = 1;
421
422         set_eiem(0);
423         local_irq_disable();
424         spin_lock(&terminate_lock);
425
426         /* unlock the pdc lock if necessary */
427         pdc_emergency_unlock();
428
429         /* restart pdc console if necessary */
430         if (!console_drivers)
431                 pdc_console_restart();
432
433         /* Not all paths will gutter the processor... */
434         switch(code){
435
436         case 1:
437                 transfer_pim_to_trap_frame(regs);
438                 break;
439
440         default:
441                 /* Fall through */
442                 break;
443
444         }
445             
446         {
447                 /* show_stack(NULL, (unsigned long *)regs->gr[30]); */
448                 struct unwind_frame_info info;
449                 unwind_frame_init(&info, current, regs);
450                 do_show_stack(&info);
451         }
452
453         printk("\n");
454         printk(KERN_CRIT "%s: Code=%d regs=%p (Addr=" RFMT ")\n",
455                         msg, code, regs, offset);
456         show_regs(regs);
457
458         spin_unlock(&terminate_lock);
459
460         /* put soft power button back under hardware control;
461          * if the user had pressed it once at any time, the 
462          * system will shut down immediately right here. */
463         pdc_soft_power_button(0);
464         
465         /* Call kernel panic() so reboot timeouts work properly 
466          * FIXME: This function should be on the list of
467          * panic notifiers, and we should call panic
468          * directly from the location that we wish. 
469          * e.g. We should not call panic from
470          * parisc_terminate, but rather the oter way around.
471          * This hack works, prints the panic message twice,
472          * and it enables reboot timers!
473          */
474         panic(msg);
475 }
476
477 void handle_interruption(int code, struct pt_regs *regs)
478 {
479         unsigned long fault_address = 0;
480         unsigned long fault_space = 0;
481         struct siginfo si;
482
483         if (code == 1)
484             pdc_console_restart();  /* switch back to pdc if HPMC */
485         else
486             local_irq_enable();
487
488         /* Security check:
489          * If the priority level is still user, and the
490          * faulting space is not equal to the active space
491          * then the user is attempting something in a space
492          * that does not belong to them. Kill the process.
493          *
494          * This is normally the situation when the user
495          * attempts to jump into the kernel space at the
496          * wrong offset, be it at the gateway page or a
497          * random location.
498          *
499          * We cannot normally signal the process because it
500          * could *be* on the gateway page, and processes
501          * executing on the gateway page can't have signals
502          * delivered.
503          * 
504          * We merely readjust the address into the users
505          * space, at a destination address of zero, and
506          * allow processing to continue.
507          */
508         if (((unsigned long)regs->iaoq[0] & 3) &&
509             ((unsigned long)regs->iasq[0] != (unsigned long)regs->sr[7])) { 
510                 /* Kill the user process later */
511                 regs->iaoq[0] = 0 | 3;
512                 regs->iaoq[1] = regs->iaoq[0] + 4;
513                 regs->iasq[0] = regs->iasq[0] = regs->sr[7];
514                 regs->gr[0] &= ~PSW_B;
515                 return;
516         }
517         
518 #if 0
519         printk(KERN_CRIT "Interruption # %d\n", code);
520 #endif
521
522         switch(code) {
523
524         case  1:
525                 /* High-priority machine check (HPMC) */
526                 
527                 /* set up a new led state on systems shipped with a LED State panel */
528                 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_HPMC);
529                     
530                 parisc_terminate("High Priority Machine Check (HPMC)",
531                                 regs, code, 0);
532                 /* NOT REACHED */
533                 
534         case  2:
535                 /* Power failure interrupt */
536                 printk(KERN_CRIT "Power failure interrupt !\n");
537                 return;
538
539         case  3:
540                 /* Recovery counter trap */
541                 regs->gr[0] &= ~PSW_R;
542                 if (user_space(regs))
543                         handle_gdb_break(regs, TRAP_TRACE);
544                 /* else this must be the start of a syscall - just let it run */
545                 return;
546
547         case  5:
548                 /* Low-priority machine check */
549                 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_LPMC);
550                 
551                 flush_cache_all();
552                 flush_tlb_all();
553                 cpu_lpmc(5, regs);
554                 return;
555
556         case  6:
557                 /* Instruction TLB miss fault/Instruction page fault */
558                 fault_address = regs->iaoq[0];
559                 fault_space   = regs->iasq[0];
560                 break;
561
562         case  8:
563                 /* Illegal instruction trap */
564                 die_if_kernel("Illegal instruction", regs, code);
565                 si.si_code = ILL_ILLOPC;
566                 goto give_sigill;
567
568         case  9:
569                 /* Break instruction trap */
570                 handle_break(regs);
571                 return;
572         
573         case 10:
574                 /* Privileged operation trap */
575                 die_if_kernel("Privileged operation", regs, code);
576                 si.si_code = ILL_PRVOPC;
577                 goto give_sigill;
578         
579         case 11:
580                 /* Privileged register trap */
581                 if ((regs->iir & 0xffdfffe0) == 0x034008a0) {
582
583                         /* This is a MFCTL cr26/cr27 to gr instruction.
584                          * PCXS traps on this, so we need to emulate it.
585                          */
586
587                         if (regs->iir & 0x00200000)
588                                 regs->gr[regs->iir & 0x1f] = mfctl(27);
589                         else
590                                 regs->gr[regs->iir & 0x1f] = mfctl(26);
591
592                         regs->iaoq[0] = regs->iaoq[1];
593                         regs->iaoq[1] += 4;
594                         regs->iasq[0] = regs->iasq[1];
595                         return;
596                 }
597
598                 die_if_kernel("Privileged register usage", regs, code);
599                 si.si_code = ILL_PRVREG;
600         give_sigill:
601                 si.si_signo = SIGILL;
602                 si.si_errno = 0;
603                 si.si_addr = (void __user *) regs->iaoq[0];
604                 force_sig_info(SIGILL, &si, current);
605                 return;
606
607         case 12:
608                 /* Overflow Trap, let the userland signal handler do the cleanup */
609                 si.si_signo = SIGFPE;
610                 si.si_code = FPE_INTOVF;
611                 si.si_addr = (void __user *) regs->iaoq[0];
612                 force_sig_info(SIGFPE, &si, current);
613                 return;
614                 
615         case 13:
616                 /* Conditional Trap
617                    The condition succees in an instruction which traps 
618                    on condition  */
619                 if(user_mode(regs)){
620                         si.si_signo = SIGFPE;
621                         /* Set to zero, and let the userspace app figure it out from
622                            the insn pointed to by si_addr */
623                         si.si_code = 0;
624                         si.si_addr = (void __user *) regs->iaoq[0];
625                         force_sig_info(SIGFPE, &si, current);
626                         return;
627                 } 
628                 /* The kernel doesn't want to handle condition codes */
629                 break;
630                 
631         case 14:
632                 /* Assist Exception Trap, i.e. floating point exception. */
633                 die_if_kernel("Floating point exception", regs, 0); /* quiet */
634                 handle_fpe(regs);
635                 return;
636                 
637         case 15:
638                 /* Data TLB miss fault/Data page fault */
639                 /* Fall through */
640         case 16:
641                 /* Non-access instruction TLB miss fault */
642                 /* The instruction TLB entry needed for the target address of the FIC
643                    is absent, and hardware can't find it, so we get to cleanup */
644                 /* Fall through */
645         case 17:
646                 /* Non-access data TLB miss fault/Non-access data page fault */
647                 /* FIXME: 
648                          Still need to add slow path emulation code here!
649                          If the insn used a non-shadow register, then the tlb
650                          handlers could not have their side-effect (e.g. probe
651                          writing to a target register) emulated since rfir would
652                          erase the changes to said register. Instead we have to
653                          setup everything, call this function we are in, and emulate
654                          by hand. Technically we need to emulate:
655                          fdc,fdce,pdc,"fic,4f",prober,probeir,probew, probeiw
656                 */                        
657                 fault_address = regs->ior;
658                 fault_space = regs->isr;
659                 break;
660
661         case 18:
662                 /* PCXS only -- later cpu's split this into types 26,27 & 28 */
663                 /* Check for unaligned access */
664                 if (check_unaligned(regs)) {
665                         handle_unaligned(regs);
666                         return;
667                 }
668                 /* Fall Through */
669         case 26: 
670                 /* PCXL: Data memory access rights trap */
671                 fault_address = regs->ior;
672                 fault_space   = regs->isr;
673                 break;
674
675         case 19:
676                 /* Data memory break trap */
677                 regs->gr[0] |= PSW_X; /* So we can single-step over the trap */
678                 /* fall thru */
679         case 21:
680                 /* Page reference trap */
681                 handle_gdb_break(regs, TRAP_HWBKPT);
682                 return;
683
684         case 25:
685                 /* Taken branch trap */
686                 regs->gr[0] &= ~PSW_T;
687                 if (user_space(regs))
688                         handle_gdb_break(regs, TRAP_BRANCH);
689                 /* else this must be the start of a syscall - just let it
690                  * run.
691                  */
692                 return;
693
694         case  7:  
695                 /* Instruction access rights */
696                 /* PCXL: Instruction memory protection trap */
697
698                 /*
699                  * This could be caused by either: 1) a process attempting
700                  * to execute within a vma that does not have execute
701                  * permission, or 2) an access rights violation caused by a
702                  * flush only translation set up by ptep_get_and_clear().
703                  * So we check the vma permissions to differentiate the two.
704                  * If the vma indicates we have execute permission, then
705                  * the cause is the latter one. In this case, we need to
706                  * call do_page_fault() to fix the problem.
707                  */
708
709                 if (user_mode(regs)) {
710                         struct vm_area_struct *vma;
711
712                         down_read(&current->mm->mmap_sem);
713                         vma = find_vma(current->mm,regs->iaoq[0]);
714                         if (vma && (regs->iaoq[0] >= vma->vm_start)
715                                 && (vma->vm_flags & VM_EXEC)) {
716
717                                 fault_address = regs->iaoq[0];
718                                 fault_space = regs->iasq[0];
719
720                                 up_read(&current->mm->mmap_sem);
721                                 break; /* call do_page_fault() */
722                         }
723                         up_read(&current->mm->mmap_sem);
724                 }
725                 /* Fall Through */
726         case 27: 
727                 /* Data memory protection ID trap */
728                 die_if_kernel("Protection id trap", regs, code);
729                 si.si_code = SEGV_MAPERR;
730                 si.si_signo = SIGSEGV;
731                 si.si_errno = 0;
732                 if (code == 7)
733                     si.si_addr = (void __user *) regs->iaoq[0];
734                 else
735                     si.si_addr = (void __user *) regs->ior;
736                 force_sig_info(SIGSEGV, &si, current);
737                 return;
738
739         case 28: 
740                 /* Unaligned data reference trap */
741                 handle_unaligned(regs);
742                 return;
743
744         default:
745                 if (user_mode(regs)) {
746 #ifdef PRINT_USER_FAULTS
747                         printk(KERN_DEBUG "\nhandle_interruption() pid=%d command='%s'\n",
748                             current->pid, current->comm);
749                         show_regs(regs);
750 #endif
751                         /* SIGBUS, for lack of a better one. */
752                         si.si_signo = SIGBUS;
753                         si.si_code = BUS_OBJERR;
754                         si.si_errno = 0;
755                         si.si_addr = (void __user *) regs->ior;
756                         force_sig_info(SIGBUS, &si, current);
757                         return;
758                 }
759                 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
760                 
761                 parisc_terminate("Unexpected interruption", regs, code, 0);
762                 /* NOT REACHED */
763         }
764
765         if (user_mode(regs)) {
766             if ((fault_space >> SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) {
767 #ifdef PRINT_USER_FAULTS
768                 if (fault_space == 0)
769                         printk(KERN_DEBUG "User Fault on Kernel Space ");
770                 else
771                         printk(KERN_DEBUG "User Fault (long pointer) (fault %d) ",
772                                code);
773                 printk("pid=%d command='%s'\n", current->pid, current->comm);
774                 show_regs(regs);
775 #endif
776                 si.si_signo = SIGSEGV;
777                 si.si_errno = 0;
778                 si.si_code = SEGV_MAPERR;
779                 si.si_addr = (void __user *) regs->ior;
780                 force_sig_info(SIGSEGV, &si, current);
781                 return;
782             }
783         }
784         else {
785
786             /*
787              * The kernel should never fault on its own address space.
788              */
789
790             if (fault_space == 0) 
791             {
792                 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC);
793                 parisc_terminate("Kernel Fault", regs, code, fault_address);
794         
795             }
796         }
797
798         do_page_fault(regs, code, fault_address);
799 }
800
801
802 int __init check_ivt(void *iva)
803 {
804         int i;
805         u32 check = 0;
806         u32 *ivap;
807         u32 *hpmcp;
808         u32 length;
809         extern void os_hpmc(void);
810         extern void os_hpmc_end(void);
811
812         if (strcmp((char *)iva, "cows can fly"))
813                 return -1;
814
815         ivap = (u32 *)iva;
816
817         for (i = 0; i < 8; i++)
818             *ivap++ = 0;
819
820         /* Compute Checksum for HPMC handler */
821
822         length = (u32)((unsigned long)os_hpmc_end - (unsigned long)os_hpmc);
823         ivap[7] = length;
824
825         hpmcp = (u32 *)os_hpmc;
826
827         for (i=0; i<length/4; i++)
828             check += *hpmcp++;
829
830         for (i=0; i<8; i++)
831             check += ivap[i];
832
833         ivap[5] = -check;
834
835         return 0;
836 }
837         
838 #ifndef __LP64__
839 extern const void fault_vector_11;
840 #endif
841 extern const void fault_vector_20;
842
843 void __init trap_init(void)
844 {
845         void *iva;
846
847         if (boot_cpu_data.cpu_type >= pcxu)
848                 iva = (void *) &fault_vector_20;
849         else
850 #ifdef __LP64__
851                 panic("Can't boot 64-bit OS on PA1.1 processor!");
852 #else
853                 iva = (void *) &fault_vector_11;
854 #endif
855
856         if (check_ivt(iva))
857                 panic("IVT invalid");
858 }