1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Kernel debug stuff to use the Watch registers.
7 * Useful to find stack overflows, dangling pointers etc.
8 *
9 * Copyright (C) 1995, 1996, 1999 by Ralf Baechle
10 */
11#include <asm/asm.h>
12#include <asm/mipsregs.h>
13#include <asm/regdef.h>
14
15		.set	noreorder
16/*
17 * Parameter: a0 - logic address to watch
18 *                 Currently only KSEG0 addresses are allowed!
19 *            a1 - set bit #1 to trap on load references
20 *                     bit #0 to trap on store references
21 * Results  : none
22 */
23		LEAF(__watch_set)
24		li	t0,0x80000000
25		subu	a0,t0
26		ori	a0,7
27		xori	a0,7
28		or	a0,a1
29		mtc0	a0,CP0_WATCHLO
30		sw	a0,watch_savelo
31
32		jr	ra
33		 mtc0	zero,CP0_WATCHHI
34		END(__watch_set)
35
36/*
37 * Parameter: none
38 * Results  : none
39 */
40		LEAF(__watch_clear)
41		jr	ra
42		 mtc0	zero,CP0_WATCHLO
43		END(__watch_clear)
44
45/*
46 * Parameter: none
47 * Results  : none
48 */
49		LEAF(__watch_reenable)
50		lw	t0,watch_savelo
51		jr	ra
52		 mtc0	t0,CP0_WATCHLO
53		END(__watch_reenable)
54
55/*
56 * Saved value of the c0_watchlo register for watch_reenable()
57 */
58		.data
59watch_savelo:	.word	0
60		.text
61