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, 2001 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 - physical address to watch
18 *            a1 - set bit #1 to trap on load references
19 *                     bit #0 to trap on store references
20 * Results  : none
21 */
22		LEAF(__watch_set)
23		ori	a0, 7
24		xori	a0, 7
25		or	a0, a1
26		mtc0	a0, CP0_WATCHLO
27		sd	a0, watch_savelo
28		dsrl32	a0, a0, 0
29
30		jr	ra
31		 mtc0	zero, CP0_WATCHHI
32		END(__watch_set)
33
34/*
35 * Parameter: none
36 * Results  : none
37 */
38		LEAF(__watch_clear)
39		jr	ra
40		 mtc0	zero, CP0_WATCHLO
41		END(__watch_clear)
42
43/*
44 * Parameter: none
45 * Results  : none
46 */
47		LEAF(__watch_reenable)
48		ld	t0, watch_savelo
49		jr	ra
50		 mtc0	t0, CP0_WATCHLO
51		END(__watch_reenable)
52
53/*
54 * Saved value of the c0_watchlo register for watch_reenable()
55 */
56		.local	watch_savelo
57		.comm	watch_savelo, 8, 8
58