1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 1993, Garrett A. Wollman. 5 * Copyright (c) 1993, University of Vermont and State Agricultural College. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * $FreeBSD$ 33 */ 34 35 /* 36 * Necessary declarations for the `ddb' kernel debugger. 37 */ 38 39 #ifndef _DDB_DDB_H_ 40 #define _DDB_DDB_H_ 41 42 #ifdef SYSCTL_DECL 43 SYSCTL_DECL(_debug_ddb); 44 #endif 45 46 #include <machine/db_machdep.h> /* type definitions */ 47 48 #include <sys/queue.h> /* LIST_* */ 49 #include <sys/kernel.h> /* SYSINIT */ 50 51 #ifndef DB_MAXARGS 52 #define DB_MAXARGS 10 53 #endif 54 55 #ifndef DB_MAXLINE 56 #define DB_MAXLINE 120 57 #endif 58 59 #ifndef DB_MAXSCRIPTS 60 #define DB_MAXSCRIPTS 8 61 #endif 62 63 #ifndef DB_MAXSCRIPTNAME 64 #define DB_MAXSCRIPTNAME 32 65 #endif 66 67 #ifndef DB_MAXSCRIPTLEN 68 #define DB_MAXSCRIPTLEN 128 69 #endif 70 71 #ifndef DB_MAXSCRIPTRECURSION 72 #define DB_MAXSCRIPTRECURSION 3 73 #endif 74 75 #ifndef DB_STOFFS 76 #define DB_STOFFS(offs) (offs) 77 #endif 78 79 #ifndef DB_CALL 80 #define DB_CALL db_fncall_generic 81 #else 82 int DB_CALL(db_expr_t, db_expr_t *, int, db_expr_t[]); 83 #endif 84 85 /* 86 * Extern variables to set the address and size of the symtab and strtab. 87 * Most users should use db_fetch_symtab in order to set them from the 88 * boot loader provided values. 89 */ 90 extern vm_offset_t ksymtab, kstrtab, ksymtab_size; 91 92 /* 93 * There are three "command tables": 94 * - One for simple commands; a list of these is displayed 95 * by typing 'help' at the debugger prompt. 96 * - One for sub-commands of 'show'; to see this type 'show' 97 * without any arguments. 98 * - The last one for sub-commands of 'show all'; type 'show all' 99 * without any argument to get a list. 100 */ 101 struct command; 102 LIST_HEAD(command_table, command); 103 extern struct command_table db_cmd_table; 104 extern struct command_table db_show_table; 105 extern struct command_table db_show_all_table; 106 107 /* 108 * Type signature for a function implementing a ddb command. 109 */ 110 typedef void db_cmdfcn_t(db_expr_t addr, bool have_addr, db_expr_t count, 111 char *modif); 112 113 /* 114 * Command table entry. 115 */ 116 struct command { 117 char * name; /* command name */ 118 db_cmdfcn_t *fcn; /* function to call */ 119 int flag; /* extra info: */ 120 #define CS_OWN 0x1 /* non-standard syntax */ 121 #define CS_MORE 0x2 /* standard syntax, but may have other words 122 * at end */ 123 #define CS_SET_DOT 0x100 /* set dot after command */ 124 struct command_table *more; /* another level of command */ 125 LIST_ENTRY(command) next; /* next entry in the command table */ 126 }; 127 128 /* 129 * Arrange for the specified ddb command to be defined and 130 * bound to the specified function. Commands can be defined 131 * in modules in which case they will be available only when 132 * the module is loaded. 133 */ 134 #define _DB_SET(_suffix, _name, _func, list, _flag, _more) \ 135 static struct command __CONCAT(_name,_suffix) = { \ 136 .name = __STRING(_name), \ 137 .fcn = _func, \ 138 .flag = _flag, \ 139 .more = _more \ 140 }; \ 141 static void __CONCAT(__CONCAT(_name,_suffix),_add)(void *arg __unused) \ 142 { db_command_register(&list, &__CONCAT(_name,_suffix)); } \ 143 SYSINIT(__CONCAT(_name,_suffix), SI_SUB_KLD, SI_ORDER_ANY, \ 144 __CONCAT(__CONCAT(_name,_suffix),_add), NULL); \ 145 static void __CONCAT(__CONCAT(_name,_suffix),_del)(void *arg __unused) \ 146 { db_command_unregister(&list, &__CONCAT(_name,_suffix)); } \ 147 SYSUNINIT(__CONCAT(_name,_suffix), SI_SUB_KLD, SI_ORDER_ANY, \ 148 __CONCAT(__CONCAT(_name,_suffix),_del), NULL); 149 150 /* 151 * Like _DB_SET but also create the function declaration which 152 * must be followed immediately by the body; e.g. 153 * _DB_FUNC(_cmd, panic, db_panic, db_cmd_table, 0, NULL) 154 * { 155 * ...panic implementation... 156 * } 157 * 158 * This macro is mostly used to define commands placed in one of 159 * the ddb command tables; see DB_COMMAND, etc. below. 160 */ 161 #define _DB_FUNC(_suffix, _name, _func, list, _flag, _more) \ 162 static db_cmdfcn_t _func; \ 163 _DB_SET(_suffix, _name, _func, list, _flag, _more); \ 164 static void \ 165 _func(db_expr_t addr, bool have_addr, db_expr_t count, char *modif) 166 167 /* common idom provided for backwards compatibility */ 168 #define DB_FUNC(_name, _func, list, _flag, _more) \ 169 _DB_FUNC(_cmd, _name, _func, list, _flag, _more) 170 171 #define DB_COMMAND(cmd_name, func_name) \ 172 _DB_FUNC(_cmd, cmd_name, func_name, db_cmd_table, 0, NULL) 173 #define DB_ALIAS(alias_name, func_name) \ 174 _DB_SET(_cmd, alias_name, func_name, db_cmd_table, 0, NULL) 175 #define DB_SHOW_COMMAND(cmd_name, func_name) \ 176 _DB_FUNC(_show, cmd_name, func_name, db_show_table, 0, NULL) 177 #define DB_SHOW_ALIAS(alias_name, func_name) \ 178 _DB_SET(_show, alias_name, func_name, db_show_table, 0, NULL) 179 #define DB_SHOW_ALL_COMMAND(cmd_name, func_name) \ 180 _DB_FUNC(_show_all, cmd_name, func_name, db_show_all_table, 0, NULL) 181 #define DB_SHOW_ALL_ALIAS(alias_name, func_name) \ 182 _DB_SET(_show_all, alias_name, func_name, db_show_all_table, 0, NULL) 183 184 extern db_expr_t db_maxoff; 185 extern int db_indent; 186 extern int db_inst_count; 187 extern int db_load_count; 188 extern int db_store_count; 189 extern volatile int db_pager_quit; 190 extern db_expr_t db_radix; 191 extern db_expr_t db_max_width; 192 extern db_expr_t db_tab_stop_width; 193 extern db_expr_t db_lines_per_page; 194 195 struct thread; 196 struct vm_map; 197 198 void db_check_interrupt(void); 199 void db_clear_watchpoints(void); 200 db_addr_t db_disasm(db_addr_t loc, bool altfmt); 201 /* instruction disassembler */ 202 void db_error(const char *s); 203 int db_expression(db_expr_t *valuep); 204 int db_get_variable(db_expr_t *valuep); 205 void db_iprintf(const char *,...) __printflike(1, 2); 206 struct proc *db_lookup_proc(db_expr_t addr); 207 struct thread *db_lookup_thread(db_expr_t addr, bool check_pid); 208 struct vm_map *db_map_addr(vm_offset_t); 209 bool db_map_current(struct vm_map *); 210 bool db_map_equal(struct vm_map *, struct vm_map *); 211 int db_md_set_watchpoint(db_expr_t addr, db_expr_t size); 212 int db_md_clr_watchpoint(db_expr_t addr, db_expr_t size); 213 void db_md_list_watchpoints(void); 214 void db_print_loc_and_inst(db_addr_t loc); 215 void db_print_thread(void); 216 int db_printf(const char *fmt, ...) __printflike(1, 2); 217 int db_read_bytes(vm_offset_t addr, size_t size, char *data); 218 /* machine-dependent */ 219 int db_readline(char *lstart, int lsize); 220 void db_restart_at_pc(bool watchpt); 221 int db_set_variable(db_expr_t value); 222 void db_set_watchpoints(void); 223 void db_skip_to_eol(void); 224 bool db_stop_at_pc(int type, int code, bool *is_breakpoint, 225 bool *is_watchpoint); 226 #define db_strcpy strcpy 227 void db_trace_self(void); 228 int db_trace_thread(struct thread *, int); 229 bool db_value_of_name(const char *name, db_expr_t *valuep); 230 bool db_value_of_name_pcpu(const char *name, db_expr_t *valuep); 231 bool db_value_of_name_vnet(const char *name, db_expr_t *valuep); 232 int db_write_bytes(vm_offset_t addr, size_t size, char *data); 233 void db_command_register(struct command_table *, struct command *); 234 void db_command_unregister(struct command_table *, struct command *); 235 int db_fetch_ksymtab(vm_offset_t ksym_start, vm_offset_t ksym_end); 236 237 db_cmdfcn_t db_breakpoint_cmd; 238 db_cmdfcn_t db_capture_cmd; 239 db_cmdfcn_t db_continue_cmd; 240 db_cmdfcn_t db_delete_cmd; 241 db_cmdfcn_t db_deletehwatch_cmd; 242 db_cmdfcn_t db_deletewatch_cmd; 243 db_cmdfcn_t db_examine_cmd; 244 db_cmdfcn_t db_findstack_cmd; 245 db_cmdfcn_t db_hwatchpoint_cmd; 246 db_cmdfcn_t db_listbreak_cmd; 247 db_cmdfcn_t db_scripts_cmd; 248 db_cmdfcn_t db_print_cmd; 249 db_cmdfcn_t db_ps; 250 db_cmdfcn_t db_run_cmd; 251 db_cmdfcn_t db_script_cmd; 252 db_cmdfcn_t db_search_cmd; 253 db_cmdfcn_t db_set_cmd; 254 db_cmdfcn_t db_set_thread; 255 db_cmdfcn_t db_show_regs; 256 db_cmdfcn_t db_show_threads; 257 db_cmdfcn_t db_single_step_cmd; 258 db_cmdfcn_t db_textdump_cmd; 259 db_cmdfcn_t db_trace_until_call_cmd; 260 db_cmdfcn_t db_trace_until_matching_cmd; 261 db_cmdfcn_t db_unscript_cmd; 262 db_cmdfcn_t db_watchpoint_cmd; 263 db_cmdfcn_t db_write_cmd; 264 265 /* 266 * Interface between DDB and the DDB output capture facility. 267 */ 268 struct dumperinfo; 269 void db_capture_dump(struct dumperinfo *di); 270 void db_capture_enterpager(void); 271 void db_capture_exitpager(void); 272 void db_capture_write(char *buffer, u_int buflen); 273 void db_capture_writech(char ch); 274 275 /* 276 * Interface between DDB and the script facility. 277 */ 278 void db_script_kdbenter(const char *eventname); /* KDB enter event. */ 279 280 /* 281 * Interface between DDB and the textdump facility. 282 * 283 * Text dump blocks are of a fixed size; textdump_block_buffer is a 284 * statically allocated buffer that code interacting with textdumps can use 285 * to prepare and hold a pending block in when calling writenextblock(). 286 */ 287 #define TEXTDUMP_BLOCKSIZE 512 288 extern char textdump_block_buffer[TEXTDUMP_BLOCKSIZE]; 289 290 void textdump_mkustar(char *block_buffer, const char *filename, 291 u_int size); 292 void textdump_restoreoff(off_t offset); 293 void textdump_saveoff(off_t *offsetp); 294 int textdump_writenextblock(struct dumperinfo *di, char *buffer); 295 296 /* 297 * Interface between the kernel and textdumps. 298 */ 299 extern int textdump_pending; /* Call textdump_dumpsys() instead. */ 300 void textdump_dumpsys(struct dumperinfo *di); 301 302 #endif /* !_DDB_DDB_H_ */ 303