| /* |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Kernel debug stuff to use the Watch registers. |
| * Useful to find stack overflows, dangling pointers etc. |
| * |
| * Copyright (C) 1995, 1996, 1999, 2001 by Ralf Baechle |
| */ |
| #include <asm/asm.h> |
| #include <asm/mipsregs.h> |
| #include <asm/regdef.h> |
| |
| .set noreorder |
| /* |
| * Parameter: a0 - physical address to watch |
| * a1 - set bit #1 to trap on load references |
| * bit #0 to trap on store references |
| * Results : none |
| */ |
| LEAF(__watch_set) |
| ori a0, 7 |
| xori a0, 7 |
| or a0, a1 |
| mtc0 a0, CP0_WATCHLO |
| sd a0, watch_savelo |
| dsrl32 a0, a0, 0 |
| |
| jr ra |
| mtc0 zero, CP0_WATCHHI |
| END(__watch_set) |
| |
| /* |
| * Parameter: none |
| * Results : none |
| */ |
| LEAF(__watch_clear) |
| jr ra |
| mtc0 zero, CP0_WATCHLO |
| END(__watch_clear) |
| |
| /* |
| * Parameter: none |
| * Results : none |
| */ |
| LEAF(__watch_reenable) |
| ld t0, watch_savelo |
| jr ra |
| mtc0 t0, CP0_WATCHLO |
| END(__watch_reenable) |
| |
| /* |
| * Saved value of the c0_watchlo register for watch_reenable() |
| */ |
| .local watch_savelo |
| .comm watch_savelo, 8, 8 |