1*949c1c4eSmiod /* $OpenBSD: db_command.c,v 1.103 2024/11/07 16:02:29 miod Exp $ */ 2d724e01aSderaadt /* $NetBSD: db_command.c,v 1.20 1996/03/30 22:30:05 christos Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /* 5df930be7Sderaadt * Mach Operating System 6b2471a9dSmickey * Copyright (c) 1993,1992,1991,1990 Carnegie Mellon University 7df930be7Sderaadt * All Rights Reserved. 8df930be7Sderaadt * 9df930be7Sderaadt * Permission to use, copy, modify and distribute this software and its 10df930be7Sderaadt * documentation is hereby granted, provided that both the copyright 11df930be7Sderaadt * notice and this permission notice appear in all copies of the 12df930be7Sderaadt * software, derivative works or modified versions, and any portions 13df930be7Sderaadt * thereof, and that both notices appear in supporting documentation. 14df930be7Sderaadt * 15b2471a9dSmickey * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 16df930be7Sderaadt * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 17df930be7Sderaadt * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 18df930be7Sderaadt * 19df930be7Sderaadt * Carnegie Mellon requests users of this software to return to 20df930be7Sderaadt * 21df930be7Sderaadt * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 22df930be7Sderaadt * School of Computer Science 23df930be7Sderaadt * Carnegie Mellon University 24df930be7Sderaadt * Pittsburgh PA 15213-3890 25df930be7Sderaadt * 26b2471a9dSmickey * any improvements or extensions that they make and grant Carnegie Mellon 27b2471a9dSmickey * the rights to redistribute these changes. 28df930be7Sderaadt */ 29df930be7Sderaadt 30df930be7Sderaadt /* 31df930be7Sderaadt * Command dispatcher. 32df930be7Sderaadt */ 33df930be7Sderaadt #include <sys/param.h> 34b2471a9dSmickey #include <sys/systm.h> 35df930be7Sderaadt #include <sys/proc.h> 363ed44a89Smickey #include <sys/reboot.h> 371c5d553dSweingart #include <sys/extent.h> 38e5efd09cSmiod #include <sys/pool.h> 3936ac4917Smarkus #include <sys/msgbuf.h> 404c0aa4c6Smickey #include <sys/malloc.h> 41918b11b6Smiod #include <sys/mount.h> 42df930be7Sderaadt 43489e49f9Smiod #include <uvm/uvm_extern.h> 44df930be7Sderaadt #include <machine/db_machdep.h> /* type definitions */ 45df930be7Sderaadt 4644fcfd39Smpi #include <ddb/db_access.h> 47df930be7Sderaadt #include <ddb/db_lex.h> 48df930be7Sderaadt #include <ddb/db_output.h> 49df930be7Sderaadt #include <ddb/db_command.h> 503ed44a89Smickey #include <ddb/db_break.h> 513ed44a89Smickey #include <ddb/db_watch.h> 523ed44a89Smickey #include <ddb/db_run.h> 537c814357Smpi #include <ddb/db_sym.h> 54c1088d88Spirofti #include <ddb/db_var.h> 553ed44a89Smickey #include <ddb/db_variables.h> 563ed44a89Smickey #include <ddb/db_interface.h> 573ed44a89Smickey #include <ddb/db_extern.h> 58df930be7Sderaadt 5950eb7ec0Sbluhm #include <netinet/ip_ipsp.h> 60c05d1d79Sart #include <uvm/uvm_ddb.h> 61c05d1d79Sart 62df930be7Sderaadt /* 63df930be7Sderaadt * Exported global variables 64df930be7Sderaadt */ 6526356f19Smiod int db_cmd_loop_done; 663ed44a89Smickey label_t *db_recover; 67df930be7Sderaadt 68df930be7Sderaadt /* 69df930be7Sderaadt * if 'ed' style: 'dot' is set at start of last item printed, 70df930be7Sderaadt * and '+' points to next line. 71df930be7Sderaadt * Otherwise: 'dot' points to next item, '..' points to last. 72df930be7Sderaadt */ 738383b4f2Smpi int db_ed_style = 1; 74df930be7Sderaadt 7508f058f8Smpi vaddr_t db_dot; /* current location */ 7608f058f8Smpi vaddr_t db_last_addr; /* last explicit address typed */ 7708f058f8Smpi vaddr_t db_prev; /* last address examined 780c4981b0Sjason or written */ 7908f058f8Smpi vaddr_t db_next; /* next address to be examined 800c4981b0Sjason or written */ 810c4981b0Sjason 823fe80b7fSnaddy int db_cmd_search(char *, const struct db_command *, 833fe80b7fSnaddy const struct db_command **); 843fe80b7fSnaddy void db_cmd_list(const struct db_command *); 85ad205586Smpi void db_ctf_pprint_cmd(db_expr_t, int, db_expr_t,char *); 86d6f4c764Smpi void db_map_print_cmd(db_expr_t, int, db_expr_t, char *); 87d6f4c764Smpi void db_buf_print_cmd(db_expr_t, int, db_expr_t, char *); 88d6f4c764Smpi void db_malloc_print_cmd(db_expr_t, int, db_expr_t, char *); 89d6f4c764Smpi void db_mbuf_print_cmd(db_expr_t, int, db_expr_t, char *); 90d6f4c764Smpi void db_mount_print_cmd(db_expr_t, int, db_expr_t, char *); 91d6f4c764Smpi void db_show_all_mounts(db_expr_t, int, db_expr_t, char *); 92d6f4c764Smpi void db_show_all_vnodes(db_expr_t, int, db_expr_t, char *); 93d6f4c764Smpi void db_show_all_bufs(db_expr_t, int, db_expr_t, char *); 9450eb7ec0Sbluhm void db_show_all_tdbs(db_expr_t, int, db_expr_t, char *); 95d6f4c764Smpi void db_object_print_cmd(db_expr_t, int, db_expr_t, char *); 96d6f4c764Smpi void db_page_print_cmd(db_expr_t, int, db_expr_t, char *); 97d6f4c764Smpi void db_extent_print_cmd(db_expr_t, int, db_expr_t, char *); 98d6f4c764Smpi void db_pool_print_cmd(db_expr_t, int, db_expr_t, char *); 99d6f4c764Smpi void db_proc_print_cmd(db_expr_t, int, db_expr_t, char *); 100d6f4c764Smpi void db_uvmexp_print_cmd(db_expr_t, int, db_expr_t, char *); 10150eb7ec0Sbluhm void db_tdb_print_cmd(db_expr_t, int, db_expr_t, char *); 102d6f4c764Smpi void db_vnode_print_cmd(db_expr_t, int, db_expr_t, char *); 103d6f4c764Smpi void db_nfsreq_print_cmd(db_expr_t, int, db_expr_t, char *); 104d6f4c764Smpi void db_nfsnode_print_cmd(db_expr_t, int, db_expr_t, char *); 10502de433dSsemarie void db_swap_print_cmd(db_expr_t, int, db_expr_t, char *); 106d6f4c764Smpi void db_help_cmd(db_expr_t, int, db_expr_t, char *); 107d6f4c764Smpi void db_fncall(db_expr_t, int, db_expr_t, char *); 108d6f4c764Smpi void db_boot_sync_cmd(db_expr_t, int, db_expr_t, char *); 109d6f4c764Smpi void db_boot_crash_cmd(db_expr_t, int, db_expr_t, char *); 110d6f4c764Smpi void db_boot_dump_cmd(db_expr_t, int, db_expr_t, char *); 111d6f4c764Smpi void db_boot_halt_cmd(db_expr_t, int, db_expr_t, char *); 112d6f4c764Smpi void db_boot_reboot_cmd(db_expr_t, int, db_expr_t, char *); 113d6f4c764Smpi void db_boot_poweroff_cmd(db_expr_t, int, db_expr_t, char *); 114d6f4c764Smpi void db_stack_trace_cmd(db_expr_t, int, db_expr_t, char *); 115d6f4c764Smpi void db_dmesg_cmd(db_expr_t, int, db_expr_t, char *); 116d6f4c764Smpi void db_show_panic_cmd(db_expr_t, int, db_expr_t, char *); 117d6f4c764Smpi void db_bcstats_print_cmd(db_expr_t, int, db_expr_t, char *); 118266ad235Sdlg void db_ctf_show_struct(db_expr_t, int, db_expr_t, char *); 1198383b4f2Smpi void db_show_regs(db_expr_t, int, db_expr_t, char *); 1208383b4f2Smpi void db_write_cmd(db_expr_t, int, db_expr_t, char *); 121a7c28c92Svisa void db_witness_display(db_expr_t, int, db_expr_t, char *); 122a7c28c92Svisa void db_witness_list(db_expr_t, int, db_expr_t, char *); 123a7c28c92Svisa void db_witness_list_all(db_expr_t, int, db_expr_t, char *); 12444fcfd39Smpi 1257c814357Smpi 126df930be7Sderaadt /* 127df930be7Sderaadt * Utility routine - discard tokens through end-of-line. 128df930be7Sderaadt */ 129df930be7Sderaadt void 1306ecb06d0Sjsg db_skip_to_eol(void) 131df930be7Sderaadt { 132df930be7Sderaadt int t; 133df930be7Sderaadt do { 134df930be7Sderaadt t = db_read_token(); 135df930be7Sderaadt } while (t != tEOL); 136df930be7Sderaadt } 137df930be7Sderaadt 138df930be7Sderaadt /* 139df930be7Sderaadt * Results of command search. 140df930be7Sderaadt */ 141df930be7Sderaadt #define CMD_UNIQUE 0 142df930be7Sderaadt #define CMD_FOUND 1 143df930be7Sderaadt #define CMD_NONE 2 144df930be7Sderaadt #define CMD_AMBIGUOUS 3 145df930be7Sderaadt 146df930be7Sderaadt /* 147df930be7Sderaadt * Search for command prefix. 148df930be7Sderaadt */ 149df930be7Sderaadt int 1503fe80b7fSnaddy db_cmd_search(char *name, const struct db_command *table, 1513fe80b7fSnaddy const struct db_command **cmdp) 152df930be7Sderaadt { 1533fe80b7fSnaddy const struct db_command *cmd; 154df930be7Sderaadt int result = CMD_NONE; 155df930be7Sderaadt 156df930be7Sderaadt for (cmd = table; cmd->name != 0; cmd++) { 1575abbae66Sderaadt char *lp = name, *rp = cmd->name; 1586ecb06d0Sjsg int c; 159df930be7Sderaadt 160df930be7Sderaadt while ((c = *lp) == *rp) { 161df930be7Sderaadt if (c == 0) { 162df930be7Sderaadt /* complete match */ 163df930be7Sderaadt *cmdp = cmd; 164df930be7Sderaadt return (CMD_UNIQUE); 165df930be7Sderaadt } 166df930be7Sderaadt lp++; 167df930be7Sderaadt rp++; 168df930be7Sderaadt } 169df930be7Sderaadt if (c == 0) { 1705abbae66Sderaadt /* end of name, not end of command - partial match */ 171df930be7Sderaadt if (result == CMD_FOUND) { 172df930be7Sderaadt result = CMD_AMBIGUOUS; 173df930be7Sderaadt /* but keep looking for a full match - 174df930be7Sderaadt this lets us match single letters */ 1755abbae66Sderaadt } else { 176df930be7Sderaadt *cmdp = cmd; 177df930be7Sderaadt result = CMD_FOUND; 178df930be7Sderaadt } 179df930be7Sderaadt } 180df930be7Sderaadt } 181df930be7Sderaadt return (result); 182df930be7Sderaadt } 183df930be7Sderaadt 184df930be7Sderaadt void 1853fe80b7fSnaddy db_cmd_list(const struct db_command *table) 186df930be7Sderaadt { 1873fe80b7fSnaddy const struct db_command *cmd; 188df930be7Sderaadt 189df930be7Sderaadt for (cmd = table; cmd->name != 0; cmd++) { 190df930be7Sderaadt db_printf("%-12s", cmd->name); 1919c690e8cSniklas db_end_line(12); 192df930be7Sderaadt } 193df930be7Sderaadt } 194df930be7Sderaadt 195df930be7Sderaadt void 1963fe80b7fSnaddy db_command(const struct db_command **last_cmdp, 1973fe80b7fSnaddy const struct db_command *cmd_table) 198df930be7Sderaadt { 1993fe80b7fSnaddy const struct db_command *cmd; 200df930be7Sderaadt char modif[TOK_STRING_SIZE]; 201df930be7Sderaadt db_expr_t addr, count; 2028383b4f2Smpi int t, result, have_addr = 0; 203df930be7Sderaadt 204df930be7Sderaadt t = db_read_token(); 205df930be7Sderaadt if (t == tEOL) { 206df930be7Sderaadt /* empty line repeats last command, at 'next' */ 207df930be7Sderaadt cmd = *last_cmdp; 208df930be7Sderaadt addr = (db_expr_t)db_next; 2098383b4f2Smpi have_addr = 0; 210df930be7Sderaadt count = 1; 211df930be7Sderaadt modif[0] = '\0'; 2125abbae66Sderaadt } else if (t == tEXCL) { 2133ed44a89Smickey db_fncall(0, 0, 0, NULL); 214df930be7Sderaadt return; 2155abbae66Sderaadt } else if (t != tIDENT) { 216df930be7Sderaadt db_printf("?\n"); 217df930be7Sderaadt db_flush_lex(); 218df930be7Sderaadt return; 2195abbae66Sderaadt } else { 2205abbae66Sderaadt /* Search for command */ 221df930be7Sderaadt while (cmd_table) { 222df930be7Sderaadt result = db_cmd_search(db_tok_string, 2235abbae66Sderaadt cmd_table, &cmd); 224df930be7Sderaadt switch (result) { 225df930be7Sderaadt case CMD_NONE: 226df930be7Sderaadt db_printf("No such command\n"); 227df930be7Sderaadt db_flush_lex(); 228df930be7Sderaadt return; 229df930be7Sderaadt case CMD_AMBIGUOUS: 230df930be7Sderaadt db_printf("Ambiguous\n"); 231df930be7Sderaadt db_flush_lex(); 232df930be7Sderaadt return; 233df930be7Sderaadt default: 234df930be7Sderaadt break; 235df930be7Sderaadt } 236df930be7Sderaadt if ((cmd_table = cmd->more) != 0) { 237df930be7Sderaadt t = db_read_token(); 238df930be7Sderaadt if (t != tIDENT) { 239df930be7Sderaadt db_cmd_list(cmd_table); 240df930be7Sderaadt db_flush_lex(); 241df930be7Sderaadt return; 242df930be7Sderaadt } 243df930be7Sderaadt } 244df930be7Sderaadt } 245df930be7Sderaadt 246df930be7Sderaadt if ((cmd->flag & CS_OWN) == 0) { 247df930be7Sderaadt /* 248df930be7Sderaadt * Standard syntax: 249df930be7Sderaadt * command [/modifier] [addr] [,count] 250df930be7Sderaadt */ 251df930be7Sderaadt t = db_read_token(); 252df930be7Sderaadt if (t == tSLASH) { 253df930be7Sderaadt t = db_read_token(); 254df930be7Sderaadt if (t != tIDENT) { 255df930be7Sderaadt db_printf("Bad modifier\n"); 256df930be7Sderaadt db_flush_lex(); 257df930be7Sderaadt return; 258df930be7Sderaadt } 2598fb5461aSitojun db_strlcpy(modif, db_tok_string, sizeof(modif)); 2605abbae66Sderaadt } else { 261df930be7Sderaadt db_unread_token(t); 262df930be7Sderaadt modif[0] = '\0'; 263df930be7Sderaadt } 264df930be7Sderaadt 265df930be7Sderaadt if (db_expression(&addr)) { 26608f058f8Smpi db_dot = (vaddr_t) addr; 267df930be7Sderaadt db_last_addr = db_dot; 2688383b4f2Smpi have_addr = 1; 2695abbae66Sderaadt } else { 270df930be7Sderaadt addr = (db_expr_t) db_dot; 2718383b4f2Smpi have_addr = 0; 272df930be7Sderaadt } 273df930be7Sderaadt t = db_read_token(); 274df930be7Sderaadt if (t == tCOMMA) { 275df930be7Sderaadt if (!db_expression(&count)) { 276df930be7Sderaadt db_printf("Count missing\n"); 277df930be7Sderaadt db_flush_lex(); 278df930be7Sderaadt return; 279df930be7Sderaadt } 2805abbae66Sderaadt } else { 281df930be7Sderaadt db_unread_token(t); 282df930be7Sderaadt count = -1; 283df930be7Sderaadt } 2845abbae66Sderaadt if ((cmd->flag & CS_MORE) == 0) 285df930be7Sderaadt db_skip_to_eol(); 286df930be7Sderaadt } 287df930be7Sderaadt } 288df930be7Sderaadt *last_cmdp = cmd; 289df930be7Sderaadt if (cmd != 0) { 2905abbae66Sderaadt /* Execute the command. */ 291df930be7Sderaadt (*cmd->fcn)(addr, have_addr, count, modif); 292df930be7Sderaadt 293df930be7Sderaadt if (cmd->flag & CS_SET_DOT) { 294df930be7Sderaadt /* 295df930be7Sderaadt * If command changes dot, set dot to 296df930be7Sderaadt * previous address displayed (if 'ed' style). 297df930be7Sderaadt */ 2985abbae66Sderaadt if (db_ed_style) 299df930be7Sderaadt db_dot = db_prev; 3005abbae66Sderaadt else 301df930be7Sderaadt db_dot = db_next; 302df930be7Sderaadt } 3035abbae66Sderaadt } else { 304df930be7Sderaadt /* 305df930be7Sderaadt * If command does not change dot, 306df930be7Sderaadt * set 'next' location to be the same. 307df930be7Sderaadt */ 308df930be7Sderaadt db_next = db_dot; 309df930be7Sderaadt } 310df930be7Sderaadt } 311df930be7Sderaadt 312df930be7Sderaadt void 31376726696Smickey db_buf_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 31476726696Smickey { 3158383b4f2Smpi int full = 0; 31676726696Smickey 31776726696Smickey if (modif[0] == 'f') 3188383b4f2Smpi full = 1; 31976726696Smickey 320da59dcaeSjasper vfs_buf_print((void *) addr, full, db_printf); 32176726696Smickey } 32276726696Smickey 32376726696Smickey void 3246ecb06d0Sjsg db_map_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 325df930be7Sderaadt { 3268383b4f2Smpi int full = 0; 327df930be7Sderaadt 328df930be7Sderaadt if (modif[0] == 'f') 3298383b4f2Smpi full = 1; 330df930be7Sderaadt 331ab8e80c5Sart uvm_map_printit((struct vm_map *) addr, full, db_printf); 332df930be7Sderaadt } 33376726696Smickey 33413606406Sart void 3356ecb06d0Sjsg db_malloc_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 33613606406Sart { 3374c0aa4c6Smickey malloc_printit(db_printf); 33813606406Sart } 339df930be7Sderaadt 340df930be7Sderaadt void 34176262c1dSclaudio db_mbuf_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 34276262c1dSclaudio { 34364a93525Sbluhm if ((modif[0] == 'c' && modif[1] == 'p') || 34464a93525Sbluhm (modif[0] == 'p' && modif[1] == 'c')) 34564a93525Sbluhm m_print_packet((void *)addr, 1, db_printf); 34664a93525Sbluhm else if (modif[0] == 'c') 34764a93525Sbluhm m_print_chain((void *)addr, 0, db_printf); 34864a93525Sbluhm else if (modif[0] == 'p') 34964a93525Sbluhm m_print_packet((void *)addr, 0, db_printf); 35064a93525Sbluhm else 35176262c1dSclaudio m_print((void *)addr, db_printf); 35276262c1dSclaudio } 35376262c1dSclaudio 35476262c1dSclaudio void 355ce5376a6Sdlg db_socket_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 356ce5376a6Sdlg { 357ce5376a6Sdlg so_print((void *)addr, db_printf); 358ce5376a6Sdlg } 359ce5376a6Sdlg 360ce5376a6Sdlg void 36176726696Smickey db_mount_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 36276726696Smickey { 3638383b4f2Smpi int full = 0; 36476726696Smickey 36576726696Smickey if (modif[0] == 'f') 3668383b4f2Smpi full = 1; 36776726696Smickey 36876726696Smickey vfs_mount_print((struct mount *) addr, full, db_printf); 36976726696Smickey } 37076726696Smickey 371918b11b6Smiod void 372918b11b6Smiod db_show_all_mounts(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 373918b11b6Smiod { 3748383b4f2Smpi int full = 0; 375918b11b6Smiod struct mount *mp; 376918b11b6Smiod 377918b11b6Smiod if (modif[0] == 'f') 3788383b4f2Smpi full = 1; 379918b11b6Smiod 380fc8650a2Sbluhm TAILQ_FOREACH(mp, &mountlist, mnt_list) { 381fc8650a2Sbluhm db_printf("mountpoint %p\n", mp); 382918b11b6Smiod vfs_mount_print(mp, full, db_printf); 383918b11b6Smiod } 384fc8650a2Sbluhm } 385918b11b6Smiod 3864c6830d6Sthib extern struct pool vnode_pool; 3874c6830d6Sthib void 3884c6830d6Sthib db_show_all_vnodes(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 3894c6830d6Sthib { 3908383b4f2Smpi int full = 0; 3914c6830d6Sthib 3924c6830d6Sthib if (modif[0] == 'f') 3938383b4f2Smpi full = 1; 3944c6830d6Sthib 3954c6830d6Sthib pool_walk(&vnode_pool, full, db_printf, vfs_vnode_print); 3964c6830d6Sthib } 3974c6830d6Sthib 398da59dcaeSjasper extern struct pool bufpool; 399da59dcaeSjasper void 400da59dcaeSjasper db_show_all_bufs(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 401da59dcaeSjasper { 4028383b4f2Smpi int full = 0; 403da59dcaeSjasper 404da59dcaeSjasper if (modif[0] == 'f') 4058383b4f2Smpi full = 1; 406da59dcaeSjasper 407da59dcaeSjasper pool_walk(&bufpool, full, db_printf, vfs_buf_print); 408da59dcaeSjasper } 409da59dcaeSjasper 41050eb7ec0Sbluhm #ifdef IPSEC 41150eb7ec0Sbluhm void 41250eb7ec0Sbluhm db_show_all_tdbs(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 41350eb7ec0Sbluhm { 41450eb7ec0Sbluhm int full = 0; 41550eb7ec0Sbluhm 41650eb7ec0Sbluhm if (modif[0] == 'f') 41750eb7ec0Sbluhm full = 1; 41850eb7ec0Sbluhm 41950eb7ec0Sbluhm pool_walk(&tdb_pool, full, db_printf, tdb_printit); 42050eb7ec0Sbluhm } 42150eb7ec0Sbluhm #endif 42250eb7ec0Sbluhm 423d06d27a7Sbluhm void 424d06d27a7Sbluhm db_show_all_routes(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 425d06d27a7Sbluhm { 426d06d27a7Sbluhm u_int rtableid = 0; 427d06d27a7Sbluhm 428d06d27a7Sbluhm if (have_addr) 429d06d27a7Sbluhm rtableid = addr; 430d06d27a7Sbluhm if (count == -1) 431d06d27a7Sbluhm count = 1; 432d06d27a7Sbluhm 433d06d27a7Sbluhm while (count--) { 434d06d27a7Sbluhm if (modif[0] != 'I') 435d06d27a7Sbluhm db_show_rtable(AF_INET, rtableid); 436d06d27a7Sbluhm if (modif[0] != 'i') 437d06d27a7Sbluhm db_show_rtable(AF_INET6, rtableid); 438d06d27a7Sbluhm rtableid++; 439d06d27a7Sbluhm } 440d06d27a7Sbluhm } 441d06d27a7Sbluhm 442d06d27a7Sbluhm void 443d06d27a7Sbluhm db_show_route(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 444d06d27a7Sbluhm { 445d06d27a7Sbluhm db_show_rtentry((void *)addr, NULL, -1); 446d06d27a7Sbluhm } 447d06d27a7Sbluhm 44876726696Smickey void 4496ecb06d0Sjsg db_object_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 450df930be7Sderaadt { 4518383b4f2Smpi int full = 0; 452df930be7Sderaadt 453df930be7Sderaadt if (modif[0] == 'f') 4548383b4f2Smpi full = 1; 455df930be7Sderaadt 456c05d1d79Sart uvm_object_printit((struct uvm_object *) addr, full, db_printf); 457df930be7Sderaadt } 458df930be7Sderaadt 4591c5d553dSweingart void 4606ecb06d0Sjsg db_page_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 461e5efd09cSmiod { 4628383b4f2Smpi int full = 0; 463e5efd09cSmiod 464e5efd09cSmiod if (modif[0] == 'f') 4658383b4f2Smpi full = 1; 466e5efd09cSmiod 467e5efd09cSmiod uvm_page_printit((struct vm_page *) addr, full, db_printf); 468e5efd09cSmiod } 469e5efd09cSmiod 47076726696Smickey void 47176726696Smickey db_vnode_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 47276726696Smickey { 4738383b4f2Smpi int full = 0; 47476726696Smickey 47576726696Smickey if (modif[0] == 'f') 4768383b4f2Smpi full = 1; 47776726696Smickey 4784c6830d6Sthib vfs_vnode_print((void *)addr, full, db_printf); 47976726696Smickey } 48076726696Smickey 481b2d7d8d1Sthib #ifdef NFSCLIENT 482edf172c9Smiod void 483bfe91d83Sthib db_nfsreq_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, 484bfe91d83Sthib char *modif) 485cecbdfb6Sthib { 4868383b4f2Smpi int full = 0; 487cecbdfb6Sthib 488cecbdfb6Sthib if (modif[0] == 'f') 4898383b4f2Smpi full = 1; 490cecbdfb6Sthib 491bfe91d83Sthib nfs_request_print((void *)addr, full, db_printf); 492bfe91d83Sthib } 493bfe91d83Sthib 494bfe91d83Sthib void 495bfe91d83Sthib db_nfsnode_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, 496bfe91d83Sthib char *modif) 497bfe91d83Sthib { 4988383b4f2Smpi int full = 0; 499bfe91d83Sthib 500bfe91d83Sthib if (modif[0] == 'f') 5018383b4f2Smpi full = 1; 502bfe91d83Sthib 503bfe91d83Sthib nfs_node_print((void *)addr, full, db_printf); 504cecbdfb6Sthib } 505b2d7d8d1Sthib #endif 506cecbdfb6Sthib 50702de433dSsemarie void 50802de433dSsemarie db_swap_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, 50902de433dSsemarie char *modif) 51002de433dSsemarie { 51102de433dSsemarie swap_print_all(db_printf); 51202de433dSsemarie } 513cecbdfb6Sthib 514cecbdfb6Sthib void 5156ecb06d0Sjsg db_show_panic_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 516edf172c9Smiod { 5171a4a9ab2Scheloha struct cpu_info *ci; 5181a4a9ab2Scheloha char *prefix; 5191a4a9ab2Scheloha CPU_INFO_ITERATOR cii; 5201a4a9ab2Scheloha int panicked = 0; 5211a4a9ab2Scheloha 5221a4a9ab2Scheloha CPU_INFO_FOREACH(cii, ci) { 5231a4a9ab2Scheloha if (ci->ci_panicbuf[0] != '\0') { 5241a4a9ab2Scheloha prefix = (panicstr == ci->ci_panicbuf) ? "*" : " "; 5251a4a9ab2Scheloha db_printf("%scpu%d: %s\n", 5261a4a9ab2Scheloha prefix, CPU_INFO_UNIT(ci), ci->ci_panicbuf); 5271a4a9ab2Scheloha panicked = 1; 528c1088d88Spirofti } 5291a4a9ab2Scheloha } 5301a4a9ab2Scheloha if (!panicked) 531edf172c9Smiod db_printf("the kernel did not panic\n"); /* yet */ 532edf172c9Smiod } 533edf172c9Smiod 534e5efd09cSmiod void 5356ecb06d0Sjsg db_extent_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 5361c5d553dSweingart { 5371c5d553dSweingart extent_print_all(); 5381c5d553dSweingart } 5391c5d553dSweingart 540e5efd09cSmiod void 5416ecb06d0Sjsg db_pool_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 542e5efd09cSmiod { 543e5efd09cSmiod pool_printit((struct pool *)addr, modif, db_printf); 544e5efd09cSmiod } 545e5efd09cSmiod 546e5efd09cSmiod void 5476ecb06d0Sjsg db_proc_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 548c2a90280Smickey { 549c2a90280Smickey if (!have_addr) 550c2a90280Smickey addr = (db_expr_t)curproc; 551f191aecbSclaudio if (modif[0] == 't') { 552f191aecbSclaudio addr = (db_expr_t)tfind((pid_t)addr); 553f191aecbSclaudio if (addr == 0) { 554f191aecbSclaudio db_printf("not found\n"); 555f191aecbSclaudio return; 556f191aecbSclaudio } 557f191aecbSclaudio } 558c2a90280Smickey 559c2a90280Smickey proc_printit((struct proc *)addr, modif, db_printf); 560c2a90280Smickey } 561c2a90280Smickey 56250eb7ec0Sbluhm #ifdef IPSEC 56350eb7ec0Sbluhm void 56450eb7ec0Sbluhm db_tdb_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 56550eb7ec0Sbluhm { 56650eb7ec0Sbluhm int full = 0; 56750eb7ec0Sbluhm 56850eb7ec0Sbluhm if (modif[0] == 'f') 56950eb7ec0Sbluhm full = 1; 57050eb7ec0Sbluhm 57150eb7ec0Sbluhm tdb_printit((void *)addr, full, db_printf); 57250eb7ec0Sbluhm } 57350eb7ec0Sbluhm #endif 57450eb7ec0Sbluhm 575c2a90280Smickey void 5766ecb06d0Sjsg db_uvmexp_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 577e5efd09cSmiod { 578e5efd09cSmiod uvmexp_print(db_printf); 579e5efd09cSmiod } 580e5efd09cSmiod 5815cd0ab50Sbeck void bcstats_print(int (*)(const char *, ...)); 5825cd0ab50Sbeck 5835cd0ab50Sbeck void 5845cd0ab50Sbeck db_bcstats_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 5855cd0ab50Sbeck { 5865cd0ab50Sbeck bcstats_print(db_printf); 5875cd0ab50Sbeck } 5885cd0ab50Sbeck 589df930be7Sderaadt /* 590df930be7Sderaadt * 'show' commands 591df930be7Sderaadt */ 592df930be7Sderaadt 5933fe80b7fSnaddy const struct db_command db_show_all_cmds[] = { 5943ed44a89Smickey { "procs", db_show_all_procs, 0, NULL }, 5953ed44a89Smickey { "callout", db_show_callout, 0, NULL }, 596329e3480Scheloha { "clockintr", db_show_all_clockintr, 0, NULL }, 5974db979bcSmickey { "pools", db_show_all_pools, 0, NULL }, 598918b11b6Smiod { "mounts", db_show_all_mounts, 0, NULL }, 5990e56ceaeSthib { "vnodes", db_show_all_vnodes, 0, NULL }, 600da59dcaeSjasper { "bufs", db_show_all_bufs, 0, NULL }, 601d06d27a7Sbluhm { "routes", db_show_all_routes, 0, NULL }, 602b2d7d8d1Sthib #ifdef NFSCLIENT 603bfe91d83Sthib { "nfsreqs", db_show_all_nfsreqs, 0, NULL }, 604bfe91d83Sthib { "nfsnodes", db_show_all_nfsnodes, 0, NULL }, 605b2d7d8d1Sthib #endif 60650eb7ec0Sbluhm #ifdef IPSEC 60750eb7ec0Sbluhm { "tdbs", db_show_all_tdbs, 0, NULL }, 60850eb7ec0Sbluhm #endif 609a7c28c92Svisa #ifdef WITNESS 610a7c28c92Svisa { "locks", db_witness_list_all, 0, NULL }, 611a7c28c92Svisa #endif 6123ed44a89Smickey { NULL, NULL, 0, NULL } 613df930be7Sderaadt }; 614df930be7Sderaadt 6153fe80b7fSnaddy const struct db_command db_show_cmds[] = { 6163ed44a89Smickey { "all", NULL, 0, db_show_all_cmds }, 6175cd0ab50Sbeck { "bcstats", db_bcstats_print_cmd, 0, NULL }, 6183ed44a89Smickey { "breaks", db_listbreak_cmd, 0, NULL }, 61976726696Smickey { "buf", db_buf_print_cmd, 0, NULL }, 6201c5d553dSweingart { "extents", db_extent_print_cmd, 0, NULL }, 621a7c28c92Svisa #ifdef WITNESS 622a7c28c92Svisa { "locks", db_witness_list, 0, NULL }, 623a7c28c92Svisa #endif 62413606406Sart { "malloc", db_malloc_print_cmd, 0, NULL }, 625e5efd09cSmiod { "map", db_map_print_cmd, 0, NULL }, 62676262c1dSclaudio { "mbuf", db_mbuf_print_cmd, 0, NULL }, 62776726696Smickey { "mount", db_mount_print_cmd, 0, NULL }, 6288aa1a2c3Smiod #ifdef NFSCLIENT 6298aa1a2c3Smiod { "nfsreq", db_nfsreq_print_cmd, 0, NULL }, 630bfe91d83Sthib { "nfsnode", db_nfsnode_print_cmd, 0, NULL }, 6318aa1a2c3Smiod #endif 632e5efd09cSmiod { "object", db_object_print_cmd, 0, NULL }, 633e5efd09cSmiod { "page", db_page_print_cmd, 0, NULL }, 634edf172c9Smiod { "panic", db_show_panic_cmd, 0, NULL }, 635e5efd09cSmiod { "pool", db_pool_print_cmd, 0, NULL }, 636c2a90280Smickey { "proc", db_proc_print_cmd, 0, NULL }, 637e5efd09cSmiod { "registers", db_show_regs, 0, NULL }, 638d06d27a7Sbluhm { "route", db_show_route, 0, NULL }, 639ce5376a6Sdlg { "socket", db_socket_print_cmd, 0, NULL }, 640266ad235Sdlg { "struct", db_ctf_show_struct, CS_OWN, NULL }, 64102de433dSsemarie { "swap", db_swap_print_cmd, 0, NULL }, 64250eb7ec0Sbluhm #ifdef IPSEC 64350eb7ec0Sbluhm { "tdb", db_tdb_print_cmd, 0, NULL }, 64450eb7ec0Sbluhm #endif 645e5efd09cSmiod { "uvmexp", db_uvmexp_print_cmd, 0, NULL }, 64676726696Smickey { "vnode", db_vnode_print_cmd, 0, NULL }, 647e5efd09cSmiod { "watches", db_listwatch_cmd, 0, NULL }, 648a7c28c92Svisa #ifdef WITNESS 649a7c28c92Svisa { "witness", db_witness_display, 0, NULL }, 650a7c28c92Svisa #endif 651e5efd09cSmiod { NULL, NULL, 0, NULL } 652df930be7Sderaadt }; 653df930be7Sderaadt 6543fe80b7fSnaddy const struct db_command db_boot_cmds[] = { 6553ed44a89Smickey { "sync", db_boot_sync_cmd, 0, 0 }, 6563ed44a89Smickey { "crash", db_boot_crash_cmd, 0, 0 }, 6573ed44a89Smickey { "dump", db_boot_dump_cmd, 0, 0 }, 65860b73751Sart { "halt", db_boot_halt_cmd, 0, 0 }, 659e6ac6979Smiod { "reboot", db_boot_reboot_cmd, 0, 0 }, 660e6ac6979Smiod { "poweroff", db_boot_poweroff_cmd, 0, 0 }, 66160b73751Sart { NULL, } 6623ed44a89Smickey }; 663df930be7Sderaadt 6643fe80b7fSnaddy const struct db_command db_command_table[] = { 665df930be7Sderaadt #ifdef DB_MACHINE_COMMANDS 666df930be7Sderaadt /* this must be the first entry, if it exists */ 667d03db17aSnaddy { "machine", NULL, 0, db_machine_command_table }, 668df930be7Sderaadt #endif 669a00d4ff8Smpi { "kill", db_kill_cmd, 0, NULL }, 6702b6c37f3Suwe { "print", db_print_cmd, 0, NULL }, 6712b6c37f3Suwe { "p", db_print_cmd, 0, NULL }, 6722b6c37f3Suwe { "pprint", db_ctf_pprint_cmd, CS_OWN, NULL }, 6733ed44a89Smickey { "examine", db_examine_cmd, CS_SET_DOT, NULL }, 6743ed44a89Smickey { "x", db_examine_cmd, CS_SET_DOT, NULL }, 6753ed44a89Smickey { "search", db_search_cmd, CS_OWN|CS_SET_DOT, NULL }, 6763ed44a89Smickey { "set", db_set_cmd, CS_OWN, NULL }, 6773ed44a89Smickey { "write", db_write_cmd, CS_MORE|CS_SET_DOT, NULL }, 6783ed44a89Smickey { "w", db_write_cmd, CS_MORE|CS_SET_DOT, NULL }, 6793ed44a89Smickey { "delete", db_delete_cmd, 0, NULL }, 6803ed44a89Smickey { "d", db_delete_cmd, 0, NULL }, 6813ed44a89Smickey { "break", db_breakpoint_cmd, 0, NULL }, 6823ed44a89Smickey { "dwatch", db_deletewatch_cmd, 0, NULL }, 6833ed44a89Smickey { "watch", db_watchpoint_cmd, CS_MORE, NULL }, 6843ed44a89Smickey { "step", db_single_step_cmd, 0, NULL }, 6853ed44a89Smickey { "s", db_single_step_cmd, 0, NULL }, 6863ed44a89Smickey { "continue", db_continue_cmd, 0, NULL }, 6873ed44a89Smickey { "c", db_continue_cmd, 0, NULL }, 6883ed44a89Smickey { "until", db_trace_until_call_cmd,0, NULL }, 6893ed44a89Smickey { "next", db_trace_until_matching_cmd,0, NULL }, 6903ed44a89Smickey { "match", db_trace_until_matching_cmd,0, NULL }, 6913ed44a89Smickey { "trace", db_stack_trace_cmd, 0, NULL }, 6926f5d2abfSmpi { "bt", db_stack_trace_cmd, 0, NULL }, 6933ed44a89Smickey { "call", db_fncall, CS_OWN, NULL }, 6943ed44a89Smickey { "ps", db_show_all_procs, 0, NULL }, 6953ed44a89Smickey { "callout", db_show_callout, 0, NULL }, 696a108f33eSderaadt { "reboot", db_boot_reboot_cmd, 0, NULL }, 6973ed44a89Smickey { "show", NULL, 0, db_show_cmds }, 6983ed44a89Smickey { "boot", NULL, 0, db_boot_cmds }, 69986601978Sderaadt { "help", db_help_cmd, 0, NULL }, 7008b6244cfSmickey { "hangman", db_hangman, 0, NULL }, 70136ac4917Smarkus { "dmesg", db_dmesg_cmd, 0, NULL }, 7023ed44a89Smickey { NULL, NULL, 0, NULL } 703df930be7Sderaadt }; 704df930be7Sderaadt 7053fe80b7fSnaddy const struct db_command *db_last_command = NULL; 706df930be7Sderaadt 707df930be7Sderaadt void 7086ecb06d0Sjsg db_help_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 709df930be7Sderaadt { 71086601978Sderaadt db_cmd_list(db_command_table); 711df930be7Sderaadt } 712df930be7Sderaadt 713df930be7Sderaadt void 7146ecb06d0Sjsg db_command_loop(void) 715df930be7Sderaadt { 7163ed44a89Smickey label_t db_jmpbuf; 7173ed44a89Smickey label_t *savejmp; 718df930be7Sderaadt extern int db_output_line; 719df930be7Sderaadt 720df930be7Sderaadt /* 721df930be7Sderaadt * Initialize 'prev' and 'next' to dot. 722df930be7Sderaadt */ 723df930be7Sderaadt db_prev = db_dot; 724df930be7Sderaadt db_next = db_dot; 725df930be7Sderaadt 726df930be7Sderaadt db_cmd_loop_done = 0; 7273ed44a89Smickey 7283ed44a89Smickey savejmp = db_recover; 7293ed44a89Smickey db_recover = &db_jmpbuf; 7303ed44a89Smickey (void) setjmp(&db_jmpbuf); 731df930be7Sderaadt 732df930be7Sderaadt while (!db_cmd_loop_done) { 733012ea299Sniklas 734df930be7Sderaadt if (db_print_position() != 0) 735df930be7Sderaadt db_printf("\n"); 736df930be7Sderaadt db_output_line = 0; 737df930be7Sderaadt 738012ea299Sniklas #ifdef MULTIPROCESSOR 73968a0a8b0Sart db_printf("ddb{%d}> ", CPU_INFO_UNIT(curcpu())); 740012ea299Sniklas #else 741d00bc718Sderaadt db_printf("ddb> "); 742012ea299Sniklas #endif 743df930be7Sderaadt (void) db_read_line(); 744df930be7Sderaadt 745df930be7Sderaadt db_command(&db_last_command, db_command_table); 746df930be7Sderaadt } 747df930be7Sderaadt 748df930be7Sderaadt db_recover = savejmp; 749df930be7Sderaadt } 750df930be7Sderaadt 751df930be7Sderaadt void 7526ecb06d0Sjsg db_error(char *s) 753df930be7Sderaadt { 754df930be7Sderaadt if (s) 755d74857e0Suwe db_printf("%s", s); 756df930be7Sderaadt db_flush_lex(); 7577c9e91f8Smiod if (db_recover != NULL) 75856285d46Smickey longjmp(db_recover); 759df930be7Sderaadt } 760df930be7Sderaadt 761df930be7Sderaadt 762df930be7Sderaadt /* 763df930be7Sderaadt * Call random function: 764df930be7Sderaadt * !expr(arg,arg,arg) 765df930be7Sderaadt */ 766df930be7Sderaadt void 7676ecb06d0Sjsg db_fncall(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 768df930be7Sderaadt { 769df930be7Sderaadt db_expr_t fn_addr; 770df930be7Sderaadt #define MAXARGS 11 771df930be7Sderaadt db_expr_t args[MAXARGS]; 772df930be7Sderaadt int nargs = 0; 773df930be7Sderaadt db_expr_t retval; 774c4071fd1Smillert db_expr_t (*func)(db_expr_t, ...); 775df930be7Sderaadt int t; 776389584f3Smiod char tmpfmt[28]; 777df930be7Sderaadt 778df930be7Sderaadt if (!db_expression(&fn_addr)) { 779df930be7Sderaadt db_printf("Bad function\n"); 780df930be7Sderaadt db_flush_lex(); 781df930be7Sderaadt return; 782df930be7Sderaadt } 783c4071fd1Smillert func = (db_expr_t (*)(db_expr_t, ...)) fn_addr; 784df930be7Sderaadt 785df930be7Sderaadt t = db_read_token(); 786df930be7Sderaadt if (t == tLPAREN) { 787df930be7Sderaadt if (db_expression(&args[0])) { 788df930be7Sderaadt nargs++; 789df930be7Sderaadt while ((t = db_read_token()) == tCOMMA) { 790df930be7Sderaadt if (nargs == MAXARGS) { 791df930be7Sderaadt db_printf("Too many arguments\n"); 792df930be7Sderaadt db_flush_lex(); 793df930be7Sderaadt return; 794df930be7Sderaadt } 795df930be7Sderaadt if (!db_expression(&args[nargs])) { 796df930be7Sderaadt db_printf("Argument missing\n"); 797df930be7Sderaadt db_flush_lex(); 798df930be7Sderaadt return; 799df930be7Sderaadt } 800df930be7Sderaadt nargs++; 801df930be7Sderaadt } 802df930be7Sderaadt db_unread_token(t); 803df930be7Sderaadt } 804df930be7Sderaadt if (db_read_token() != tRPAREN) { 805df930be7Sderaadt db_printf("?\n"); 806df930be7Sderaadt db_flush_lex(); 807df930be7Sderaadt return; 808df930be7Sderaadt } 809df930be7Sderaadt } 810df930be7Sderaadt db_skip_to_eol(); 811df930be7Sderaadt 8125abbae66Sderaadt while (nargs < MAXARGS) 813df930be7Sderaadt args[nargs++] = 0; 814df930be7Sderaadt 815df930be7Sderaadt retval = (*func)(args[0], args[1], args[2], args[3], args[4], 816df930be7Sderaadt args[5], args[6], args[7], args[8], args[9]); 8175a1ce8adSmiod db_printf("%s\n", db_format(tmpfmt, sizeof tmpfmt, retval, 8185a1ce8adSmiod DB_FORMAT_N, 1, 0)); 819df930be7Sderaadt } 8203ed44a89Smickey 8213ed44a89Smickey void 8227efda1a1Sderaadt db_reboot(int howto) 8237efda1a1Sderaadt { 8247efda1a1Sderaadt spl0(); 8257efda1a1Sderaadt if (!curproc) 8267efda1a1Sderaadt curproc = &proc0; 8277efda1a1Sderaadt reboot(howto); 8287efda1a1Sderaadt } 8297efda1a1Sderaadt 8307efda1a1Sderaadt void 8316ecb06d0Sjsg db_boot_sync_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 8323ed44a89Smickey { 8337efda1a1Sderaadt db_reboot(RB_AUTOBOOT | RB_TIMEBAD | RB_USERREQ); 8343ed44a89Smickey } 8353ed44a89Smickey 8363ed44a89Smickey void 8376ecb06d0Sjsg db_boot_crash_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 8383ed44a89Smickey { 8397efda1a1Sderaadt db_reboot(RB_NOSYNC | RB_DUMP | RB_TIMEBAD | RB_USERREQ); 8403ed44a89Smickey } 8413ed44a89Smickey 8423ed44a89Smickey void 8436ecb06d0Sjsg db_boot_dump_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 8443ed44a89Smickey { 8457efda1a1Sderaadt db_reboot(RB_DUMP | RB_TIMEBAD | RB_USERREQ); 8463ed44a89Smickey } 84760b73751Sart 84860b73751Sart void 8496ecb06d0Sjsg db_boot_halt_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 85060b73751Sart { 8517efda1a1Sderaadt db_reboot(RB_NOSYNC | RB_HALT | RB_TIMEBAD | RB_USERREQ); 85260b73751Sart } 853e6ac6979Smiod 854e6ac6979Smiod void 8556ecb06d0Sjsg db_boot_reboot_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 856e6ac6979Smiod { 8573c291078Stedu boot(RB_RESET | RB_AUTOBOOT | RB_NOSYNC | RB_TIMEBAD | RB_USERREQ); 858e6ac6979Smiod } 859e6ac6979Smiod 860e6ac6979Smiod void 8616ecb06d0Sjsg db_boot_poweroff_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 862e6ac6979Smiod { 8637efda1a1Sderaadt db_reboot(RB_NOSYNC | RB_HALT | RB_POWERDOWN | RB_TIMEBAD | RB_USERREQ); 864e6ac6979Smiod } 865332a70d3Sart 866332a70d3Sart void 8676ecb06d0Sjsg db_dmesg_cmd(db_expr_t addr, int haddr, db_expr_t count, char *modif) 86836ac4917Smarkus { 86936ac4917Smarkus int i, off; 87036ac4917Smarkus char *p; 87136ac4917Smarkus 87236ac4917Smarkus if (!msgbufp || msgbufp->msg_magic != MSG_MAGIC) 87336ac4917Smarkus return; 87436ac4917Smarkus off = msgbufp->msg_bufx; 87536ac4917Smarkus if (off > msgbufp->msg_bufs) 87636ac4917Smarkus off = 0; 87736ac4917Smarkus for (i = 0, p = msgbufp->msg_bufc + off; 87836ac4917Smarkus i < msgbufp->msg_bufs; i++, p++) { 879a06b5d53Smiod if (p >= msgbufp->msg_bufc + msgbufp->msg_bufs) 88036ac4917Smarkus p = msgbufp->msg_bufc; 88114b2c62cSaaron if (*p != '\0') 88236ac4917Smarkus db_putchar(*p); 88336ac4917Smarkus } 88436ac4917Smarkus db_putchar('\n'); 88536ac4917Smarkus } 88636ac4917Smarkus 88736ac4917Smarkus void 8888383b4f2Smpi db_stack_trace_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 889332a70d3Sart { 890332a70d3Sart db_stack_trace_print(addr, have_addr, count, modif, db_printf); 891332a70d3Sart } 8927c814357Smpi 8937c814357Smpi void 8947c814357Smpi db_show_regs(db_expr_t addr, int have_addr, db_expr_t count, char *modif) 8957c814357Smpi { 8967c814357Smpi struct db_variable *regp; 8977c814357Smpi db_expr_t value, offset; 898*949c1c4eSmiod const char * name; 8997c814357Smpi char tmpfmt[28]; 9007c814357Smpi 9017c814357Smpi for (regp = db_regs; regp < db_eregs; regp++) { 9027c814357Smpi db_read_variable(regp, &value); 9035abbae66Sderaadt db_printf("%-12s%s", regp->name, 9045abbae66Sderaadt db_format(tmpfmt, sizeof tmpfmt, 9057c814357Smpi (long)value, DB_FORMAT_N, 1, sizeof(long) * 3)); 90608f058f8Smpi db_find_xtrn_sym_and_offset((vaddr_t)value, &name, &offset); 9077c814357Smpi if (name != 0 && offset <= db_maxoff && offset != value) { 9087c814357Smpi db_printf("\t%s", name); 9097c814357Smpi if (offset != 0) 9105abbae66Sderaadt db_printf("+%s", 9115abbae66Sderaadt db_format(tmpfmt, sizeof tmpfmt, 9127c814357Smpi (long)offset, DB_FORMAT_R, 1, 0)); 9137c814357Smpi } 9147c814357Smpi db_printf("\n"); 9157c814357Smpi } 9167c814357Smpi db_print_loc_and_inst(PC_REGS(&ddb_regs)); 9177c814357Smpi } 91844fcfd39Smpi 91944fcfd39Smpi /* 92044fcfd39Smpi * Write to file. 92144fcfd39Smpi */ 92244fcfd39Smpi void 9238383b4f2Smpi db_write_cmd(db_expr_t address, int have_addr, db_expr_t count, char *modif) 92444fcfd39Smpi { 92508f058f8Smpi vaddr_t addr; 92644fcfd39Smpi db_expr_t old_value; 92744fcfd39Smpi db_expr_t new_value; 9288383b4f2Smpi int size, wrote_one = 0; 92944fcfd39Smpi char tmpfmt[28]; 93044fcfd39Smpi 93108f058f8Smpi addr = (vaddr_t) address; 93244fcfd39Smpi 93344fcfd39Smpi switch (modif[0]) { 93444fcfd39Smpi case 'b': 93544fcfd39Smpi size = 1; 93644fcfd39Smpi break; 93744fcfd39Smpi case 'h': 93844fcfd39Smpi size = 2; 93944fcfd39Smpi break; 94044fcfd39Smpi case 'l': 94144fcfd39Smpi case '\0': 94244fcfd39Smpi size = 4; 94344fcfd39Smpi break; 94444fcfd39Smpi #ifdef __LP64__ 94544fcfd39Smpi case 'q': 94644fcfd39Smpi size = 8; 94744fcfd39Smpi break; 94844fcfd39Smpi #endif 94944fcfd39Smpi default: 95044fcfd39Smpi size = -1; 95144fcfd39Smpi db_error("Unknown size\n"); 95244fcfd39Smpi /*NOTREACHED*/ 95344fcfd39Smpi } 95444fcfd39Smpi 95544fcfd39Smpi while (db_expression(&new_value)) { 9568383b4f2Smpi old_value = db_get_value(addr, size, 0); 95744fcfd39Smpi db_printsym(addr, DB_STGY_ANY, db_printf); 95844fcfd39Smpi db_printf("\t\t%s\t", db_format(tmpfmt, sizeof tmpfmt, 95944fcfd39Smpi old_value, DB_FORMAT_N, 0, 8)); 96044fcfd39Smpi db_printf("=\t%s\n", db_format(tmpfmt, sizeof tmpfmt, 96144fcfd39Smpi new_value, DB_FORMAT_N, 0, 8)); 96244fcfd39Smpi db_put_value(addr, size, new_value); 96344fcfd39Smpi addr += size; 96444fcfd39Smpi 9658383b4f2Smpi wrote_one = 1; 96644fcfd39Smpi } 96744fcfd39Smpi 96844fcfd39Smpi if (!wrote_one) { 96944fcfd39Smpi db_error("Nothing written.\n"); 97044fcfd39Smpi /*NOTREACHED*/ 97144fcfd39Smpi } 97244fcfd39Smpi 97344fcfd39Smpi db_next = addr; 97444fcfd39Smpi db_prev = addr - size; 97544fcfd39Smpi 97644fcfd39Smpi db_skip_to_eol(); 97744fcfd39Smpi } 978