diff options
Diffstat (limited to 'arch/mips/kernel/traps.c')
-rw-r--r-- | arch/mips/kernel/traps.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 5fd0cd020af5..80b9e070c207 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/tlbdebug.h> | 42 | #include <asm/tlbdebug.h> |
43 | #include <asm/traps.h> | 43 | #include <asm/traps.h> |
44 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
45 | #include <asm/watch.h> | ||
45 | #include <asm/mmu_context.h> | 46 | #include <asm/mmu_context.h> |
46 | #include <asm/types.h> | 47 | #include <asm/types.h> |
47 | #include <asm/stacktrace.h> | 48 | #include <asm/stacktrace.h> |
@@ -825,8 +826,10 @@ static void mt_ase_fp_affinity(void) | |||
825 | if (cpus_intersects(current->cpus_allowed, mt_fpu_cpumask)) { | 826 | if (cpus_intersects(current->cpus_allowed, mt_fpu_cpumask)) { |
826 | cpumask_t tmask; | 827 | cpumask_t tmask; |
827 | 828 | ||
828 | cpus_and(tmask, current->thread.user_cpus_allowed, | 829 | current->thread.user_cpus_allowed |
829 | mt_fpu_cpumask); | 830 | = current->cpus_allowed; |
831 | cpus_and(tmask, current->cpus_allowed, | ||
832 | mt_fpu_cpumask); | ||
830 | set_cpus_allowed(current, tmask); | 833 | set_cpus_allowed(current, tmask); |
831 | set_thread_flag(TIF_FPUBOUND); | 834 | set_thread_flag(TIF_FPUBOUND); |
832 | } | 835 | } |
@@ -910,13 +913,26 @@ asmlinkage void do_mdmx(struct pt_regs *regs) | |||
910 | 913 | ||
911 | asmlinkage void do_watch(struct pt_regs *regs) | 914 | asmlinkage void do_watch(struct pt_regs *regs) |
912 | { | 915 | { |
916 | u32 cause; | ||
917 | |||
913 | /* | 918 | /* |
914 | * We use the watch exception where available to detect stack | 919 | * Clear WP (bit 22) bit of cause register so we don't loop |
915 | * overflows. | 920 | * forever. |
916 | */ | 921 | */ |
917 | dump_tlb_all(); | 922 | cause = read_c0_cause(); |
918 | show_regs(regs); | 923 | cause &= ~(1 << 22); |
919 | panic("Caught WATCH exception - probably caused by stack overflow."); | 924 | write_c0_cause(cause); |
925 | |||
926 | /* | ||
927 | * If the current thread has the watch registers loaded, save | ||
928 | * their values and send SIGTRAP. Otherwise another thread | ||
929 | * left the registers set, clear them and continue. | ||
930 | */ | ||
931 | if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { | ||
932 | mips_read_watch_registers(); | ||
933 | force_sig(SIGTRAP, current); | ||
934 | } else | ||
935 | mips_clear_watch_registers(); | ||
920 | } | 936 | } |
921 | 937 | ||
922 | asmlinkage void do_mcheck(struct pt_regs *regs) | 938 | asmlinkage void do_mcheck(struct pt_regs *regs) |