xref: /freebsd/sys/ddb/db_break.c (revision 076b64e83ac9e0cfd361a58d5967dfa939fe8139)
1dd3cb568SWarner Losh /*-
2796df753SPedro F. Giffuni  * SPDX-License-Identifier: MIT-CMU
3796df753SPedro F. Giffuni  *
45b81b6b3SRodney W. Grimes  * Mach Operating System
55b81b6b3SRodney W. Grimes  * Copyright (c) 1991,1990 Carnegie Mellon University
65b81b6b3SRodney W. Grimes  * All Rights Reserved.
75b81b6b3SRodney W. Grimes  *
85b81b6b3SRodney W. Grimes  * Permission to use, copy, modify and distribute this software and its
95b81b6b3SRodney W. Grimes  * documentation is hereby granted, provided that both the copyright
105b81b6b3SRodney W. Grimes  * notice and this permission notice appear in all copies of the
115b81b6b3SRodney W. Grimes  * software, derivative works or modified versions, and any portions
125b81b6b3SRodney W. Grimes  * thereof, and that both notices appear in supporting documentation.
135b81b6b3SRodney W. Grimes  *
145b81b6b3SRodney W. Grimes  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
155b81b6b3SRodney W. Grimes  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
165b81b6b3SRodney W. Grimes  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
175b81b6b3SRodney W. Grimes  *
185b81b6b3SRodney W. Grimes  * Carnegie Mellon requests users of this software to return to
195b81b6b3SRodney W. Grimes  *
205b81b6b3SRodney W. Grimes  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
215b81b6b3SRodney W. Grimes  *  School of Computer Science
225b81b6b3SRodney W. Grimes  *  Carnegie Mellon University
235b81b6b3SRodney W. Grimes  *  Pittsburgh PA 15213-3890
245b81b6b3SRodney W. Grimes  *
255b81b6b3SRodney W. Grimes  * any improvements or extensions that they make and grant Carnegie the
265b81b6b3SRodney W. Grimes  * rights to redistribute these changes.
270edf66ecSRodney W. Grimes  *
285b81b6b3SRodney W. Grimes  */
295b81b6b3SRodney W. Grimes /*
305b81b6b3SRodney W. Grimes  *	Author: David B. Golub, Carnegie Mellon University
315b81b6b3SRodney W. Grimes  *	Date:	7/90
325b81b6b3SRodney W. Grimes  */
335b81b6b3SRodney W. Grimes /*
345b81b6b3SRodney W. Grimes  * Breakpoints.
355b81b6b3SRodney W. Grimes  */
36753960f7SDavid E. O'Brien 
37f540b106SGarrett Wollman #include <sys/param.h>
38*076b64e8SAndrew Turner #include <sys/systm.h>
39*076b64e8SAndrew Turner #include <sys/kdb.h>
405b81b6b3SRodney W. Grimes 
415ccbc3ccSBruce Evans #include <vm/vm.h>
425ccbc3ccSBruce Evans #include <vm/vm_kern.h>
435ccbc3ccSBruce Evans 
44*076b64e8SAndrew Turner #include <machine/kdb.h>
45*076b64e8SAndrew Turner 
465ccbc3ccSBruce Evans #include <ddb/ddb.h>
475b81b6b3SRodney W. Grimes #include <ddb/db_break.h>
485b81b6b3SRodney W. Grimes #include <ddb/db_access.h>
495b81b6b3SRodney W. Grimes #include <ddb/db_sym.h>
505b81b6b3SRodney W. Grimes 
51f4a6036aSAndrew Turner struct db_breakpoint_type {
52f4a6036aSAndrew Turner 	db_breakpoint_t		db_next_free_breakpoint;
53f4a6036aSAndrew Turner 	db_breakpoint_t		db_breakpoint_limit;
54f4a6036aSAndrew Turner 	db_breakpoint_t		db_free_breakpoints;
55f4a6036aSAndrew Turner 	db_breakpoint_t		db_breakpoint_list;
56f4a6036aSAndrew Turner };
57f4a6036aSAndrew Turner 
585b81b6b3SRodney W. Grimes #define	NBREAKPOINTS	100
5925eb640dSPoul-Henning Kamp static struct db_breakpoint	db_break_table[NBREAKPOINTS];
605b81b6b3SRodney W. Grimes 
61f4a6036aSAndrew Turner static struct db_breakpoint_type db_breakpoint = {
62f4a6036aSAndrew Turner 	.db_next_free_breakpoint = &db_break_table[0],
63f4a6036aSAndrew Turner 	.db_breakpoint_limit = &db_break_table[NBREAKPOINTS],
64f4a6036aSAndrew Turner 	.db_free_breakpoints = NULL,
65f4a6036aSAndrew Turner 	.db_breakpoint_list = NULL,
66f4a6036aSAndrew Turner };
67f4a6036aSAndrew Turner 
68*076b64e8SAndrew Turner #ifdef HAS_HW_BREAKPOINT
69*076b64e8SAndrew Turner static struct db_breakpoint	db_hbreak_table[NHBREAKPOINTS];
70*076b64e8SAndrew Turner 
71*076b64e8SAndrew Turner static struct db_breakpoint_type db_hbreakpoint = {
72*076b64e8SAndrew Turner 	.db_next_free_breakpoint = &db_hbreak_table[0],
73*076b64e8SAndrew Turner 	.db_breakpoint_limit = &db_hbreak_table[NHBREAKPOINTS],
74*076b64e8SAndrew Turner 	.db_free_breakpoints = NULL,
75*076b64e8SAndrew Turner 	.db_breakpoint_list = NULL,
76*076b64e8SAndrew Turner };
77*076b64e8SAndrew Turner #endif
78*076b64e8SAndrew Turner 
79f4a6036aSAndrew Turner static db_breakpoint_t	db_breakpoint_alloc(
80f4a6036aSAndrew Turner 	struct db_breakpoint_type *bkpt_type);
81f4a6036aSAndrew Turner static void	db_breakpoint_free(struct db_breakpoint_type *bkpt_typ,
82f4a6036aSAndrew Turner 	db_breakpoint_t bkpt);
83f4a6036aSAndrew Turner static void	db_delete_breakpoint(struct db_breakpoint_type *bkpt_type,
84f4a6036aSAndrew Turner 	vm_map_t map, db_addr_t addr);
85f4a6036aSAndrew Turner static db_breakpoint_t	db_find_breakpoint(struct db_breakpoint_type *bkpt_type,
86f4a6036aSAndrew Turner 	vm_map_t map, db_addr_t addr);
8714e10f99SAlfred Perlstein static void	db_list_breakpoints(void);
88*076b64e8SAndrew Turner static bool	db_set_breakpoint(struct db_breakpoint_type *bkpt_type,
89f4a6036aSAndrew Turner 	vm_map_t map, db_addr_t addr, int count);
90f73a856dSPoul-Henning Kamp 
91f73a856dSPoul-Henning Kamp static db_breakpoint_t
92f4a6036aSAndrew Turner db_breakpoint_alloc(struct db_breakpoint_type *bkpt_type)
935b81b6b3SRodney W. Grimes {
945b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
955b81b6b3SRodney W. Grimes 
96f4a6036aSAndrew Turner 	if ((bkpt = bkpt_type->db_free_breakpoints) != 0) {
97f4a6036aSAndrew Turner 	    bkpt_type->db_free_breakpoints = bkpt->link;
985b81b6b3SRodney W. Grimes 	    return (bkpt);
995b81b6b3SRodney W. Grimes 	}
100f4a6036aSAndrew Turner 	if (bkpt_type->db_next_free_breakpoint ==
101f4a6036aSAndrew Turner 	    bkpt_type->db_breakpoint_limit) {
1025b81b6b3SRodney W. Grimes 	    db_printf("All breakpoints used.\n");
1035b81b6b3SRodney W. Grimes 	    return (0);
1045b81b6b3SRodney W. Grimes 	}
105f4a6036aSAndrew Turner 	bkpt = bkpt_type->db_next_free_breakpoint;
106f4a6036aSAndrew Turner 	bkpt_type->db_next_free_breakpoint++;
1075b81b6b3SRodney W. Grimes 
1085b81b6b3SRodney W. Grimes 	return (bkpt);
1095b81b6b3SRodney W. Grimes }
1105b81b6b3SRodney W. Grimes 
111f73a856dSPoul-Henning Kamp static void
112f4a6036aSAndrew Turner db_breakpoint_free(struct db_breakpoint_type *bkpt_type, db_breakpoint_t bkpt)
1135b81b6b3SRodney W. Grimes {
114f4a6036aSAndrew Turner 	bkpt->link = bkpt_type->db_free_breakpoints;
115f4a6036aSAndrew Turner 	bkpt_type->db_free_breakpoints = bkpt;
1165b81b6b3SRodney W. Grimes }
1175b81b6b3SRodney W. Grimes 
118*076b64e8SAndrew Turner static bool
119f4a6036aSAndrew Turner db_set_breakpoint(struct db_breakpoint_type *bkpt_type, vm_map_t map,
120f4a6036aSAndrew Turner     db_addr_t addr, int count)
1215b81b6b3SRodney W. Grimes {
1225b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
1235b81b6b3SRodney W. Grimes 
124f4a6036aSAndrew Turner 	if (db_find_breakpoint(bkpt_type, map, addr)) {
1255b81b6b3SRodney W. Grimes 	    db_printf("Already set.\n");
126*076b64e8SAndrew Turner 	    return (false);
1275b81b6b3SRodney W. Grimes 	}
1285b81b6b3SRodney W. Grimes 
129f4a6036aSAndrew Turner 	bkpt = db_breakpoint_alloc(bkpt_type);
1305b81b6b3SRodney W. Grimes 	if (bkpt == 0) {
1315b81b6b3SRodney W. Grimes 	    db_printf("Too many breakpoints.\n");
132*076b64e8SAndrew Turner 	    return (false);
1335b81b6b3SRodney W. Grimes 	}
1345b81b6b3SRodney W. Grimes 
1355b81b6b3SRodney W. Grimes 	bkpt->map = map;
1365b81b6b3SRodney W. Grimes 	bkpt->address = addr;
1375b81b6b3SRodney W. Grimes 	bkpt->flags = 0;
1385b81b6b3SRodney W. Grimes 	bkpt->init_count = count;
1395b81b6b3SRodney W. Grimes 	bkpt->count = count;
1405b81b6b3SRodney W. Grimes 
141f4a6036aSAndrew Turner 	bkpt->link = bkpt_type->db_breakpoint_list;
142f4a6036aSAndrew Turner 	bkpt_type->db_breakpoint_list = bkpt;
143*076b64e8SAndrew Turner 
144*076b64e8SAndrew Turner 	return (true);
1455b81b6b3SRodney W. Grimes }
1465b81b6b3SRodney W. Grimes 
147f73a856dSPoul-Henning Kamp static void
148f4a6036aSAndrew Turner db_delete_breakpoint(struct db_breakpoint_type *bkpt_type, vm_map_t map,
149f4a6036aSAndrew Turner     db_addr_t addr)
1505b81b6b3SRodney W. Grimes {
1515b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
1525b81b6b3SRodney W. Grimes 	register db_breakpoint_t	*prev;
1535b81b6b3SRodney W. Grimes 
154f4a6036aSAndrew Turner 	for (prev = &bkpt_type->db_breakpoint_list;
1555b81b6b3SRodney W. Grimes 	     (bkpt = *prev) != 0;
1565b81b6b3SRodney W. Grimes 	     prev = &bkpt->link) {
1575b81b6b3SRodney W. Grimes 	    if (db_map_equal(bkpt->map, map) &&
1585b81b6b3SRodney W. Grimes 		(bkpt->address == addr)) {
1595b81b6b3SRodney W. Grimes 		*prev = bkpt->link;
1605b81b6b3SRodney W. Grimes 		break;
1615b81b6b3SRodney W. Grimes 	    }
1625b81b6b3SRodney W. Grimes 	}
1635b81b6b3SRodney W. Grimes 	if (bkpt == 0) {
1645b81b6b3SRodney W. Grimes 	    db_printf("Not set.\n");
1655b81b6b3SRodney W. Grimes 	    return;
1665b81b6b3SRodney W. Grimes 	}
1675b81b6b3SRodney W. Grimes 
168f4a6036aSAndrew Turner 	db_breakpoint_free(bkpt_type, bkpt);
1695b81b6b3SRodney W. Grimes }
1705b81b6b3SRodney W. Grimes 
171f73a856dSPoul-Henning Kamp static db_breakpoint_t
172f4a6036aSAndrew Turner db_find_breakpoint(struct db_breakpoint_type *bkpt_type, vm_map_t map,
173f4a6036aSAndrew Turner     db_addr_t addr)
1745b81b6b3SRodney W. Grimes {
1755b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
1765b81b6b3SRodney W. Grimes 
177f4a6036aSAndrew Turner 	for (bkpt = bkpt_type->db_breakpoint_list;
1785b81b6b3SRodney W. Grimes 	     bkpt != 0;
1795b81b6b3SRodney W. Grimes 	     bkpt = bkpt->link)
1805b81b6b3SRodney W. Grimes 	{
1815b81b6b3SRodney W. Grimes 	    if (db_map_equal(bkpt->map, map) &&
1825b81b6b3SRodney W. Grimes 		(bkpt->address == addr))
1835b81b6b3SRodney W. Grimes 		return (bkpt);
1845b81b6b3SRodney W. Grimes 	}
1855b81b6b3SRodney W. Grimes 	return (0);
1865b81b6b3SRodney W. Grimes }
1875b81b6b3SRodney W. Grimes 
1885b81b6b3SRodney W. Grimes db_breakpoint_t
189a41dd031SPedro F. Giffuni db_find_breakpoint_here(db_addr_t addr)
1905b81b6b3SRodney W. Grimes {
191*076b64e8SAndrew Turner 	db_breakpoint_t bkpt;
192*076b64e8SAndrew Turner 
193*076b64e8SAndrew Turner 	bkpt = db_find_breakpoint(&db_breakpoint, db_map_addr(addr), addr);
194*076b64e8SAndrew Turner #ifdef HAS_HW_BREAKPOINT
195*076b64e8SAndrew Turner 	if (bkpt == NULL)
196*076b64e8SAndrew Turner 		bkpt = db_find_breakpoint(&db_hbreakpoint, db_map_addr(addr),
197*076b64e8SAndrew Turner 		    addr);
198*076b64e8SAndrew Turner #endif
199*076b64e8SAndrew Turner 
200*076b64e8SAndrew Turner 	return (bkpt);
2015b81b6b3SRodney W. Grimes }
2025b81b6b3SRodney W. Grimes 
203cd508278SPedro F. Giffuni static bool	db_breakpoints_inserted = true;
2045b81b6b3SRodney W. Grimes 
2053a0b4f25SDoug Rabson #ifndef BKPT_WRITE
2063a0b4f25SDoug Rabson #define	BKPT_WRITE(addr, storage)				\
2073a0b4f25SDoug Rabson do {								\
2082b490bc7SPedro F. Giffuni 	*storage = db_get_value(addr, BKPT_SIZE, false);	\
2093a0b4f25SDoug Rabson 	db_put_value(addr, BKPT_SIZE, BKPT_SET(*storage));	\
2103a0b4f25SDoug Rabson } while (0)
2113a0b4f25SDoug Rabson #endif
2123a0b4f25SDoug Rabson 
2133a0b4f25SDoug Rabson #ifndef BKPT_CLEAR
2143a0b4f25SDoug Rabson #define	BKPT_CLEAR(addr, storage) \
2153a0b4f25SDoug Rabson 	db_put_value(addr, BKPT_SIZE, *storage)
2163a0b4f25SDoug Rabson #endif
2173a0b4f25SDoug Rabson 
218*076b64e8SAndrew Turner /*
219*076b64e8SAndrew Turner  * Set software breakpoints.
220*076b64e8SAndrew Turner  */
2215b81b6b3SRodney W. Grimes void
222a41dd031SPedro F. Giffuni db_set_breakpoints(void)
2235b81b6b3SRodney W. Grimes {
2245b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
2255b81b6b3SRodney W. Grimes 
2265b81b6b3SRodney W. Grimes 	if (!db_breakpoints_inserted) {
227f4a6036aSAndrew Turner 		for (bkpt = db_breakpoint.db_breakpoint_list;
2285b81b6b3SRodney W. Grimes 		     bkpt != 0;
2295b81b6b3SRodney W. Grimes 		     bkpt = bkpt->link)
2305b81b6b3SRodney W. Grimes 			if (db_map_current(bkpt->map)) {
2313a0b4f25SDoug Rabson 				BKPT_WRITE(bkpt->address, &bkpt->bkpt_inst);
2325b81b6b3SRodney W. Grimes 			}
2332b490bc7SPedro F. Giffuni 		db_breakpoints_inserted = true;
2345b81b6b3SRodney W. Grimes 	}
2355b81b6b3SRodney W. Grimes }
2365b81b6b3SRodney W. Grimes 
237*076b64e8SAndrew Turner /*
238*076b64e8SAndrew Turner  * Clean software breakpoints.
239*076b64e8SAndrew Turner  */
2405b81b6b3SRodney W. Grimes void
241a41dd031SPedro F. Giffuni db_clear_breakpoints(void)
2425b81b6b3SRodney W. Grimes {
2435b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
2445b81b6b3SRodney W. Grimes 
2455b81b6b3SRodney W. Grimes 	if (db_breakpoints_inserted) {
246f4a6036aSAndrew Turner 		for (bkpt = db_breakpoint.db_breakpoint_list;
2475b81b6b3SRodney W. Grimes 		     bkpt != 0;
2485b81b6b3SRodney W. Grimes 		     bkpt = bkpt->link)
2495b81b6b3SRodney W. Grimes 			if (db_map_current(bkpt->map)) {
2503a0b4f25SDoug Rabson 				BKPT_CLEAR(bkpt->address, &bkpt->bkpt_inst);
2515b81b6b3SRodney W. Grimes 			}
2522b490bc7SPedro F. Giffuni 		db_breakpoints_inserted = false;
2535b81b6b3SRodney W. Grimes 	}
2545b81b6b3SRodney W. Grimes }
2555b81b6b3SRodney W. Grimes 
2565b81b6b3SRodney W. Grimes /*
257*076b64e8SAndrew Turner  * List software breakpoints.
2585b81b6b3SRodney W. Grimes  */
259f73a856dSPoul-Henning Kamp static void
260a41dd031SPedro F. Giffuni db_list_breakpoints(void)
2615b81b6b3SRodney W. Grimes {
2625b81b6b3SRodney W. Grimes 	register db_breakpoint_t	bkpt;
2635b81b6b3SRodney W. Grimes 
264f4a6036aSAndrew Turner 	if (db_breakpoint.db_breakpoint_list == 0) {
2655b81b6b3SRodney W. Grimes 	    db_printf("No breakpoints set\n");
2665b81b6b3SRodney W. Grimes 	    return;
2675b81b6b3SRodney W. Grimes 	}
2685b81b6b3SRodney W. Grimes 
2695b81b6b3SRodney W. Grimes 	db_printf(" Map      Count    Address\n");
270f4a6036aSAndrew Turner 	for (bkpt = db_breakpoint.db_breakpoint_list;
2715b81b6b3SRodney W. Grimes 	     bkpt != 0;
27290163a9bSBruce Evans 	     bkpt = bkpt->link) {
27390163a9bSBruce Evans 	    db_printf("%s%8p %5d    ",
2745b81b6b3SRodney W. Grimes 		      db_map_current(bkpt->map) ? "*" : " ",
27590163a9bSBruce Evans 		      (void *)bkpt->map, bkpt->init_count);
2765b81b6b3SRodney W. Grimes 	    db_printsym(bkpt->address, DB_STGY_PROC);
2775b81b6b3SRodney W. Grimes 	    db_printf("\n");
2785b81b6b3SRodney W. Grimes 	}
2795b81b6b3SRodney W. Grimes }
2805b81b6b3SRodney W. Grimes 
281*076b64e8SAndrew Turner /*
282*076b64e8SAndrew Turner  * Delete software breakpoint
283*076b64e8SAndrew Turner  */
2845b81b6b3SRodney W. Grimes /*ARGSUSED*/
2855b81b6b3SRodney W. Grimes void
286cd508278SPedro F. Giffuni db_delete_cmd(db_expr_t addr, bool have_addr, db_expr_t count, char *modif)
2875b81b6b3SRodney W. Grimes {
288f4a6036aSAndrew Turner 	db_delete_breakpoint(&db_breakpoint, db_map_addr(addr),
289f4a6036aSAndrew Turner 	    (db_addr_t)addr);
2905b81b6b3SRodney W. Grimes }
2915b81b6b3SRodney W. Grimes 
292*076b64e8SAndrew Turner /*
293*076b64e8SAndrew Turner  * Set software breakpoint with skip count
294*076b64e8SAndrew Turner  */
2955b81b6b3SRodney W. Grimes /*ARGSUSED*/
2965b81b6b3SRodney W. Grimes void
297cd508278SPedro F. Giffuni db_breakpoint_cmd(db_expr_t addr, bool have_addr, db_expr_t count, char *modif)
2985b81b6b3SRodney W. Grimes {
2995b81b6b3SRodney W. Grimes 	if (count == -1)
3005b81b6b3SRodney W. Grimes 	    count = 1;
3015b81b6b3SRodney W. Grimes 
302f4a6036aSAndrew Turner 	db_set_breakpoint(&db_breakpoint, db_map_addr(addr), (db_addr_t)addr,
303f4a6036aSAndrew Turner 	    count);
3045b81b6b3SRodney W. Grimes }
3055b81b6b3SRodney W. Grimes 
306*076b64e8SAndrew Turner #ifdef HAS_HW_BREAKPOINT
307*076b64e8SAndrew Turner /*
308*076b64e8SAndrew Turner  * Delete hardware breakpoint
309*076b64e8SAndrew Turner  */
310*076b64e8SAndrew Turner void
311*076b64e8SAndrew Turner db_deletehbreak_cmd(db_expr_t addr, bool have_addr, db_expr_t count,
312*076b64e8SAndrew Turner     char *modif)
313*076b64e8SAndrew Turner {
314*076b64e8SAndrew Turner 	if (count == -1)
315*076b64e8SAndrew Turner 	    count = 1;
316*076b64e8SAndrew Turner 
317*076b64e8SAndrew Turner 	if (kdb_cpu_clr_breakpoint(addr) != 0) {
318*076b64e8SAndrew Turner 		db_printf("hardware breakpoint could not be delete\n");
319*076b64e8SAndrew Turner 		return;
320*076b64e8SAndrew Turner 	}
321*076b64e8SAndrew Turner 
322*076b64e8SAndrew Turner 	db_delete_breakpoint(&db_hbreakpoint, db_map_addr(addr),
323*076b64e8SAndrew Turner 	    (db_addr_t)addr);
324*076b64e8SAndrew Turner }
325*076b64e8SAndrew Turner 
326*076b64e8SAndrew Turner /*
327*076b64e8SAndrew Turner  * Set hardware breakpoint
328*076b64e8SAndrew Turner  */
329*076b64e8SAndrew Turner void
330*076b64e8SAndrew Turner db_hbreakpoint_cmd(db_expr_t addr, bool have_addr, db_expr_t count, char *modif)
331*076b64e8SAndrew Turner {
332*076b64e8SAndrew Turner 	if (count == -1)
333*076b64e8SAndrew Turner 	    count = 1;
334*076b64e8SAndrew Turner 
335*076b64e8SAndrew Turner 	if (!db_set_breakpoint(&db_hbreakpoint, db_map_addr(addr),
336*076b64e8SAndrew Turner 	    (db_addr_t)addr, count))
337*076b64e8SAndrew Turner 		return;
338*076b64e8SAndrew Turner 
339*076b64e8SAndrew Turner 	if (kdb_cpu_set_breakpoint(addr) != 0) {
340*076b64e8SAndrew Turner 		db_printf("hardware breakpoint could not be set\n");
341*076b64e8SAndrew Turner 		db_delete_breakpoint(&db_hbreakpoint, db_map_addr(addr),
342*076b64e8SAndrew Turner 		    (db_addr_t)addr);
343*076b64e8SAndrew Turner 	}
344*076b64e8SAndrew Turner }
345*076b64e8SAndrew Turner #endif
346*076b64e8SAndrew Turner 
3475b81b6b3SRodney W. Grimes /* list breakpoints */
3485b81b6b3SRodney W. Grimes void
349cd508278SPedro F. Giffuni db_listbreak_cmd(db_expr_t dummy1, bool dummy2, db_expr_t dummy3, char *dummy4)
3505b81b6b3SRodney W. Grimes {
3515b81b6b3SRodney W. Grimes 	db_list_breakpoints();
352*076b64e8SAndrew Turner #ifdef HAS_HW_BREAKPOINT
353*076b64e8SAndrew Turner 	db_md_list_breakpoints();
354*076b64e8SAndrew Turner #endif
3555b81b6b3SRodney W. Grimes }
3565b81b6b3SRodney W. Grimes 
3575b81b6b3SRodney W. Grimes /*
3585b81b6b3SRodney W. Grimes  *	We want ddb to be usable before most of the kernel has been
3595b81b6b3SRodney W. Grimes  *	initialized.  In particular, current_thread() or kernel_map
3605b81b6b3SRodney W. Grimes  *	(or both) may be null.
3615b81b6b3SRodney W. Grimes  */
3625b81b6b3SRodney W. Grimes 
363cd508278SPedro F. Giffuni bool
364a41dd031SPedro F. Giffuni db_map_equal(vm_map_t map1, vm_map_t map2)
3655b81b6b3SRodney W. Grimes {
3665b81b6b3SRodney W. Grimes 	return ((map1 == map2) ||
3675b81b6b3SRodney W. Grimes 		((map1 == NULL) && (map2 == kernel_map)) ||
3685b81b6b3SRodney W. Grimes 		((map1 == kernel_map) && (map2 == NULL)));
3695b81b6b3SRodney W. Grimes }
3705b81b6b3SRodney W. Grimes 
371cd508278SPedro F. Giffuni bool
372a41dd031SPedro F. Giffuni db_map_current(vm_map_t map)
3735b81b6b3SRodney W. Grimes {
3745b81b6b3SRodney W. Grimes #if 0
3755b81b6b3SRodney W. Grimes 	thread_t	thread;
3765b81b6b3SRodney W. Grimes 
3775b81b6b3SRodney W. Grimes 	return ((map == NULL) ||
3785b81b6b3SRodney W. Grimes 		(map == kernel_map) ||
3795b81b6b3SRodney W. Grimes 		(((thread = current_thread()) != NULL) &&
3805b81b6b3SRodney W. Grimes 		 (map == thread->task->map)));
3815b81b6b3SRodney W. Grimes #else
382cd508278SPedro F. Giffuni 	return (true);
3835b81b6b3SRodney W. Grimes #endif
3845b81b6b3SRodney W. Grimes }
3855b81b6b3SRodney W. Grimes 
3865b81b6b3SRodney W. Grimes vm_map_t
387a41dd031SPedro F. Giffuni db_map_addr(vm_offset_t addr)
3885b81b6b3SRodney W. Grimes {
3895b81b6b3SRodney W. Grimes #if 0
3905b81b6b3SRodney W. Grimes 	thread_t	thread;
3915b81b6b3SRodney W. Grimes 
3925b81b6b3SRodney W. Grimes 	/*
3935b81b6b3SRodney W. Grimes 	 *	We want to return kernel_map for all
3945b81b6b3SRodney W. Grimes 	 *	non-user addresses, even when debugging
3955b81b6b3SRodney W. Grimes 	 *	kernel tasks with their own maps.
3965b81b6b3SRodney W. Grimes 	 */
3975b81b6b3SRodney W. Grimes 
3985b81b6b3SRodney W. Grimes 	if ((VM_MIN_ADDRESS <= addr) &&
3995b81b6b3SRodney W. Grimes 	    (addr < VM_MAX_ADDRESS) &&
4005b81b6b3SRodney W. Grimes 	    ((thread = current_thread()) != NULL))
4015b81b6b3SRodney W. Grimes 	    return thread->task->map;
4025b81b6b3SRodney W. Grimes 	else
4035b81b6b3SRodney W. Grimes #endif
4045b81b6b3SRodney W. Grimes 	    return kernel_map;
4055b81b6b3SRodney W. Grimes }
406