aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/traps.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-01-31 18:52:02 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-31 18:52:02 -0500
commitc5e18af910f4bc2e3d0732ea98b99c0fd884e73c (patch)
treef6624e0fb83d482d4fcb265c616ae3f5e5ea53f1 /arch/mips/kernel/traps.c
parent878b8619f711280fd05845e21956434b5e588cc4 (diff)
parent2d2eca4d11933bd37a4944aae06e6122efffaea8 (diff)
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (27 commits) MIPS: Alchemy: time.c build fix MIPS: RB532: Export rb532_gpio_set_func() MIPS: RB532: Update headers MIPS: RB532: Simplify dev3 init MIPS: RB532: Remove {get,set}_434_reg() MIPS: RB532: Move dev3 init code to devices.c MIPS: RB532: Fix set_latch_u5() MIPS: RB532: Fix init of rb532_dev3_ctl_res MIPS: RB532: Use driver_data instead of platform_data MIPS: RB532: Detect uart type, add platform device MIPS: RB532: remove useless CF GPIO initialisation MIPS: RB532: Auto disable GPIO alternate function MIPS: RB532: Add set_type() function to IRQ struct. MIPS: RC32434: Define io_map_base for PCI controller MIPS: RB532: Fix bit swapping in rb532_set_bit() MIPS: Use hardware watchpoints on all R1 and R2 CPUs. MIPS: Read watch registers with interrupts disabled. MIPS: Fix a typo in watchpoint register structure. MIPS: TXx9: Add support for TX4939 internal RTC MIPS: R2: Fix broken installation of cache error handler. ...
Diffstat (limited to 'arch/mips/kernel/traps.c')
-rw-r--r--arch/mips/kernel/traps.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index f6083c6bfaa4..b2d7041341b8 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -944,6 +944,9 @@ asmlinkage void do_mdmx(struct pt_regs *regs)
944 force_sig(SIGILL, current); 944 force_sig(SIGILL, current);
945} 945}
946 946
947/*
948 * Called with interrupts disabled.
949 */
947asmlinkage void do_watch(struct pt_regs *regs) 950asmlinkage void do_watch(struct pt_regs *regs)
948{ 951{
949 u32 cause; 952 u32 cause;
@@ -963,9 +966,12 @@ asmlinkage void do_watch(struct pt_regs *regs)
963 */ 966 */
964 if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) { 967 if (test_tsk_thread_flag(current, TIF_LOAD_WATCH)) {
965 mips_read_watch_registers(); 968 mips_read_watch_registers();
969 local_irq_enable();
966 force_sig(SIGTRAP, current); 970 force_sig(SIGTRAP, current);
967 } else 971 } else {
968 mips_clear_watch_registers(); 972 mips_clear_watch_registers();
973 local_irq_enable();
974 }
969} 975}
970 976
971asmlinkage void do_mcheck(struct pt_regs *regs) 977asmlinkage void do_mcheck(struct pt_regs *regs)
@@ -1582,7 +1588,11 @@ void __init set_handler(unsigned long offset, void *addr, unsigned long size)
1582static char panic_null_cerr[] __cpuinitdata = 1588static char panic_null_cerr[] __cpuinitdata =
1583 "Trying to set NULL cache error exception handler"; 1589 "Trying to set NULL cache error exception handler";
1584 1590
1585/* Install uncached CPU exception handler */ 1591/*
1592 * Install uncached CPU exception handler.
1593 * This is suitable only for the cache error exception which is the only
1594 * exception handler that is being run uncached.
1595 */
1586void __cpuinit set_uncached_handler(unsigned long offset, void *addr, 1596void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
1587 unsigned long size) 1597 unsigned long size)
1588{ 1598{
@@ -1593,7 +1603,7 @@ void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
1593 unsigned long uncached_ebase = TO_UNCAC(ebase); 1603 unsigned long uncached_ebase = TO_UNCAC(ebase);
1594#endif 1604#endif
1595 if (cpu_has_mips_r2) 1605 if (cpu_has_mips_r2)
1596 ebase += (read_c0_ebase() & 0x3ffff000); 1606 uncached_ebase += (read_c0_ebase() & 0x3ffff000);
1597 1607
1598 if (!addr) 1608 if (!addr)
1599 panic(panic_null_cerr); 1609 panic(panic_null_cerr);