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