diff options
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r-- | arch/powerpc/kernel/traps.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index d9f10f2fc372..c66b4771ef44 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -843,7 +843,7 @@ void __kprobes program_check_exception(struct pt_regs *regs) | |||
843 | 843 | ||
844 | void alignment_exception(struct pt_regs *regs) | 844 | void alignment_exception(struct pt_regs *regs) |
845 | { | 845 | { |
846 | int fixed = 0; | 846 | int sig, code, fixed = 0; |
847 | 847 | ||
848 | /* we don't implement logging of alignment exceptions */ | 848 | /* we don't implement logging of alignment exceptions */ |
849 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | 849 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) |
@@ -857,14 +857,16 @@ void alignment_exception(struct pt_regs *regs) | |||
857 | 857 | ||
858 | /* Operand address was bad */ | 858 | /* Operand address was bad */ |
859 | if (fixed == -EFAULT) { | 859 | if (fixed == -EFAULT) { |
860 | if (user_mode(regs)) | 860 | sig = SIGSEGV; |
861 | _exception(SIGSEGV, regs, SEGV_ACCERR, regs->dar); | 861 | code = SEGV_ACCERR; |
862 | else | 862 | } else { |
863 | /* Search exception table */ | 863 | sig = SIGBUS; |
864 | bad_page_fault(regs, regs->dar, SIGSEGV); | 864 | code = BUS_ADRALN; |
865 | return; | ||
866 | } | 865 | } |
867 | _exception(SIGBUS, regs, BUS_ADRALN, regs->dar); | 866 | if (user_mode(regs)) |
867 | _exception(sig, regs, code, regs->dar); | ||
868 | else | ||
869 | bad_page_fault(regs, regs->dar, sig); | ||
868 | } | 870 | } |
869 | 871 | ||
870 | void StackOverflow(struct pt_regs *regs) | 872 | void StackOverflow(struct pt_regs *regs) |
@@ -900,14 +902,13 @@ void kernel_fp_unavailable_exception(struct pt_regs *regs) | |||
900 | 902 | ||
901 | void altivec_unavailable_exception(struct pt_regs *regs) | 903 | void altivec_unavailable_exception(struct pt_regs *regs) |
902 | { | 904 | { |
903 | #if !defined(CONFIG_ALTIVEC) | ||
904 | if (user_mode(regs)) { | 905 | if (user_mode(regs)) { |
905 | /* A user program has executed an altivec instruction, | 906 | /* A user program has executed an altivec instruction, |
906 | but this kernel doesn't support altivec. */ | 907 | but this kernel doesn't support altivec. */ |
907 | _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); | 908 | _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); |
908 | return; | 909 | return; |
909 | } | 910 | } |
910 | #endif | 911 | |
911 | printk(KERN_EMERG "Unrecoverable VMX/Altivec Unavailable Exception " | 912 | printk(KERN_EMERG "Unrecoverable VMX/Altivec Unavailable Exception " |
912 | "%lx at %lx\n", regs->trap, regs->nip); | 913 | "%lx at %lx\n", regs->trap, regs->nip); |
913 | die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT); | 914 | die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT); |