| .. | .. |
|---|
| 35 | 35 | #include <asm/fpu.h> |
|---|
| 36 | 36 | #include <linux/uaccess.h> |
|---|
| 37 | 37 | #include <asm/traps.h> |
|---|
| 38 | | -#include <asm/pgalloc.h> |
|---|
| 39 | 38 | #include <asm/machdep.h> |
|---|
| 40 | 39 | #include <asm/siginfo.h> |
|---|
| 41 | | - |
|---|
| 40 | +#include <asm/tlbflush.h> |
|---|
| 42 | 41 | |
|---|
| 43 | 42 | static const char *vec_names[] = { |
|---|
| 44 | 43 | [VEC_RESETSP] = "RESET SP", |
|---|
| .. | .. |
|---|
| 431 | 430 | pr_err("BAD KERNEL BUSERR\n"); |
|---|
| 432 | 431 | |
|---|
| 433 | 432 | die_if_kernel("Oops", &fp->ptregs,0); |
|---|
| 434 | | - force_sig(SIGKILL, current); |
|---|
| 433 | + force_sig(SIGKILL); |
|---|
| 435 | 434 | return; |
|---|
| 436 | 435 | } |
|---|
| 437 | 436 | } else { |
|---|
| .. | .. |
|---|
| 463 | 462 | !(ssw & RW) ? "write" : "read", addr, |
|---|
| 464 | 463 | fp->ptregs.pc); |
|---|
| 465 | 464 | die_if_kernel ("Oops", &fp->ptregs, buserr_type); |
|---|
| 466 | | - force_sig (SIGBUS, current); |
|---|
| 465 | + force_sig (SIGBUS); |
|---|
| 467 | 466 | return; |
|---|
| 468 | 467 | } |
|---|
| 469 | 468 | |
|---|
| .. | .. |
|---|
| 493 | 492 | do_page_fault (&fp->ptregs, addr, 0); |
|---|
| 494 | 493 | } else { |
|---|
| 495 | 494 | pr_debug("protection fault on insn access (segv).\n"); |
|---|
| 496 | | - force_sig (SIGSEGV, current); |
|---|
| 495 | + force_sig (SIGSEGV); |
|---|
| 497 | 496 | } |
|---|
| 498 | 497 | } |
|---|
| 499 | 498 | #else |
|---|
| .. | .. |
|---|
| 571 | 570 | !(ssw & RW) ? "write" : "read", addr, |
|---|
| 572 | 571 | fp->ptregs.pc); |
|---|
| 573 | 572 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
|---|
| 574 | | - force_sig(SIGSEGV, current); |
|---|
| 573 | + force_sig(SIGSEGV); |
|---|
| 575 | 574 | return; |
|---|
| 576 | 575 | } else { |
|---|
| 577 | 576 | #if 0 |
|---|
| .. | .. |
|---|
| 598 | 597 | #endif |
|---|
| 599 | 598 | pr_debug("Unknown SIGSEGV - 1\n"); |
|---|
| 600 | 599 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
|---|
| 601 | | - force_sig(SIGSEGV, current); |
|---|
| 600 | + force_sig(SIGSEGV); |
|---|
| 602 | 601 | return; |
|---|
| 603 | 602 | } |
|---|
| 604 | 603 | |
|---|
| .. | .. |
|---|
| 621 | 620 | buserr: |
|---|
| 622 | 621 | pr_err("BAD KERNEL BUSERR\n"); |
|---|
| 623 | 622 | die_if_kernel("Oops",&fp->ptregs,0); |
|---|
| 624 | | - force_sig(SIGKILL, current); |
|---|
| 623 | + force_sig(SIGKILL); |
|---|
| 625 | 624 | return; |
|---|
| 626 | 625 | } |
|---|
| 627 | 626 | |
|---|
| .. | .. |
|---|
| 660 | 659 | addr, fp->ptregs.pc); |
|---|
| 661 | 660 | pr_debug("Unknown SIGSEGV - 2\n"); |
|---|
| 662 | 661 | die_if_kernel("Oops",&fp->ptregs,mmusr); |
|---|
| 663 | | - force_sig(SIGSEGV, current); |
|---|
| 662 | + force_sig(SIGSEGV); |
|---|
| 664 | 663 | return; |
|---|
| 665 | 664 | } |
|---|
| 666 | 665 | |
|---|
| .. | .. |
|---|
| 804 | 803 | default: |
|---|
| 805 | 804 | die_if_kernel("bad frame format",&fp->ptregs,0); |
|---|
| 806 | 805 | pr_debug("Unknown SIGSEGV - 4\n"); |
|---|
| 807 | | - force_sig(SIGSEGV, current); |
|---|
| 806 | + force_sig(SIGSEGV); |
|---|
| 808 | 807 | } |
|---|
| 809 | 808 | } |
|---|
| 810 | 809 | |
|---|
| 811 | 810 | |
|---|
| 812 | 811 | static int kstack_depth_to_print = 48; |
|---|
| 813 | 812 | |
|---|
| 814 | | -void show_trace(unsigned long *stack) |
|---|
| 813 | +static void show_trace(unsigned long *stack, const char *loglvl) |
|---|
| 815 | 814 | { |
|---|
| 816 | 815 | unsigned long *endstack; |
|---|
| 817 | 816 | unsigned long addr; |
|---|
| 818 | 817 | int i; |
|---|
| 819 | 818 | |
|---|
| 820 | | - pr_info("Call Trace:"); |
|---|
| 819 | + printk("%sCall Trace:", loglvl); |
|---|
| 821 | 820 | addr = (unsigned long)stack + THREAD_SIZE - 1; |
|---|
| 822 | 821 | endstack = (unsigned long *)(addr & -THREAD_SIZE); |
|---|
| 823 | 822 | i = 0; |
|---|
| .. | .. |
|---|
| 846 | 845 | void show_registers(struct pt_regs *regs) |
|---|
| 847 | 846 | { |
|---|
| 848 | 847 | struct frame *fp = (struct frame *)regs; |
|---|
| 849 | | - mm_segment_t old_fs = get_fs(); |
|---|
| 850 | 848 | u16 c, *cp; |
|---|
| 851 | 849 | unsigned long addr; |
|---|
| 852 | 850 | int i; |
|---|
| .. | .. |
|---|
| 916 | 914 | default: |
|---|
| 917 | 915 | pr_cont("\n"); |
|---|
| 918 | 916 | } |
|---|
| 919 | | - show_stack(NULL, (unsigned long *)addr); |
|---|
| 917 | + show_stack(NULL, (unsigned long *)addr, KERN_INFO); |
|---|
| 920 | 918 | |
|---|
| 921 | 919 | pr_info("Code:"); |
|---|
| 922 | | - set_fs(KERNEL_DS); |
|---|
| 923 | 920 | cp = (u16 *)regs->pc; |
|---|
| 924 | 921 | for (i = -8; i < 16; i++) { |
|---|
| 925 | | - if (get_user(c, cp + i) && i >= 0) { |
|---|
| 922 | + if (get_kernel_nofault(c, cp + i) && i >= 0) { |
|---|
| 926 | 923 | pr_cont(" Bad PC value."); |
|---|
| 927 | 924 | break; |
|---|
| 928 | 925 | } |
|---|
| .. | .. |
|---|
| 931 | 928 | else |
|---|
| 932 | 929 | pr_cont(" <%04x>", c); |
|---|
| 933 | 930 | } |
|---|
| 934 | | - set_fs(old_fs); |
|---|
| 935 | 931 | pr_cont("\n"); |
|---|
| 936 | 932 | } |
|---|
| 937 | 933 | |
|---|
| 938 | | -void show_stack(struct task_struct *task, unsigned long *stack) |
|---|
| 934 | +void show_stack(struct task_struct *task, unsigned long *stack, |
|---|
| 935 | + const char *loglvl) |
|---|
| 939 | 936 | { |
|---|
| 940 | 937 | unsigned long *p; |
|---|
| 941 | 938 | unsigned long *endstack; |
|---|
| .. | .. |
|---|
| 949 | 946 | } |
|---|
| 950 | 947 | endstack = (unsigned long *)(((unsigned long)stack + THREAD_SIZE - 1) & -THREAD_SIZE); |
|---|
| 951 | 948 | |
|---|
| 952 | | - pr_info("Stack from %08lx:", (unsigned long)stack); |
|---|
| 949 | + printk("%sStack from %08lx:", loglvl, (unsigned long)stack); |
|---|
| 953 | 950 | p = stack; |
|---|
| 954 | 951 | for (i = 0; i < kstack_depth_to_print; i++) { |
|---|
| 955 | 952 | if (p + 1 > endstack) |
|---|
| .. | .. |
|---|
| 959 | 956 | pr_cont(" %08lx", *p++); |
|---|
| 960 | 957 | } |
|---|
| 961 | 958 | pr_cont("\n"); |
|---|
| 962 | | - show_trace(stack); |
|---|
| 959 | + show_trace(stack, loglvl); |
|---|
| 963 | 960 | } |
|---|
| 964 | 961 | |
|---|
| 965 | 962 | /* |
|---|
| .. | .. |
|---|
| 1127 | 1124 | addr = (void __user*) fp->un.fmtb.daddr; |
|---|
| 1128 | 1125 | break; |
|---|
| 1129 | 1126 | } |
|---|
| 1130 | | - force_sig_fault(sig, si_code, addr, current); |
|---|
| 1127 | + force_sig_fault(sig, si_code, addr); |
|---|
| 1131 | 1128 | } |
|---|
| 1132 | 1129 | |
|---|
| 1133 | 1130 | void die_if_kernel (char *str, struct pt_regs *fp, int nr) |
|---|
| .. | .. |
|---|
| 1159 | 1156 | #ifdef CONFIG_M68KFPU_EMU |
|---|
| 1160 | 1157 | asmlinkage void fpemu_signal(int signal, int code, void *addr) |
|---|
| 1161 | 1158 | { |
|---|
| 1162 | | - force_sig_fault(signal, code, addr, current); |
|---|
| 1159 | + force_sig_fault(signal, code, addr); |
|---|
| 1163 | 1160 | } |
|---|
| 1164 | 1161 | #endif |
|---|