diff options
Diffstat (limited to 'sys/ddb/db_break.c')
| -rw-r--r-- | sys/ddb/db_break.c | 204 |
1 files changed, 93 insertions, 111 deletions
diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c index 5802c070f36..ae69038bd08 100644 --- a/sys/ddb/db_break.c +++ b/sys/ddb/db_break.c @@ -1,27 +1,27 @@ -/* $NetBSD: db_break.c,v 1.16 2001/11/12 22:54:04 lukem Exp $ */ +/* $NetBSD: db_break.c,v 1.17 2002/02/15 07:33:49 simonb Exp $ */ -/* +/* * Mach Operating System * Copyright (c) 1991,1990 Carnegie Mellon University * All Rights Reserved. - * + * * Permission to use, copy, modify and distribute this software and its * documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * + * * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to - * + * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU * School of Computer Science * Carnegie Mellon University * Pittsburgh PA 15213-3890 - * + * * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. * @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_break.c,v 1.16 2001/11/12 22:54:04 lukem Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_break.c,v 1.17 2002/02/15 07:33:49 simonb Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -48,23 +48,30 @@ __KERNEL_RCSID(0, "$NetBSD: db_break.c,v 1.16 2001/11/12 22:54:04 lukem Exp $"); #include <ddb/db_output.h> #define NBREAKPOINTS 100 -struct db_breakpoint db_break_table[NBREAKPOINTS]; -db_breakpoint_t db_next_free_breakpoint = &db_break_table[0]; -db_breakpoint_t db_free_breakpoints = 0; -db_breakpoint_t db_breakpoint_list = 0; - -db_breakpoint_t -db_breakpoint_alloc() +static struct db_breakpoint db_break_table[NBREAKPOINTS]; +static db_breakpoint_t db_next_free_breakpoint = &db_break_table[0]; +static db_breakpoint_t db_free_breakpoints = 0; +static db_breakpoint_t db_breakpoint_list = 0; + +static db_breakpoint_t db_breakpoint_alloc(void); +static void db_breakpoint_free(db_breakpoint_t); +static void db_delete_breakpoint(struct vm_map *, db_addr_t); +static db_breakpoint_t db_find_breakpoint(struct vm_map *, db_addr_t); +static void db_list_breakpoints(void); +static void db_set_breakpoint(struct vm_map *, db_addr_t, int); + +static db_breakpoint_t +db_breakpoint_alloc(void) { db_breakpoint_t bkpt; if ((bkpt = db_free_breakpoints) != 0) { - db_free_breakpoints = bkpt->link; - return (bkpt); + db_free_breakpoints = bkpt->link; + return (bkpt); } if (db_next_free_breakpoint == &db_break_table[NBREAKPOINTS]) { - db_printf("All breakpoints used.\n"); - return (0); + db_printf("All breakpoints used.\n"); + return (0); } bkpt = db_next_free_breakpoint; db_next_free_breakpoint++; @@ -72,31 +79,27 @@ db_breakpoint_alloc() return (bkpt); } -void -db_breakpoint_free(bkpt) - db_breakpoint_t bkpt; +static void +db_breakpoint_free(db_breakpoint_t bkpt) { bkpt->link = db_free_breakpoints; db_free_breakpoints = bkpt; } void -db_set_breakpoint(map, addr, count) - struct vm_map *map; - db_addr_t addr; - int count; +db_set_breakpoint(struct vm_map *map, db_addr_t addr, int count) { db_breakpoint_t bkpt; if (db_find_breakpoint(map, addr)) { - db_printf("Already set.\n"); - return; + db_printf("Already set.\n"); + return; } bkpt = db_breakpoint_alloc(); if (bkpt == 0) { - db_printf("Too many breakpoints.\n"); - return; + db_printf("Too many breakpoints.\n"); + return; } bkpt->map = map; @@ -109,10 +112,8 @@ db_set_breakpoint(map, addr, count) db_breakpoint_list = bkpt; } -void -db_delete_breakpoint(map, addr) - struct vm_map *map; - db_addr_t addr; +static void +db_delete_breakpoint(struct vm_map *map, db_addr_t addr) { db_breakpoint_t bkpt; db_breakpoint_t *prev; @@ -120,83 +121,77 @@ db_delete_breakpoint(map, addr) for (prev = &db_breakpoint_list; (bkpt = *prev) != 0; prev = &bkpt->link) { - if (db_map_equal(bkpt->map, map) && - (bkpt->address == addr)) { - *prev = bkpt->link; - break; - } + if (db_map_equal(bkpt->map, map) && + (bkpt->address == addr)) { + *prev = bkpt->link; + break; + } } if (bkpt == 0) { - db_printf("Not set.\n"); - return; + db_printf("Not set.\n"); + return; } db_breakpoint_free(bkpt); } db_breakpoint_t -db_find_breakpoint(map, addr) - struct vm_map *map; - db_addr_t addr; +db_find_breakpoint(struct vm_map *map, db_addr_t addr) { db_breakpoint_t bkpt; for (bkpt = db_breakpoint_list; bkpt != 0; bkpt = bkpt->link) - { - if (db_map_equal(bkpt->map, map) && - (bkpt->address == addr)) - return (bkpt); - } + if (db_map_equal(bkpt->map, map) && + (bkpt->address == addr)) + return (bkpt); + return (0); } db_breakpoint_t -db_find_breakpoint_here(addr) - db_addr_t addr; +db_find_breakpoint_here(db_addr_t addr) { - return db_find_breakpoint(db_map_addr(addr), addr); + return db_find_breakpoint(db_map_addr(addr), addr); } -boolean_t db_breakpoints_inserted = TRUE; +static boolean_t db_breakpoints_inserted = TRUE; void -db_set_breakpoints() +db_set_breakpoints(void) { db_breakpoint_t bkpt; if (!db_breakpoints_inserted) { - for (bkpt = db_breakpoint_list; - bkpt != 0; - bkpt = bkpt->link) - if (db_map_current(bkpt->map)) { - bkpt->bkpt_inst = db_get_value(bkpt->address, - BKPT_SIZE, - FALSE); - db_put_value(bkpt->address, - BKPT_SIZE, - BKPT_SET(bkpt->bkpt_inst)); - } - db_breakpoints_inserted = TRUE; + for (bkpt = db_breakpoint_list; + bkpt != 0; + bkpt = bkpt->link) + if (db_map_current(bkpt->map)) { + bkpt->bkpt_inst = db_get_value(bkpt->address, + BKPT_SIZE, FALSE); + db_put_value(bkpt->address, + BKPT_SIZE, BKPT_SET(bkpt->bkpt_inst)); + } + db_breakpoints_inserted = TRUE; } } void -db_clear_breakpoints() +db_clear_breakpoints(void) { db_breakpoint_t bkpt; if (db_breakpoints_inserted) { - for (bkpt = db_breakpoint_list; - bkpt != 0; - bkpt = bkpt->link) - if (db_map_current(bkpt->map)) { - db_put_value(bkpt->address, BKPT_SIZE, bkpt->bkpt_inst); - } - db_breakpoints_inserted = FALSE; + for (bkpt = db_breakpoint_list; + bkpt != 0; + bkpt = bkpt->link) + if (db_map_current(bkpt->map)) + db_put_value(bkpt->address, BKPT_SIZE, + bkpt->bkpt_inst); + db_breakpoints_inserted = FALSE; } } @@ -204,51 +199,44 @@ db_clear_breakpoints() * List breakpoints. */ void -db_list_breakpoints() +db_list_breakpoints(void) { db_breakpoint_t bkpt; if (db_breakpoint_list == 0) { - db_printf("No breakpoints set\n"); - return; + db_printf("No breakpoints set\n"); + return; } db_printf(" Map Count Address\n"); for (bkpt = db_breakpoint_list; bkpt != 0; - bkpt = bkpt->link) - { - db_printf("%s%p %5d ", - db_map_current(bkpt->map) ? "*" : " ", - bkpt->map, bkpt->init_count); - db_printsym(bkpt->address, DB_STGY_PROC, db_printf); - db_printf("\n"); + bkpt = bkpt->link) { + db_printf("%s%p %5d ", + db_map_current(bkpt->map) ? "*" : " ", + bkpt->map, bkpt->init_count); + db_printsym(bkpt->address, DB_STGY_PROC, db_printf); + db_printf("\n"); } } /* Delete breakpoint */ /*ARGSUSED*/ void -db_delete_cmd(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char * modif; +db_delete_cmd(db_expr_t addr, int have_addr, db_expr_t count, char * modif) { + db_delete_breakpoint(db_map_addr(addr), (db_addr_t)addr); } /* Set breakpoint with skip count */ /*ARGSUSED*/ void -db_breakpoint_cmd(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char * modif; +db_breakpoint_cmd(db_expr_t addr, int have_addr, db_expr_t count, char * modif) { + if (count == -1) - count = 1; + count = 1; db_set_breakpoint(db_map_addr(addr), (db_addr_t)addr, count); } @@ -256,12 +244,9 @@ db_breakpoint_cmd(addr, have_addr, count, modif) /* list breakpoints */ /*ARGSUSED*/ void -db_listbreak_cmd(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char * modif; +db_listbreak_cmd(db_expr_t addr, int have_addr, db_expr_t count, char * modif) { + db_list_breakpoints(); } @@ -274,18 +259,16 @@ db_listbreak_cmd(addr, have_addr, count, modif) */ boolean_t -db_map_equal(map1, map2) - struct vm_map *map1; - struct vm_map *map2; +db_map_equal(struct vm_map *map1, struct vm_map *map2) { + return ((map1 == map2) || ((map1 == NULL) && (map2 == kernel_map)) || ((map1 == kernel_map) && (map2 == NULL))); } boolean_t -db_map_current(map) - struct vm_map *map; +db_map_current(struct vm_map *map) { #if 0 thread_t thread; @@ -295,13 +278,13 @@ db_map_current(map) (((thread = current_thread()) != NULL) && (map == thread->task->map))); #else + return (1); #endif } struct vm_map * -db_map_addr(addr) - vaddr_t addr; +db_map_addr(vaddr_t addr) { #if 0 thread_t thread; @@ -312,11 +295,10 @@ db_map_addr(addr) * kernel tasks with their own maps. */ - if ((VM_MIN_ADDRESS <= addr) && - (addr < VM_MAX_ADDRESS) && + if ((VM_MIN_ADDRESS <= addr) && (addr < VM_MAX_ADDRESS) && ((thread = current_thread()) != NULL)) - return thread->task->map; + return thread->task->map; else #endif - return kernel_map; + return kernel_map; } |
