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