1139825Simp/*- 2131903Smarcel * Copyright (c) 2004 Marcel Moolenaar 3131903Smarcel * All rights reserved. 4131903Smarcel * 5131903Smarcel * Redistribution and use in source and binary forms, with or without 6131903Smarcel * modification, are permitted provided that the following conditions 7131903Smarcel * are met: 8131903Smarcel * 9131903Smarcel * 1. Redistributions of source code must retain the above copyright 10131903Smarcel * notice, this list of conditions and the following disclaimer. 11131903Smarcel * 2. Redistributions in binary form must reproduce the above copyright 12131903Smarcel * notice, this list of conditions and the following disclaimer in the 13131903Smarcel * documentation and/or other materials provided with the distribution. 14131903Smarcel * 15131903Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16131903Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17131903Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18131903Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19131903Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20131903Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21131903Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22131903Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23131903Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24131903Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25131903Smarcel * 26131903Smarcel * $FreeBSD$ 27131903Smarcel */ 28131903Smarcel 29131903Smarcel#ifndef _SYS_KDB_H_ 30131903Smarcel#define _SYS_KDB_H_ 31131903Smarcel 32131903Smarcel#include <machine/setjmp.h> 33131903Smarcel 34234190Sjhbstruct pcb; 35234190Sjhbstruct thread; 36234190Sjhbstruct trapframe; 37234190Sjhb 38131903Smarceltypedef int dbbe_init_f(void); 39131903Smarceltypedef void dbbe_trace_f(void); 40234190Sjhbtypedef void dbbe_trace_thread_f(struct thread *); 41131903Smarceltypedef int dbbe_trap_f(int, int); 42131903Smarcel 43131903Smarcelstruct kdb_dbbe { 44131903Smarcel const char *dbbe_name; 45131903Smarcel dbbe_init_f *dbbe_init; 46131903Smarcel dbbe_trace_f *dbbe_trace; 47234190Sjhb dbbe_trace_thread_f *dbbe_trace_thread; 48131903Smarcel dbbe_trap_f *dbbe_trap; 49131903Smarcel int dbbe_active; 50131903Smarcel}; 51131903Smarcel 52234190Sjhb#define KDB_BACKEND(name, init, trace, trace_thread, trap) \ 53131903Smarcel static struct kdb_dbbe name##_dbbe = { \ 54131903Smarcel .dbbe_name = #name, \ 55131903Smarcel .dbbe_init = init, \ 56131903Smarcel .dbbe_trace = trace, \ 57234190Sjhb .dbbe_trace_thread = trace_thread, \ 58131903Smarcel .dbbe_trap = trap \ 59131903Smarcel }; \ 60131903Smarcel DATA_SET(kdb_dbbe_set, name##_dbbe) 61131903Smarcel 62131903Smarcelextern int kdb_active; /* Non-zero while in debugger. */ 63145343Spsextern int debugger_on_panic; /* enter the debugger on panic. */ 64131903Smarcelextern struct kdb_dbbe *kdb_dbbe; /* Default debugger backend or NULL. */ 65131903Smarcelextern struct trapframe *kdb_frame; /* Frame to kdb_trap(). */ 66131903Smarcelextern struct pcb *kdb_thrctx; /* Current context. */ 67131903Smarcelextern struct thread *kdb_thread; /* Current thread. */ 68131903Smarcel 69131903Smarcelint kdb_alt_break(int, int *); 70225203Srwatsonint kdb_alt_break_gdb(int, int *); 71225203Srwatsonint kdb_break(void); 72131903Smarcelvoid kdb_backtrace(void); 73234190Sjhbvoid kdb_backtrace_thread(struct thread *); 74132001Smarcelint kdb_dbbe_select(const char *); 75174898Srwatsonvoid kdb_enter(const char *, const char *); 76131903Smarcelvoid kdb_init(void); 77131903Smarcelvoid * kdb_jmpbuf(jmp_buf); 78178766Spetervoid kdb_panic(const char *); 79178766Spetervoid kdb_reboot(void); 80131903Smarcelvoid kdb_reenter(void); 81131903Smarcelstruct pcb *kdb_thr_ctx(struct thread *); 82131903Smarcelstruct thread *kdb_thr_first(void); 83132481Smarcelstruct thread *kdb_thr_from_pid(pid_t); 84132481Smarcelstruct thread *kdb_thr_lookup(lwpid_t); 85131903Smarcelstruct thread *kdb_thr_next(struct thread *); 86131903Smarcelint kdb_thr_select(struct thread *); 87131903Smarcelint kdb_trap(int, int, struct trapframe *); 88131903Smarcel 89174898Srwatson/* 90174898Srwatson * KDB enters the debugger via breakpoint(), which leaves the debugger without 91174898Srwatson * a lot of information about why it was entered. This simple enumerated set 92174898Srwatson * captures some basic information. 93174898Srwatson * 94174898Srwatson * It is recommended that values here be short (<16 character) alpha-numeric 95174898Srwatson * strings, as they will be used to construct DDB(4) script names. 96174898Srwatson */ 97174898Srwatsonextern const char * volatile kdb_why; 98174898Srwatson#define KDB_WHY_UNSET NULL /* No reason set. */ 99174898Srwatson#define KDB_WHY_PANIC "panic" /* panic() was called. */ 100244100Salfred#define KDB_WHY_KASSERT "kassert" /* kassert failed. */ 101174898Srwatson#define KDB_WHY_SYSCTL "sysctl" /* Sysctl entered debugger. */ 102174898Srwatson#define KDB_WHY_BOOTFLAGS "bootflags" /* Boot flags were set. */ 103174898Srwatson#define KDB_WHY_WITNESS "witness" /* Witness entered debugger. */ 104174898Srwatson#define KDB_WHY_VFSLOCK "vfslock" /* VFS detected lock problem. */ 105174898Srwatson#define KDB_WHY_NETGRAPH "netgraph" /* Netgraph entered debugger. */ 106174898Srwatson#define KDB_WHY_BREAK "break" /* Console or serial break. */ 107174898Srwatson#define KDB_WHY_WATCHDOG "watchdog" /* Watchdog entered debugger. */ 108174898Srwatson#define KDB_WHY_CAM "cam" /* CAM has entered debugger. */ 109174898Srwatson#define KDB_WHY_NDIS "ndis" /* NDIS entered debugger. */ 110174898Srwatson#define KDB_WHY_ACPI "acpi" /* ACPI entered debugger. */ 111221869Sattilio#define KDB_WHY_TRAPSIG "trapsig" /* Sparc fault. */ 112174898Srwatson#define KDB_WHY_POWERFAIL "powerfail" /* Powerfail NMI. */ 113174898Srwatson#define KDB_WHY_MAC "mac" /* MAC Framework. */ 114174898Srwatson#define KDB_WHY_POWERPC "powerpc" /* Unhandled powerpc intr. */ 115174898Srwatson#define KDB_WHY_UNIONFS "unionfs" /* Unionfs bug. */ 116179228Sjb#define KDB_WHY_DTRACE "dtrace" /* DTrace action entered debugger. */ 117174898Srwatson 118178766Speter/* Return values for kdb_alt_break */ 119178766Speter#define KDB_REQ_DEBUGGER 1 /* User requested Debugger */ 120178766Speter#define KDB_REQ_PANIC 2 /* User requested a panic */ 121178766Speter#define KDB_REQ_REBOOT 3 /* User requested a clean reboot */ 122178766Speter 123131903Smarcel#endif /* !_SYS_KDB_H_ */ 124