1381fe1aaSGarrett Wollman /*- 251369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 351369649SPedro F. Giffuni * 4381fe1aaSGarrett Wollman * Copyright (c) 1993, Garrett A. Wollman. 5381fe1aaSGarrett Wollman * Copyright (c) 1993, University of Vermont and State Agricultural College. 6381fe1aaSGarrett Wollman * All rights reserved. 7381fe1aaSGarrett Wollman * 8381fe1aaSGarrett Wollman * Redistribution and use in source and binary forms, with or without 9381fe1aaSGarrett Wollman * modification, are permitted provided that the following conditions 10381fe1aaSGarrett Wollman * are met: 11381fe1aaSGarrett Wollman * 1. Redistributions of source code must retain the above copyright 12381fe1aaSGarrett Wollman * notice, this list of conditions and the following disclaimer. 13381fe1aaSGarrett Wollman * 2. Redistributions in binary form must reproduce the above copyright 14381fe1aaSGarrett Wollman * notice, this list of conditions and the following disclaimer in the 15381fe1aaSGarrett Wollman * documentation and/or other materials provided with the distribution. 16381fe1aaSGarrett Wollman * 3. Neither the name of the University nor the names of its contributors 17381fe1aaSGarrett Wollman * may be used to endorse or promote products derived from this software 18381fe1aaSGarrett Wollman * without specific prior written permission. 19381fe1aaSGarrett Wollman * 20381fe1aaSGarrett Wollman * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21381fe1aaSGarrett Wollman * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22381fe1aaSGarrett Wollman * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23381fe1aaSGarrett Wollman * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24381fe1aaSGarrett Wollman * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25381fe1aaSGarrett Wollman * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26381fe1aaSGarrett Wollman * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27381fe1aaSGarrett Wollman * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28381fe1aaSGarrett Wollman * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29381fe1aaSGarrett Wollman * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30381fe1aaSGarrett Wollman * SUCH DAMAGE. 31381fe1aaSGarrett Wollman */ 32381fe1aaSGarrett Wollman 33381fe1aaSGarrett Wollman /* 34381fe1aaSGarrett Wollman * Necessary declarations for the `ddb' kernel debugger. 35381fe1aaSGarrett Wollman */ 36381fe1aaSGarrett Wollman 374753168fSBruce Evans #ifndef _DDB_DDB_H_ 384753168fSBruce Evans #define _DDB_DDB_H_ 39381fe1aaSGarrett Wollman 40086fec57SRobert Watson #ifdef SYSCTL_DECL 41086fec57SRobert Watson SYSCTL_DECL(_debug_ddb); 42086fec57SRobert Watson #endif 43086fec57SRobert Watson 4426f9a767SRodney W. Grimes #include <machine/db_machdep.h> /* type definitions */ 45381fe1aaSGarrett Wollman 4639297ba4SSam Leffler #include <sys/queue.h> /* LIST_* */ 4739297ba4SSam Leffler #include <sys/kernel.h> /* SYSINIT */ 4839297ba4SSam Leffler 49a2aeb24eSMarcel Moolenaar #ifndef DB_MAXARGS 50a2aeb24eSMarcel Moolenaar #define DB_MAXARGS 10 51a2aeb24eSMarcel Moolenaar #endif 52a2aeb24eSMarcel Moolenaar 53c9b0cc3bSRobert Watson #ifndef DB_MAXLINE 54c9b0cc3bSRobert Watson #define DB_MAXLINE 120 55c9b0cc3bSRobert Watson #endif 56c9b0cc3bSRobert Watson 57c9b0cc3bSRobert Watson #ifndef DB_MAXSCRIPTS 58c9b0cc3bSRobert Watson #define DB_MAXSCRIPTS 8 59c9b0cc3bSRobert Watson #endif 60c9b0cc3bSRobert Watson 61c9b0cc3bSRobert Watson #ifndef DB_MAXSCRIPTNAME 62c9b0cc3bSRobert Watson #define DB_MAXSCRIPTNAME 32 63c9b0cc3bSRobert Watson #endif 64c9b0cc3bSRobert Watson 65c9b0cc3bSRobert Watson #ifndef DB_MAXSCRIPTLEN 66c9b0cc3bSRobert Watson #define DB_MAXSCRIPTLEN 128 67c9b0cc3bSRobert Watson #endif 68c9b0cc3bSRobert Watson 69c9b0cc3bSRobert Watson #ifndef DB_MAXSCRIPTRECURSION 70c9b0cc3bSRobert Watson #define DB_MAXSCRIPTRECURSION 3 71c9b0cc3bSRobert Watson #endif 72c9b0cc3bSRobert Watson 73a2aeb24eSMarcel Moolenaar #ifndef DB_CALL 74a2aeb24eSMarcel Moolenaar #define DB_CALL db_fncall_generic 75a2aeb24eSMarcel Moolenaar #else 76a2aeb24eSMarcel Moolenaar int DB_CALL(db_expr_t, db_expr_t *, int, db_expr_t[]); 77a2aeb24eSMarcel Moolenaar #endif 78a2aeb24eSMarcel Moolenaar 7939297ba4SSam Leffler /* 80c98a2727SRoger Pau Monné * Extern variables to set the address and size of the symtab and strtab. 81c98a2727SRoger Pau Monné * Most users should use db_fetch_symtab in order to set them from the 82c98a2727SRoger Pau Monné * boot loader provided values. 83c98a2727SRoger Pau Monné */ 8440b664f6SBrandon Bergren extern vm_offset_t ksymtab, kstrtab, ksymtab_size, ksymtab_relbase; 85c98a2727SRoger Pau Monné 86884eaacdSJohn Baldwin /* Command tables contain a list of commands. */ 874ef7db5aSMitchell Horne struct db_command; 884ef7db5aSMitchell Horne LIST_HEAD(db_command_table, db_command); 89884eaacdSJohn Baldwin 90884eaacdSJohn Baldwin #define _DB_TABLE_NAME(table) db_##table##_table 91884eaacdSJohn Baldwin 92884eaacdSJohn Baldwin #define DB_DEFINE_TABLE(parent, name, table) \ 93884eaacdSJohn Baldwin struct db_command_table _DB_TABLE_NAME(table) = \ 94884eaacdSJohn Baldwin LIST_HEAD_INITIALIZER(_DB_TABLE_NAME(table)); \ 95884eaacdSJohn Baldwin _DB_SET(parent, name, NULL, 0, &_DB_TABLE_NAME(table)) 96884eaacdSJohn Baldwin 97884eaacdSJohn Baldwin #define DB_DECLARE_TABLE(table) \ 98884eaacdSJohn Baldwin extern struct db_command_table _DB_TABLE_NAME(table) 99884eaacdSJohn Baldwin 100884eaacdSJohn Baldwin /* 101884eaacdSJohn Baldwin * Builtin command tables: 102884eaacdSJohn Baldwin * - cmd: Top-level command table; a list of these is displayed 103884eaacdSJohn Baldwin * by typing 'help' at the debugger prompt. 104884eaacdSJohn Baldwin * - show: Sub-commands of 'show' 105884eaacdSJohn Baldwin * - show_all: Sub-commands of 'show all' 106884eaacdSJohn Baldwin * - show_active: Sub-commands of 'show active' 107884eaacdSJohn Baldwin */ 108884eaacdSJohn Baldwin DB_DECLARE_TABLE(cmd); 109884eaacdSJohn Baldwin DB_DECLARE_TABLE(show); 110884eaacdSJohn Baldwin DB_DECLARE_TABLE(show_all); 111884eaacdSJohn Baldwin DB_DECLARE_TABLE(show_active); 11239297ba4SSam Leffler 11339297ba4SSam Leffler /* 11439297ba4SSam Leffler * Type signature for a function implementing a ddb command. 11539297ba4SSam Leffler */ 116cd508278SPedro F. Giffuni typedef void db_cmdfcn_t(db_expr_t addr, bool have_addr, db_expr_t count, 117763df836SBruce Evans char *modif); 1184753168fSBruce Evans 11939297ba4SSam Leffler /* 12039297ba4SSam Leffler * Command table entry. 12139297ba4SSam Leffler */ 1224ef7db5aSMitchell Horne struct db_command { 12339297ba4SSam Leffler char *name; /* command name */ 12439297ba4SSam Leffler db_cmdfcn_t *fcn; /* function to call */ 125bb61cba7SMitchell Horne int flag; 12639297ba4SSam Leffler #define CS_OWN 0x1 /* non-standard syntax */ 12739297ba4SSam Leffler #define CS_MORE 0x2 /* standard syntax, but may have other words 12839297ba4SSam Leffler * at end */ 12939297ba4SSam Leffler #define CS_SET_DOT 0x100 /* set dot after command */ 130bb61cba7SMitchell Horne #define DB_CMD_MEMSAFE 0x1000 /* Command does not allow reads or writes to 131bb61cba7SMitchell Horne * arbitrary memory. */ 1322449b9e5SMitchell Horne #define DB_MAC1 0x10000 /* For MAC policy use */ 1332449b9e5SMitchell Horne #define DB_MAC2 0x20000 1344ef7db5aSMitchell Horne struct db_command_table *more; /* another level of command */ 1354ef7db5aSMitchell Horne LIST_ENTRY(db_command) next; /* next entry in the command table */ 1362449b9e5SMitchell Horne void *mac_priv; /* For MAC policy use */ 13739297ba4SSam Leffler }; 1386337f4efSBruce Evans 13939297ba4SSam Leffler /* 14039297ba4SSam Leffler * Arrange for the specified ddb command to be defined and 14139297ba4SSam Leffler * bound to the specified function. Commands can be defined 14239297ba4SSam Leffler * in modules in which case they will be available only when 14339297ba4SSam Leffler * the module is loaded. 14439297ba4SSam Leffler */ 145884eaacdSJohn Baldwin #define _DB_SET(_table, _name, _func, _flag, _more) \ 146884eaacdSJohn Baldwin static struct db_command db_##_table##_##_name##_cmd = { \ 14739297ba4SSam Leffler .name = __STRING(_name), \ 14839297ba4SSam Leffler .fcn = _func, \ 14939297ba4SSam Leffler .flag = _flag, \ 15039297ba4SSam Leffler .more = _more \ 1516337f4efSBruce Evans }; \ 152884eaacdSJohn Baldwin \ 153884eaacdSJohn Baldwin static void \ 154884eaacdSJohn Baldwin db##_table##_##_name##_add(void *arg __unused) \ 155884eaacdSJohn Baldwin { \ 156884eaacdSJohn Baldwin db_command_register(&_DB_TABLE_NAME(_table), \ 157884eaacdSJohn Baldwin &db_##_table##_##_name##_cmd); \ 158884eaacdSJohn Baldwin } \ 159884eaacdSJohn Baldwin SYSINIT(db_##_table##_##_name, SI_SUB_KLD, SI_ORDER_ANY, \ 160884eaacdSJohn Baldwin db##_table##_##_name##_add, NULL); \ 161884eaacdSJohn Baldwin \ 162884eaacdSJohn Baldwin static void \ 163884eaacdSJohn Baldwin db##_table##_##_name##_del(void *arg __unused) \ 164884eaacdSJohn Baldwin { \ 165884eaacdSJohn Baldwin db_command_unregister(&_DB_TABLE_NAME(_table), \ 166884eaacdSJohn Baldwin &db_##_table##_##_name##_cmd); \ 167884eaacdSJohn Baldwin } \ 168884eaacdSJohn Baldwin SYSUNINIT(db_##_table##_##_name, SI_SUB_KLD, SI_ORDER_ANY, \ 169884eaacdSJohn Baldwin db##_table##_##_name##_del, NULL) 170e1e31c0eSJohn Baldwin 17139297ba4SSam Leffler /* 17239297ba4SSam Leffler * Like _DB_SET but also create the function declaration which 17339297ba4SSam Leffler * must be followed immediately by the body; e.g. 174884eaacdSJohn Baldwin * DB_TABLE_COMMAND_FLAGS(_cmd, panic, db_panic, 0) 17539297ba4SSam Leffler * { 17639297ba4SSam Leffler * ...panic implementation... 17739297ba4SSam Leffler * } 17839297ba4SSam Leffler * 17939297ba4SSam Leffler * This macro is mostly used to define commands placed in one of 18039297ba4SSam Leffler * the ddb command tables; see DB_COMMAND, etc. below. 18139297ba4SSam Leffler */ 182884eaacdSJohn Baldwin #define DB_TABLE_COMMAND_FLAGS(_table, _name, _func, _flag) \ 18339297ba4SSam Leffler static db_cmdfcn_t _func; \ 184884eaacdSJohn Baldwin _DB_SET(_table, _name, _func, _flag, NULL); \ 1856337f4efSBruce Evans static void \ 186cd508278SPedro F. Giffuni _func(db_expr_t addr, bool have_addr, db_expr_t count, char *modif) 18739297ba4SSam Leffler 188884eaacdSJohn Baldwin #define DB_TABLE_COMMAND(_table, _name, _func) \ 189884eaacdSJohn Baldwin DB_TABLE_COMMAND_FLAGS(_table, _name, _func, 0) 190884eaacdSJohn Baldwin 191884eaacdSJohn Baldwin /* Wrappers around _DB_SET used for aliases. */ 192884eaacdSJohn Baldwin #define DB_TABLE_ALIAS_FLAGS(_table, _name, _func, _flag) \ 193884eaacdSJohn Baldwin _DB_SET(_table, _name, _func, _flag, NULL) 194884eaacdSJohn Baldwin #define DB_TABLE_ALIAS(_table, _name, _func) \ 195884eaacdSJohn Baldwin DB_TABLE_ALIAS_FLAGS(_table, _name, _func, 0) 19639297ba4SSam Leffler 1977ce58d4eSMitchell Horne #define DB_COMMAND_FLAGS(cmd_name, func_name, flags) \ 198884eaacdSJohn Baldwin DB_TABLE_COMMAND_FLAGS(cmd, cmd_name, func_name, flags) 19939297ba4SSam Leffler #define DB_COMMAND(cmd_name, func_name) \ 2007ce58d4eSMitchell Horne DB_COMMAND_FLAGS(cmd_name, func_name, 0) 2017ce58d4eSMitchell Horne #define DB_ALIAS_FLAGS(alias_name, func_name, flags) \ 202884eaacdSJohn Baldwin DB_TABLE_ALIAS_FLAGS(cmd, alias_name, func_name, flags) 20339297ba4SSam Leffler #define DB_ALIAS(alias_name, func_name) \ 2047ce58d4eSMitchell Horne DB_ALIAS_FLAGS(alias_name, func_name, 0) 2057ce58d4eSMitchell Horne #define DB_SHOW_COMMAND_FLAGS(cmd_name, func_name, flags) \ 206884eaacdSJohn Baldwin DB_TABLE_COMMAND_FLAGS(show, cmd_name, func_name, flags) 20739297ba4SSam Leffler #define DB_SHOW_COMMAND(cmd_name, func_name) \ 2087ce58d4eSMitchell Horne DB_SHOW_COMMAND_FLAGS(cmd_name, func_name, 0) 2097ce58d4eSMitchell Horne #define DB_SHOW_ALIAS_FLAGS(alias_name, func_name, flags) \ 210884eaacdSJohn Baldwin DB_TABLE_ALIAS_FLAGS(show, alias_name, func_name, flags) 21139297ba4SSam Leffler #define DB_SHOW_ALIAS(alias_name, func_name) \ 2127ce58d4eSMitchell Horne DB_SHOW_ALIAS_FLAGS(alias_name, func_name, 0) 21339297ba4SSam Leffler #define DB_SHOW_ALL_COMMAND(cmd_name, func_name) \ 214884eaacdSJohn Baldwin DB_TABLE_COMMAND_FLAGS(show_all, cmd_name, func_name, DB_CMD_MEMSAFE) 21539297ba4SSam Leffler #define DB_SHOW_ALL_ALIAS(alias_name, func_name) \ 216884eaacdSJohn Baldwin DB_TABLE_ALIAS_FLAGS(show_all, alias_name, func_name, DB_CMD_MEMSAFE) 2176337f4efSBruce Evans 2183da6ef3cSBruce Evans extern db_expr_t db_maxoff; 2196337f4efSBruce Evans extern int db_indent; 220381fe1aaSGarrett Wollman extern int db_inst_count; 221381fe1aaSGarrett Wollman extern int db_load_count; 222381fe1aaSGarrett Wollman extern int db_store_count; 22319e9205aSJohn Baldwin extern volatile int db_pager_quit; 2243da6ef3cSBruce Evans extern db_expr_t db_radix; 2253da6ef3cSBruce Evans extern db_expr_t db_max_width; 2263da6ef3cSBruce Evans extern db_expr_t db_tab_stop_width; 227d39d4a6eSJohn Baldwin extern db_expr_t db_lines_per_page; 228381fe1aaSGarrett Wollman 22937224cd3SMarcel Moolenaar struct thread; 2306337f4efSBruce Evans struct vm_map; 231381fe1aaSGarrett Wollman 23214e10f99SAlfred Perlstein void db_check_interrupt(void); 23314e10f99SAlfred Perlstein void db_clear_watchpoints(void); 234cd508278SPedro F. Giffuni db_addr_t db_disasm(db_addr_t loc, bool altfmt); 235381fe1aaSGarrett Wollman /* instruction disassembler */ 236*f0a7df4aSRyan Libby void db_error(const char *s) __dead2; 23714e10f99SAlfred Perlstein int db_expression(db_expr_t *valuep); 2383e5e9939SRyan Libby int db_getc(void); 23914e10f99SAlfred Perlstein int db_get_variable(db_expr_t *valuep); 24014e10f99SAlfred Perlstein void db_iprintf(const char *,...) __printflike(1, 2); 241d605beaaSJohn Baldwin struct proc *db_lookup_proc(db_expr_t addr); 242cd508278SPedro F. Giffuni struct thread *db_lookup_thread(db_expr_t addr, bool check_pid); 24314e10f99SAlfred Perlstein struct vm_map *db_map_addr(vm_offset_t); 244cd508278SPedro F. Giffuni bool db_map_current(struct vm_map *); 245cd508278SPedro F. Giffuni bool db_map_equal(struct vm_map *, struct vm_map *); 246216e80c2SMarcel Moolenaar void db_md_list_watchpoints(void); 24714e10f99SAlfred Perlstein void db_print_loc_and_inst(db_addr_t loc); 24837224cd3SMarcel Moolenaar void db_print_thread(void); 2493caaaae0SAttilio Rao int db_printf(const char *fmt, ...) __printflike(1, 2); 25037224cd3SMarcel Moolenaar int db_read_bytes(vm_offset_t addr, size_t size, char *data); 2514753168fSBruce Evans /* machine-dependent */ 25214e10f99SAlfred Perlstein int db_readline(char *lstart, int lsize); 253cd508278SPedro F. Giffuni void db_restart_at_pc(bool watchpt); 25437224cd3SMarcel Moolenaar int db_set_variable(db_expr_t value); 25514e10f99SAlfred Perlstein void db_set_watchpoints(void); 25614e10f99SAlfred Perlstein void db_skip_to_eol(void); 2575c48342fSBruce Evans bool db_stop_at_pc(int type, int code, bool *is_breakpoint, 2585c48342fSBruce Evans bool *is_watchpoint); 2594753168fSBruce Evans #define db_strcpy strcpy 26037224cd3SMarcel Moolenaar void db_trace_self(void); 26137224cd3SMarcel Moolenaar int db_trace_thread(struct thread *, int); 262cd508278SPedro F. Giffuni bool db_value_of_name(const char *name, db_expr_t *valuep); 263cd508278SPedro F. Giffuni bool db_value_of_name_pcpu(const char *name, db_expr_t *valuep); 264cd508278SPedro F. Giffuni bool db_value_of_name_vnet(const char *name, db_expr_t *valuep); 26537224cd3SMarcel Moolenaar int db_write_bytes(vm_offset_t addr, size_t size, char *data); 2664ef7db5aSMitchell Horne void db_command_register(struct db_command_table *, 2674ef7db5aSMitchell Horne struct db_command *); 2684ef7db5aSMitchell Horne void db_command_unregister(struct db_command_table *, 2694ef7db5aSMitchell Horne struct db_command *); 27040b664f6SBrandon Bergren int db_fetch_ksymtab(vm_offset_t ksym_start, vm_offset_t ksym_end, 27140b664f6SBrandon Bergren vm_offset_t relbase); 272381fe1aaSGarrett Wollman 2734753168fSBruce Evans db_cmdfcn_t db_breakpoint_cmd; 274086fec57SRobert Watson db_cmdfcn_t db_capture_cmd; 2754753168fSBruce Evans db_cmdfcn_t db_continue_cmd; 2764753168fSBruce Evans db_cmdfcn_t db_delete_cmd; 27717bbfb58SBrian S. Dean db_cmdfcn_t db_deletehwatch_cmd; 2784753168fSBruce Evans db_cmdfcn_t db_deletewatch_cmd; 2794753168fSBruce Evans db_cmdfcn_t db_examine_cmd; 2809ab83ecbSKonstantin Belousov db_cmdfcn_t db_findstack_cmd; 28117bbfb58SBrian S. Dean db_cmdfcn_t db_hwatchpoint_cmd; 2824753168fSBruce Evans db_cmdfcn_t db_listbreak_cmd; 283c9b0cc3bSRobert Watson db_cmdfcn_t db_scripts_cmd; 2844753168fSBruce Evans db_cmdfcn_t db_print_cmd; 2854753168fSBruce Evans db_cmdfcn_t db_ps; 286c9b0cc3bSRobert Watson db_cmdfcn_t db_run_cmd; 287c9b0cc3bSRobert Watson db_cmdfcn_t db_script_cmd; 2884753168fSBruce Evans db_cmdfcn_t db_search_cmd; 2894753168fSBruce Evans db_cmdfcn_t db_set_cmd; 29037224cd3SMarcel Moolenaar db_cmdfcn_t db_set_thread; 2914753168fSBruce Evans db_cmdfcn_t db_show_regs; 29237224cd3SMarcel Moolenaar db_cmdfcn_t db_show_threads; 2934753168fSBruce Evans db_cmdfcn_t db_single_step_cmd; 294618c7db3SRobert Watson db_cmdfcn_t db_textdump_cmd; 2954753168fSBruce Evans db_cmdfcn_t db_trace_until_call_cmd; 2964753168fSBruce Evans db_cmdfcn_t db_trace_until_matching_cmd; 297c9b0cc3bSRobert Watson db_cmdfcn_t db_unscript_cmd; 2984753168fSBruce Evans db_cmdfcn_t db_watchpoint_cmd; 2994753168fSBruce Evans db_cmdfcn_t db_write_cmd; 300c21bc6f3SBojan Novković db_cmdfcn_t db_pprint_cmd; 301381fe1aaSGarrett Wollman 302076b64e8SAndrew Turner #ifdef HAS_HW_BREAKPOINT 303076b64e8SAndrew Turner void db_md_list_breakpoints(void); 304076b64e8SAndrew Turner 305076b64e8SAndrew Turner db_cmdfcn_t db_deletehbreak_cmd; 306076b64e8SAndrew Turner db_cmdfcn_t db_hbreakpoint_cmd; 307076b64e8SAndrew Turner #endif 308076b64e8SAndrew Turner 3096337f4efSBruce Evans /* 310086fec57SRobert Watson * Interface between DDB and the DDB output capture facility. 311086fec57SRobert Watson */ 312086fec57SRobert Watson struct dumperinfo; 313086fec57SRobert Watson void db_capture_dump(struct dumperinfo *di); 314086fec57SRobert Watson void db_capture_enterpager(void); 315086fec57SRobert Watson void db_capture_exitpager(void); 316086fec57SRobert Watson void db_capture_write(char *buffer, u_int buflen); 317086fec57SRobert Watson void db_capture_writech(char ch); 318086fec57SRobert Watson 319c9b0cc3bSRobert Watson /* 320c9b0cc3bSRobert Watson * Interface between DDB and the script facility. 321c9b0cc3bSRobert Watson */ 322c9b0cc3bSRobert Watson void db_script_kdbenter(const char *eventname); /* KDB enter event. */ 323c9b0cc3bSRobert Watson 324618c7db3SRobert Watson /* 325618c7db3SRobert Watson * Interface between DDB and the textdump facility. 326618c7db3SRobert Watson * 327618c7db3SRobert Watson * Text dump blocks are of a fixed size; textdump_block_buffer is a 328618c7db3SRobert Watson * statically allocated buffer that code interacting with textdumps can use 329618c7db3SRobert Watson * to prepare and hold a pending block in when calling writenextblock(). 330618c7db3SRobert Watson */ 331618c7db3SRobert Watson #define TEXTDUMP_BLOCKSIZE 512 332618c7db3SRobert Watson extern char textdump_block_buffer[TEXTDUMP_BLOCKSIZE]; 333618c7db3SRobert Watson 334618c7db3SRobert Watson void textdump_mkustar(char *block_buffer, const char *filename, 335618c7db3SRobert Watson u_int size); 336618c7db3SRobert Watson void textdump_restoreoff(off_t offset); 337618c7db3SRobert Watson void textdump_saveoff(off_t *offsetp); 338618c7db3SRobert Watson int textdump_writenextblock(struct dumperinfo *di, char *buffer); 339618c7db3SRobert Watson 340618c7db3SRobert Watson /* 341618c7db3SRobert Watson * Interface between the kernel and textdumps. 342618c7db3SRobert Watson */ 343618c7db3SRobert Watson extern int textdump_pending; /* Call textdump_dumpsys() instead. */ 344618c7db3SRobert Watson void textdump_dumpsys(struct dumperinfo *di); 345618c7db3SRobert Watson 3464753168fSBruce Evans #endif /* !_DDB_DDB_H_ */ 347