traps.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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.  * 'Traps.c' handles hardware traps and faults after we have saved some
  9.  * state in 'asm.s'.
  10.  */
  11. #include <linux/config.h>
  12. #include <linux/sched.h>
  13. #include <linux/kernel.h>
  14. #include <linux/string.h>
  15. #include <linux/errno.h>
  16. #include <linux/ptrace.h>
  17. #include <linux/timer.h>
  18. #include <linux/mm.h>
  19. #include <linux/smp.h>
  20. #include <linux/smp_lock.h>
  21. #include <linux/spinlock.h>
  22. #include <linux/init.h>
  23. #include <linux/interrupt.h>
  24. #include <linux/console.h>
  25. #include <asm/system.h>
  26. #include <asm/uaccess.h>
  27. #include <asm/io.h>
  28. #include <asm/irq.h>
  29. #include <asm/traps.h>
  30. #include <asm/unaligned.h>
  31. #include <asm/atomic.h>
  32. #include <asm/smp.h>
  33. #include <asm/pdc.h>
  34. #include "../math-emu/math-emu.h" /* for handle_fpe() */
  35. #ifdef CONFIG_KWDB
  36. #include <kdb/break.h> /* for BI2_KGDB_GDB */
  37. #include <kdb/kgdb_types.h> /* for __() */
  38. #include <kdb/save_state.h> /* for struct save_state */
  39. #include <kdb/kgdb_machine.h> /* for pt_regs_to_ssp and ssp_to_pt_regs */
  40. #include <kdb/trap.h> /* for I_BRK_INST */
  41. #endif /* CONFIG_KWDB */
  42. #define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */
  43.   /*  dumped to the console via printk)          */
  44. static int printbinary(char *buf, unsigned long x, int nbits)
  45. {
  46. unsigned long mask = 1UL << (nbits - 1);
  47. while (mask != 0) {
  48. *buf++ = (mask & x ? '1' : '0');
  49. mask >>= 1;
  50. }
  51. *buf = '';
  52. return nbits;
  53. }
  54. #ifdef __LP64__
  55. #define RFMT "%016lx"
  56. #else
  57. #define RFMT "%08lx"
  58. #endif
  59. void show_regs(struct pt_regs *regs)
  60. {
  61. int i;
  62. char buf[128], *p;
  63. char *level;
  64. unsigned long cr30;
  65. unsigned long cr31;
  66. level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT;
  67. printk("%sn", level); /* don't want to have that pretty register dump messed up */
  68. printk("%s     YZrvWESTHLNXBCVMcbcbcbcbOGFRQPDIn", level);
  69. printbinary(buf, regs->gr[0], 32);
  70. printk("%sPSW: %s %sn", level, buf, print_tainted());
  71. for (i = 0; i < 32; i += 4) {
  72. int j;
  73. p = buf;
  74. p += sprintf(p, "%sr%02d-%02d ", level, i, i + 3);
  75. for (j = 0; j < 4; j++) {
  76. p += sprintf(p, " " RFMT, (i+j) == 0 ? 0 : regs->gr[i + j]);
  77. }
  78. printk("%sn", buf);
  79. }
  80. for (i = 0; i < 8; i += 4) {
  81. int j;
  82. p = buf;
  83. p += sprintf(p, "%ssr%d-%d  ", level, i, i + 3);
  84. for (j = 0; j < 4; j++) {
  85. p += sprintf(p, " " RFMT, regs->sr[i + j]);
  86. }
  87. printk("%sn", buf);
  88. }
  89. #if RIDICULOUSLY_VERBOSE
  90. for (i = 0; i < 32; i += 2)
  91. printk("%sFR%02d : %016lx  FR%2d : %016lx", level, i,
  92. regs->fr[i], i+1, regs->fr[i+1]);
  93. #endif
  94. cr30 = mfctl(30);
  95. cr31 = mfctl(31);
  96. printk("%sn", level);
  97. printk("%sIASQ: " RFMT " " RFMT " IAOQ: " RFMT " " RFMT "n",
  98.        level, regs->iasq[0], regs->iasq[1], regs->iaoq[0], regs->iaoq[1]);
  99. printk("%s IIR: %08lx    ISR: " RFMT "  IOR: " RFMT "n",
  100.        level, regs->iir, regs->isr, regs->ior);
  101. printk("%s CPU: %8d   CR30: " RFMT " CR31: " RFMT "n",
  102.        level, ((struct task_struct *)cr30)->processor, cr30, cr31);
  103. printk("%s ORIG_R28: " RFMT "n", level, regs->orig_r28);
  104. }
  105. static void dump_stack(unsigned long from, unsigned long to, int istackflag)
  106. {
  107. unsigned int *fromptr;
  108. unsigned int *toptr;
  109. fromptr = (unsigned int *)from;
  110. toptr = (unsigned int *)to;
  111. printk("n");
  112. printk(KERN_CRIT "Dumping %sStack from 0x%p to 0x%p:n",
  113. istackflag ? "Interrupt " : "",
  114. fromptr, toptr);
  115. while (fromptr < toptr) {
  116. printk(KERN_CRIT "%04lx %08x %08x %08x %08x %08x %08x %08x %08xn",
  117.     ((unsigned long)fromptr) & 0xffff,
  118.     fromptr[0], fromptr[1], fromptr[2], fromptr[3],
  119.     fromptr[4], fromptr[5], fromptr[6], fromptr[7]);
  120. fromptr += 8;
  121. }
  122. }
  123. void show_stack(struct pt_regs *regs)
  124. {
  125. #if 1
  126. /* If regs->sr[7] == 0, we are on a kernel stack */
  127. if (regs->sr[7] == 0) {
  128. unsigned long sp = regs->gr[30];
  129. unsigned long cr30;
  130. unsigned long cr31;
  131. unsigned long stack_start;
  132. struct pt_regs *int_regs;
  133. cr30 = mfctl(30);
  134. cr31 = mfctl(31);
  135. stack_start = sp & ~(ISTACK_SIZE - 1);
  136. if (stack_start == cr31) {
  137.     /*
  138.      * We are on the interrupt stack, get the stack
  139.      * pointer from the first pt_regs structure on
  140.      * the interrupt stack, so we can dump the task
  141.      * stack first.
  142.      */
  143.     int_regs = (struct pt_regs *)cr31;
  144.     sp = int_regs->gr[30];
  145.     stack_start = sp & ~(INIT_TASK_SIZE - 1);
  146.     if (stack_start != cr30) {
  147. printk(KERN_CRIT "WARNING! Interrupt-Stack pointer and cr30 do not correspond!n");
  148. printk(KERN_CRIT "Dumping virtual address stack insteadn");
  149. dump_stack((unsigned long)__va(stack_start), (unsigned long)__va(sp), 0);
  150.     } else {
  151. dump_stack(stack_start, sp, 0);
  152.     };
  153.     printk("nn" KERN_DEBUG "Registers at Interrupt:n");
  154.     show_regs(int_regs);
  155.     /* Now dump the interrupt stack */
  156.     sp = regs->gr[30];
  157.     stack_start = sp & ~(ISTACK_SIZE - 1);
  158.     dump_stack(stack_start,sp,1);
  159. }
  160. else
  161. {
  162.     /* Stack Dump! */
  163.     printk(KERN_CRIT "WARNING! Stack pointer and cr30 do not correspond!n");
  164.     printk(KERN_CRIT "Dumping virtual address stack insteadn");
  165.     dump_stack((unsigned long)__va(stack_start), (unsigned long)__va(sp), 0);
  166. }
  167. }
  168. #endif
  169. }
  170. void die_if_kernel(char *str, struct pt_regs *regs, long err)
  171. {
  172. if (user_mode(regs)) {
  173. #ifdef PRINT_USER_FAULTS
  174. if (err == 0)
  175. return; /* STFU */
  176. /* XXX for debugging only */
  177. printk(KERN_DEBUG "%s (pid %d): %s (code %ld)n",
  178. current->comm, current->pid, str, err);
  179. show_regs(regs);
  180. #endif
  181. return;
  182. }
  183. /* unlock the pdc lock if necessary */
  184. pdc_emergency_unlock();
  185. /* maybe the kernel hasn't booted very far yet and hasn't been able 
  186.  * to initialize the serial or STI console. In that case we should 
  187.  * re-enable the pdc console, so that the user will be able to 
  188.  * identify the problem. */
  189. if (!console_drivers)
  190. pdc_console_restart();
  191. printk(KERN_CRIT "%s (pid %d): %s (code %ld)n",
  192. current->comm, current->pid, str, err);
  193. show_regs(regs);
  194. /* Wot's wrong wif bein' racy? */
  195. if (current->thread.flags & PARISC_KERNEL_DEATH) {
  196. printk(KERN_CRIT "%s() recursion detected.n", __FUNCTION__);
  197. sti();
  198. while (1);
  199. }
  200. current->thread.flags |= PARISC_KERNEL_DEATH;
  201. do_exit(SIGSEGV);
  202. }
  203. int syscall_ipi(int (*syscall) (struct pt_regs *), struct pt_regs *regs)
  204. {
  205. return syscall(regs);
  206. }
  207. /* gdb uses break 4,8 */
  208. #define GDB_BREAK_INSN 0x10004
  209. void handle_gdb_break(struct pt_regs *regs, int wot)
  210. {
  211. struct siginfo si;
  212. si.si_code = wot;
  213. si.si_addr = (void *) (regs->iaoq[0] & ~3);
  214. si.si_signo = SIGTRAP;
  215. si.si_errno = 0;
  216. force_sig_info(SIGTRAP, &si, current);
  217. }
  218. void handle_break(unsigned iir, struct pt_regs *regs)
  219. {
  220. struct siginfo si;
  221. #ifdef CONFIG_KWDB
  222. struct save_state ssp;
  223. #endif /* CONFIG_KWDB */   
  224. switch(iir) {
  225. case 0x00:
  226. #ifdef PRINT_USER_FAULTS
  227. printk(KERN_DEBUG "break 0,0: pid=%d command='%s'n",
  228.        current->pid, current->comm);
  229. #endif
  230. die_if_kernel("Breakpoint", regs, 0);
  231. #ifdef PRINT_USER_FAULTS
  232. show_regs(regs);
  233. #endif
  234. si.si_code = TRAP_BRKPT;
  235. si.si_addr = (void *) (regs->iaoq[0] & ~3);
  236. si.si_signo = SIGTRAP;
  237. force_sig_info(SIGTRAP, &si, current);
  238. break;
  239. case GDB_BREAK_INSN:
  240. die_if_kernel("Breakpoint", regs, 0);
  241. handle_gdb_break(regs, TRAP_BRKPT);
  242. break;
  243. #ifdef CONFIG_KWDB
  244. case KGDB_BREAK_INSN:
  245. mtctl(0, 15);
  246. pt_regs_to_ssp(regs, &ssp);
  247. kgdb_trap(I_BRK_INST, &ssp, 1);
  248. ssp_to_pt_regs(&ssp, regs);
  249. break;
  250. case KGDB_INIT_BREAK_INSN:
  251. mtctl(0, 15);
  252. pt_regs_to_ssp(regs, &ssp);
  253. kgdb_trap(I_BRK_INST, &ssp, 1);
  254. ssp_to_pt_regs(&ssp, regs);
  255. /* Advance pcoq to skip break */
  256. regs->iaoq[0] = regs->iaoq[1];
  257. regs->iaoq[1] += 4;
  258. break;
  259. #endif /* CONFIG_KWDB */
  260. default:
  261. #ifdef PRINT_USER_FAULTS
  262. printk(KERN_DEBUG "break %#08x: pid=%d command='%s'n",
  263.        iir, current->pid, current->comm);
  264. show_regs(regs);
  265. #endif
  266. si.si_signo = SIGTRAP;
  267. si.si_code = TRAP_BRKPT;
  268. si.si_addr = (void *) (regs->iaoq[0] & ~3);
  269. force_sig_info(SIGTRAP, &si, current);
  270. return;
  271. }
  272. }
  273. int handle_toc(void)
  274. {
  275. printk(KERN_CRIT "TOC call.n");
  276. return 0;
  277. }
  278. static void default_trap(int code, struct pt_regs *regs)
  279. {
  280. printk(KERN_ERR "Trap %d on CPU %dn", code, smp_processor_id());
  281. show_regs(regs);
  282. }
  283. void (*cpu_lpmc) (int code, struct pt_regs *regs) = default_trap;
  284. #ifdef CONFIG_KWDB
  285. int debug_call (void)
  286. {
  287.     printk (KERN_DEBUG "Debug call.n");
  288.     return 0;
  289. }
  290. int debug_call_leaf (void)
  291. {
  292.     return 0;
  293. }
  294. #endif /* CONFIG_KWDB */
  295. void transfer_pim_to_trap_frame(struct pt_regs *regs)
  296. {
  297.     register int i;
  298.     extern unsigned int hpmc_pim_data[];
  299.     struct pdc_hpmc_pim_11 *pim_narrow;
  300.     struct pdc_hpmc_pim_20 *pim_wide;
  301.     if (boot_cpu_data.cpu_type >= pcxu) {
  302. pim_wide = (struct pdc_hpmc_pim_20 *)hpmc_pim_data;
  303. /*
  304.  * Note: The following code will probably generate a
  305.  * bunch of truncation error warnings from the compiler.
  306.  * Could be handled with an ifdef, but perhaps there
  307.  * is a better way.
  308.  */
  309. regs->gr[0] = pim_wide->cr[22];
  310. for (i = 1; i < 32; i++)
  311.     regs->gr[i] = pim_wide->gr[i];
  312. for (i = 0; i < 32; i++)
  313.     regs->fr[i] = pim_wide->fr[i];
  314. for (i = 0; i < 8; i++)
  315.     regs->sr[i] = pim_wide->sr[i];
  316. regs->iasq[0] = pim_wide->cr[17];
  317. regs->iasq[1] = pim_wide->iasq_back;
  318. regs->iaoq[0] = pim_wide->cr[18];
  319. regs->iaoq[1] = pim_wide->iaoq_back;
  320. regs->sar  = pim_wide->cr[11];
  321. regs->iir  = pim_wide->cr[19];
  322. regs->isr  = pim_wide->cr[20];
  323. regs->ior  = pim_wide->cr[21];
  324.     }
  325.     else {
  326. pim_narrow = (struct pdc_hpmc_pim_11 *)hpmc_pim_data;
  327. regs->gr[0] = pim_narrow->cr[22];
  328. for (i = 1; i < 32; i++)
  329.     regs->gr[i] = pim_narrow->gr[i];
  330. for (i = 0; i < 32; i++)
  331.     regs->fr[i] = pim_narrow->fr[i];
  332. for (i = 0; i < 8; i++)
  333.     regs->sr[i] = pim_narrow->sr[i];
  334. regs->iasq[0] = pim_narrow->cr[17];
  335. regs->iasq[1] = pim_narrow->iasq_back;
  336. regs->iaoq[0] = pim_narrow->cr[18];
  337. regs->iaoq[1] = pim_narrow->iaoq_back;
  338. regs->sar  = pim_narrow->cr[11];
  339. regs->iir  = pim_narrow->cr[19];
  340. regs->isr  = pim_narrow->cr[20];
  341. regs->ior  = pim_narrow->cr[21];
  342.     }
  343.     /*
  344.      * The following fields only have meaning if we came through
  345.      * another path. So just zero them here.
  346.      */
  347.     regs->ksp = 0;
  348.     regs->kpc = 0;
  349.     regs->orig_r28 = 0;
  350. }
  351. /*
  352.  * This routine handles page faults.  It determines the address,
  353.  * and the problem, and then passes it off to one of the appropriate
  354.  * routines.
  355.  */
  356. void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long offset)
  357. {
  358. static spinlock_t terminate_lock = SPIN_LOCK_UNLOCKED;
  359. set_eiem(0);
  360. __cli();
  361. spin_lock(&terminate_lock);
  362. /* unlock the pdc lock if necessary */
  363. pdc_emergency_unlock();
  364. /* restart pdc console if necessary */
  365. if (!console_drivers)
  366. pdc_console_restart();
  367. if (code == 1)
  368.     transfer_pim_to_trap_frame(regs);
  369. show_stack(regs);
  370. printk("n");
  371. printk(KERN_CRIT "%s: Code=%d regs=%p (Addr=" RFMT ")n",
  372. msg, code, regs, offset);
  373. show_regs(regs);
  374. spin_unlock(&terminate_lock);
  375. /* put soft power button back under hardware control;
  376.  * if the user had pressed it once at any time, the 
  377.  * system will shut down immediately right here. */
  378. pdc_soft_power_button(0);
  379. for(;;)
  380.     ;
  381. }
  382. void handle_interruption(int code, struct pt_regs *regs)
  383. {
  384. unsigned long fault_address = 0;
  385. unsigned long fault_space = 0;
  386. struct siginfo si;
  387. #ifdef CONFIG_KWDB
  388. struct save_state ssp;
  389. #endif /* CONFIG_KWDB */   
  390. if (code == 1)
  391.     pdc_console_restart();  /* switch back to pdc if HPMC */
  392. else
  393.     sti();
  394. #if 0
  395. printk(KERN_CRIT "Interruption # %dn", code);
  396. #endif
  397. switch(code) {
  398. case  1:
  399. /* High-priority machine check (HPMC) */
  400. parisc_terminate("High Priority Machine Check (HPMC)",
  401. regs, code, 0);
  402. /* NOT REACHED */
  403. case  2:
  404. /* Power failure interrupt */
  405. printk(KERN_CRIT "Power failure interrupt !n");
  406. return;
  407. case  3:
  408. /* Recovery counter trap */
  409. regs->gr[0] &= ~PSW_R;
  410. if (regs->iasq[0])
  411. handle_gdb_break(regs, TRAP_TRACE);
  412. /* else this must be the start of a syscall - just let it run */
  413. return;
  414. case  5:
  415. /* Low-priority machine check */
  416. flush_all_caches();
  417. cpu_lpmc(5, regs);
  418. return;
  419. case  6:
  420. /* Instruction TLB miss fault/Instruction page fault */
  421. fault_address = regs->iaoq[0];
  422. fault_space   = regs->iasq[0];
  423. break;
  424. case  8:
  425. /* Illegal instruction trap */
  426. die_if_kernel("Illegal instruction", regs, code);
  427. si.si_code = ILL_ILLOPC;
  428. goto give_sigill;
  429. case  9:
  430. /* Break instruction trap */
  431. handle_break(regs->iir,regs);
  432. return;
  433. case 10:
  434. /* Privileged operation trap */
  435. die_if_kernel("Privileged operation", regs, code);
  436. si.si_code = ILL_PRVOPC;
  437. goto give_sigill;
  438. case 11:
  439. /* Privileged register trap */
  440. if ((regs->iir & 0xffdfffe0) == 0x034008a0) {
  441. /* This is a MFCTL cr26/cr27 to gr instruction.
  442.  * PCXS traps on this, so we need to emulate it.
  443.  */
  444. if (regs->iir & 0x00200000)
  445. regs->gr[regs->iir & 0x1f] = mfctl(27);
  446. else
  447. regs->gr[regs->iir & 0x1f] = mfctl(26);
  448. regs->iaoq[0] = regs->iaoq[1];
  449. regs->iaoq[1] += 4;
  450. regs->iasq[0] = regs->iasq[1];
  451. return;
  452. }
  453. die_if_kernel("Privileged register usage", regs, code);
  454. si.si_code = ILL_PRVREG;
  455. give_sigill:
  456. si.si_signo = SIGILL;
  457. si.si_errno = 0;
  458. si.si_addr = (void *) regs->iaoq[0];
  459. force_sig_info(SIGILL, &si, current);
  460. return;
  461. case 14:
  462. /* Assist Exception Trap, i.e. floating point exception. */
  463. die_if_kernel("Floating point exception", regs, 0); /* quiet */
  464. handle_fpe(regs);
  465. return;
  466. case 17:
  467. /* Non-access data TLB miss fault/Non-access data page fault */
  468. /* TODO: Still need to add slow path emulation code here */
  469. fault_address = regs->ior;
  470. parisc_terminate("Non access data tlb fault!",regs,code,fault_address);
  471. case 18:
  472. /* PCXS only -- later cpu's split this into types 26,27 & 28 */
  473. /* Check for unaligned access */
  474. if (check_unaligned(regs)) {
  475. handle_unaligned(regs);
  476. return;
  477. }
  478. /* Fall Through */
  479. case 15: /* Data TLB miss fault/Data page fault */
  480. case 26: /* PCXL: Data memory access rights trap */
  481. fault_address = regs->ior;
  482. fault_space   = regs->isr;
  483. break;
  484. case 19:
  485. /* Data memory break trap */
  486. regs->gr[0] |= PSW_X; /* So we can single-step over the trap */
  487. /* fall thru */
  488. case 21:
  489. /* Page reference trap */
  490. handle_gdb_break(regs, TRAP_HWBKPT);
  491. return;
  492. case 25:
  493. /* Taken branch trap */
  494. #ifndef CONFIG_KWDB
  495. regs->gr[0] &= ~PSW_T;
  496. if (regs->iasq[0])
  497. handle_gdb_break(regs, TRAP_BRANCH);
  498. /* else this must be the start of a syscall - just let it
  499.  * run.
  500.  */
  501. return;
  502. #else
  503. /* Kernel debugger: */
  504. mtctl(0, 15);
  505. pt_regs_to_ssp(regs, &ssp);
  506. kgdb_trap(I_TAKEN_BR, &ssp, 1);
  507. ssp_to_pt_regs(&ssp, regs);
  508. break;
  509. #endif /* CONFIG_KWDB */
  510. case  7:  
  511. /* Instruction access rights */
  512. /* PCXL: Instruction memory protection trap */
  513. /*
  514.  * This could be caused by either: 1) a process attempting
  515.  * to execute within a vma that does not have execute
  516.  * permission, or 2) an access rights violation caused by a
  517.  * flush only translation set up by ptep_get_and_clear().
  518.  * So we check the vma permissions to differentiate the two.
  519.  * If the vma indicates we have execute permission, then
  520.  * the cause is the latter one. In this case, we need to
  521.  * call do_page_fault() to fix the problem.
  522.  */
  523. if (user_mode(regs)) {
  524. struct vm_area_struct *vma;
  525. down_read(&current->mm->mmap_sem);
  526. vma = find_vma(current->mm,regs->iaoq[0]);
  527. if (vma && (regs->iaoq[0] >= vma->vm_start)
  528. && (vma->vm_flags & VM_EXEC)) {
  529. fault_address = regs->iaoq[0];
  530. fault_space = regs->iasq[0];
  531. up_read(&current->mm->mmap_sem);
  532. break; /* call do_page_fault() */
  533. }
  534. up_read(&current->mm->mmap_sem);
  535. }
  536. /* Fall Through */
  537. case 27: 
  538. /* Data memory protection ID trap */
  539. die_if_kernel("Protection id trap", regs, code);
  540. si.si_code = SEGV_MAPERR;
  541. si.si_signo = SIGSEGV;
  542. si.si_errno = 0;
  543. if (code == 7)
  544.     si.si_addr = (void *) regs->iaoq[0];
  545. else
  546.     si.si_addr = (void *) regs->ior;
  547. force_sig_info(SIGSEGV, &si, current);
  548. return;
  549. case 28: 
  550. /* Unaligned data reference trap */
  551. handle_unaligned(regs);
  552. return;
  553. default:
  554. if (user_mode(regs)) {
  555. #ifdef PRINT_USER_FAULTS
  556. printk(KERN_DEBUG "nhandle_interruption() pid=%d command='%s'n",
  557.     current->pid, current->comm);
  558. show_regs(regs);
  559. #endif
  560. /* SIGBUS, for lack of a better one. */
  561. si.si_signo = SIGBUS;
  562. si.si_code = BUS_OBJERR;
  563. si.si_errno = 0;
  564. si.si_addr = (void *) regs->ior;
  565. force_sig_info(SIGBUS, &si, current);
  566. return;
  567. }
  568. parisc_terminate("Unexpected interruption", regs, code, 0);
  569. /* NOT REACHED */
  570. }
  571. if (user_mode(regs)) {
  572.     if (fault_space != regs->sr[7]) {
  573. #ifdef PRINT_USER_FAULTS
  574. if (fault_space == 0)
  575. printk(KERN_DEBUG "User Fault on Kernel Space ");
  576. else
  577. printk(KERN_DEBUG "User Fault (long pointer) ");
  578. printk("pid=%d command='%s'n", current->pid, current->comm);
  579. show_regs(regs);
  580. #endif
  581. si.si_signo = SIGSEGV;
  582. si.si_errno = 0;
  583. si.si_code = SEGV_MAPERR;
  584. si.si_addr = (void *) regs->ior;
  585. force_sig_info(SIGSEGV, &si, current);
  586. return;
  587.     }
  588. }
  589. else {
  590.     /*
  591.      * The kernel should never fault on its own address space.
  592.      */
  593.     if (fault_space == 0)
  594.     parisc_terminate("Kernel Fault", regs, code, fault_address);
  595. }
  596. #ifdef CONFIG_KWDB
  597. debug_call_leaf ();
  598. #endif /* CONFIG_KWDB */
  599. do_page_fault(regs, code, fault_address);
  600. }
  601. void show_trace_task(struct task_struct *tsk)
  602. {
  603.      BUG();
  604. }
  605. int __init check_ivt(void *iva)
  606. {
  607. int i;
  608. u32 check = 0;
  609. u32 *ivap;
  610. u32 *hpmcp;
  611. u32 length;
  612. extern void os_hpmc(void);
  613. extern void os_hpmc_end(void);
  614. if (strcmp((char *)iva, "cows can fly"))
  615. return -1;
  616. ivap = (u32 *)iva;
  617. for (i = 0; i < 8; i++)
  618.     *ivap++ = 0;
  619. /* Compute Checksum for HPMC handler */
  620. length = (u32)((unsigned long)os_hpmc_end - (unsigned long)os_hpmc);
  621. ivap[7] = length;
  622. hpmcp = (u32 *)os_hpmc;
  623. for (i=0; i<length/4; i++)
  624.     check += *hpmcp++;
  625. for (i=0; i<8; i++)
  626.     check += ivap[i];
  627. ivap[5] = -check;
  628. return 0;
  629. }
  630. #ifndef __LP64__
  631. extern const void fault_vector_11;
  632. #endif
  633. extern const void fault_vector_20;
  634. void __init trap_init(void)
  635. {
  636. void *iva;
  637. if (boot_cpu_data.cpu_type >= pcxu)
  638. iva = (void *) &fault_vector_20;
  639. else
  640. #ifdef __LP64__
  641. panic("Can't boot 64-bit OS on PA1.1 processor!");
  642. #else
  643. iva = (void *) &fault_vector_11;
  644. #endif
  645. if (check_ivt(iva))
  646. panic("IVT invalid");
  647. }