xref: /OK3568_Linux_fs/kernel/include/linux/kdb.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef _KDB_H
2*4882a593Smuzhiyun #define _KDB_H
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun /*
5*4882a593Smuzhiyun  * Kernel Debugger Architecture Independent Global Headers
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * This file is subject to the terms and conditions of the GNU General Public
8*4882a593Smuzhiyun  * License.  See the file "COPYING" in the main directory of this archive
9*4882a593Smuzhiyun  * for more details.
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * Copyright (c) 2000-2007 Silicon Graphics, Inc.  All Rights Reserved.
12*4882a593Smuzhiyun  * Copyright (C) 2000 Stephane Eranian <eranian@hpl.hp.com>
13*4882a593Smuzhiyun  * Copyright (C) 2009 Jason Wessel <jason.wessel@windriver.com>
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /* Shifted versions of the command enable bits are be used if the command
17*4882a593Smuzhiyun  * has no arguments (see kdb_check_flags). This allows commands, such as
18*4882a593Smuzhiyun  * go, to have different permissions depending upon whether it is called
19*4882a593Smuzhiyun  * with an argument.
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun #define KDB_ENABLE_NO_ARGS_SHIFT 10
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun typedef enum {
24*4882a593Smuzhiyun 	KDB_ENABLE_ALL = (1 << 0), /* Enable everything */
25*4882a593Smuzhiyun 	KDB_ENABLE_MEM_READ = (1 << 1),
26*4882a593Smuzhiyun 	KDB_ENABLE_MEM_WRITE = (1 << 2),
27*4882a593Smuzhiyun 	KDB_ENABLE_REG_READ = (1 << 3),
28*4882a593Smuzhiyun 	KDB_ENABLE_REG_WRITE = (1 << 4),
29*4882a593Smuzhiyun 	KDB_ENABLE_INSPECT = (1 << 5),
30*4882a593Smuzhiyun 	KDB_ENABLE_FLOW_CTRL = (1 << 6),
31*4882a593Smuzhiyun 	KDB_ENABLE_SIGNAL = (1 << 7),
32*4882a593Smuzhiyun 	KDB_ENABLE_REBOOT = (1 << 8),
33*4882a593Smuzhiyun 	/* User exposed values stop here, all remaining flags are
34*4882a593Smuzhiyun 	 * exclusively used to describe a commands behaviour.
35*4882a593Smuzhiyun 	 */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	KDB_ENABLE_ALWAYS_SAFE = (1 << 9),
38*4882a593Smuzhiyun 	KDB_ENABLE_MASK = (1 << KDB_ENABLE_NO_ARGS_SHIFT) - 1,
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	KDB_ENABLE_ALL_NO_ARGS = KDB_ENABLE_ALL << KDB_ENABLE_NO_ARGS_SHIFT,
41*4882a593Smuzhiyun 	KDB_ENABLE_MEM_READ_NO_ARGS = KDB_ENABLE_MEM_READ
42*4882a593Smuzhiyun 				      << KDB_ENABLE_NO_ARGS_SHIFT,
43*4882a593Smuzhiyun 	KDB_ENABLE_MEM_WRITE_NO_ARGS = KDB_ENABLE_MEM_WRITE
44*4882a593Smuzhiyun 				       << KDB_ENABLE_NO_ARGS_SHIFT,
45*4882a593Smuzhiyun 	KDB_ENABLE_REG_READ_NO_ARGS = KDB_ENABLE_REG_READ
46*4882a593Smuzhiyun 				      << KDB_ENABLE_NO_ARGS_SHIFT,
47*4882a593Smuzhiyun 	KDB_ENABLE_REG_WRITE_NO_ARGS = KDB_ENABLE_REG_WRITE
48*4882a593Smuzhiyun 				       << KDB_ENABLE_NO_ARGS_SHIFT,
49*4882a593Smuzhiyun 	KDB_ENABLE_INSPECT_NO_ARGS = KDB_ENABLE_INSPECT
50*4882a593Smuzhiyun 				     << KDB_ENABLE_NO_ARGS_SHIFT,
51*4882a593Smuzhiyun 	KDB_ENABLE_FLOW_CTRL_NO_ARGS = KDB_ENABLE_FLOW_CTRL
52*4882a593Smuzhiyun 				       << KDB_ENABLE_NO_ARGS_SHIFT,
53*4882a593Smuzhiyun 	KDB_ENABLE_SIGNAL_NO_ARGS = KDB_ENABLE_SIGNAL
54*4882a593Smuzhiyun 				    << KDB_ENABLE_NO_ARGS_SHIFT,
55*4882a593Smuzhiyun 	KDB_ENABLE_REBOOT_NO_ARGS = KDB_ENABLE_REBOOT
56*4882a593Smuzhiyun 				    << KDB_ENABLE_NO_ARGS_SHIFT,
57*4882a593Smuzhiyun 	KDB_ENABLE_ALWAYS_SAFE_NO_ARGS = KDB_ENABLE_ALWAYS_SAFE
58*4882a593Smuzhiyun 					 << KDB_ENABLE_NO_ARGS_SHIFT,
59*4882a593Smuzhiyun 	KDB_ENABLE_MASK_NO_ARGS = KDB_ENABLE_MASK << KDB_ENABLE_NO_ARGS_SHIFT,
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	KDB_REPEAT_NO_ARGS = 0x40000000, /* Repeat the command w/o arguments */
62*4882a593Smuzhiyun 	KDB_REPEAT_WITH_ARGS = 0x80000000, /* Repeat the command with args */
63*4882a593Smuzhiyun } kdb_cmdflags_t;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun typedef int (*kdb_func_t)(int, const char **);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #ifdef	CONFIG_KGDB_KDB
68*4882a593Smuzhiyun #include <linux/init.h>
69*4882a593Smuzhiyun #include <linux/sched.h>
70*4882a593Smuzhiyun #include <linux/atomic.h>
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define KDB_POLL_FUNC_MAX	5
73*4882a593Smuzhiyun extern int kdb_poll_idx;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /*
76*4882a593Smuzhiyun  * kdb_initial_cpu is initialized to -1, and is set to the cpu
77*4882a593Smuzhiyun  * number whenever the kernel debugger is entered.
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun extern int kdb_initial_cpu;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /* Types and messages used for dynamically added kdb shell commands */
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define KDB_MAXARGS    16 /* Maximum number of arguments to a function  */
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* KDB return codes from a command or internal kdb function */
86*4882a593Smuzhiyun #define KDB_NOTFOUND	(-1)
87*4882a593Smuzhiyun #define KDB_ARGCOUNT	(-2)
88*4882a593Smuzhiyun #define KDB_BADWIDTH	(-3)
89*4882a593Smuzhiyun #define KDB_BADRADIX	(-4)
90*4882a593Smuzhiyun #define KDB_NOTENV	(-5)
91*4882a593Smuzhiyun #define KDB_NOENVVALUE	(-6)
92*4882a593Smuzhiyun #define KDB_NOTIMP	(-7)
93*4882a593Smuzhiyun #define KDB_ENVFULL	(-8)
94*4882a593Smuzhiyun #define KDB_ENVBUFFULL	(-9)
95*4882a593Smuzhiyun #define KDB_TOOMANYBPT	(-10)
96*4882a593Smuzhiyun #define KDB_TOOMANYDBREGS (-11)
97*4882a593Smuzhiyun #define KDB_DUPBPT	(-12)
98*4882a593Smuzhiyun #define KDB_BPTNOTFOUND	(-13)
99*4882a593Smuzhiyun #define KDB_BADMODE	(-14)
100*4882a593Smuzhiyun #define KDB_BADINT	(-15)
101*4882a593Smuzhiyun #define KDB_INVADDRFMT  (-16)
102*4882a593Smuzhiyun #define KDB_BADREG      (-17)
103*4882a593Smuzhiyun #define KDB_BADCPUNUM   (-18)
104*4882a593Smuzhiyun #define KDB_BADLENGTH	(-19)
105*4882a593Smuzhiyun #define KDB_NOBP	(-20)
106*4882a593Smuzhiyun #define KDB_BADADDR	(-21)
107*4882a593Smuzhiyun #define KDB_NOPERM	(-22)
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun  * kdb_diemsg
111*4882a593Smuzhiyun  *
112*4882a593Smuzhiyun  *	Contains a pointer to the last string supplied to the
113*4882a593Smuzhiyun  *	kernel 'die' panic function.
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun extern const char *kdb_diemsg;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define KDB_FLAG_EARLYKDB	(1 << 0) /* set from boot parameter kdb=early */
118*4882a593Smuzhiyun #define KDB_FLAG_CATASTROPHIC	(1 << 1) /* A catastrophic event has occurred */
119*4882a593Smuzhiyun #define KDB_FLAG_CMD_INTERRUPT	(1 << 2) /* Previous command was interrupted */
120*4882a593Smuzhiyun #define KDB_FLAG_NOIPI		(1 << 3) /* Do not send IPIs */
121*4882a593Smuzhiyun #define KDB_FLAG_NO_CONSOLE	(1 << 5) /* No console is available,
122*4882a593Smuzhiyun 					  * kdb is disabled */
123*4882a593Smuzhiyun #define KDB_FLAG_NO_VT_CONSOLE	(1 << 6) /* No VT console is available, do
124*4882a593Smuzhiyun 					  * not use keyboard */
125*4882a593Smuzhiyun #define KDB_FLAG_NO_I8042	(1 << 7) /* No i8042 chip is available, do
126*4882a593Smuzhiyun 					  * not use keyboard */
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun extern unsigned int kdb_flags;	/* Global flags, see kdb_state for per cpu state */
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun extern void kdb_save_flags(void);
131*4882a593Smuzhiyun extern void kdb_restore_flags(void);
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define KDB_FLAG(flag)		(kdb_flags & KDB_FLAG_##flag)
134*4882a593Smuzhiyun #define KDB_FLAG_SET(flag)	((void)(kdb_flags |= KDB_FLAG_##flag))
135*4882a593Smuzhiyun #define KDB_FLAG_CLEAR(flag)	((void)(kdb_flags &= ~KDB_FLAG_##flag))
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun /*
138*4882a593Smuzhiyun  * External entry point for the kernel debugger.  The pt_regs
139*4882a593Smuzhiyun  * at the time of entry are supplied along with the reason for
140*4882a593Smuzhiyun  * entry to the kernel debugger.
141*4882a593Smuzhiyun  */
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun typedef enum {
144*4882a593Smuzhiyun 	KDB_REASON_ENTER = 1,	/* KDB_ENTER() trap/fault - regs valid */
145*4882a593Smuzhiyun 	KDB_REASON_ENTER_SLAVE,	/* KDB_ENTER_SLAVE() trap/fault - regs valid */
146*4882a593Smuzhiyun 	KDB_REASON_BREAK,	/* Breakpoint inst. - regs valid */
147*4882a593Smuzhiyun 	KDB_REASON_DEBUG,	/* Debug Fault - regs valid */
148*4882a593Smuzhiyun 	KDB_REASON_OOPS,	/* Kernel Oops - regs valid */
149*4882a593Smuzhiyun 	KDB_REASON_SWITCH,	/* CPU switch - regs valid*/
150*4882a593Smuzhiyun 	KDB_REASON_KEYBOARD,	/* Keyboard entry - regs valid */
151*4882a593Smuzhiyun 	KDB_REASON_NMI,		/* Non-maskable interrupt; regs valid */
152*4882a593Smuzhiyun 	KDB_REASON_RECURSE,	/* Recursive entry to kdb;
153*4882a593Smuzhiyun 				 * regs probably valid */
154*4882a593Smuzhiyun 	KDB_REASON_SSTEP,	/* Single Step trap. - regs valid */
155*4882a593Smuzhiyun 	KDB_REASON_SYSTEM_NMI,	/* In NMI due to SYSTEM cmd; regs valid */
156*4882a593Smuzhiyun } kdb_reason_t;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun enum kdb_msgsrc {
159*4882a593Smuzhiyun 	KDB_MSGSRC_INTERNAL, /* direct call to kdb_printf() */
160*4882a593Smuzhiyun 	KDB_MSGSRC_PRINTK, /* trapped from printk() */
161*4882a593Smuzhiyun };
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun extern int kdb_trap_printk;
164*4882a593Smuzhiyun extern int kdb_printf_cpu;
165*4882a593Smuzhiyun extern __printf(2, 0) int vkdb_printf(enum kdb_msgsrc src, const char *fmt,
166*4882a593Smuzhiyun 				      va_list args);
167*4882a593Smuzhiyun extern __printf(1, 2) int kdb_printf(const char *, ...);
168*4882a593Smuzhiyun typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...);
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun extern void kdb_init(int level);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun /* Access to kdb specific polling devices */
173*4882a593Smuzhiyun typedef int (*get_char_func)(void);
174*4882a593Smuzhiyun extern get_char_func kdb_poll_funcs[];
175*4882a593Smuzhiyun extern int kdb_get_kbd_char(void);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun static inline
kdb_process_cpu(const struct task_struct * p)178*4882a593Smuzhiyun int kdb_process_cpu(const struct task_struct *p)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	unsigned int cpu = task_cpu(p);
181*4882a593Smuzhiyun 	if (cpu > num_possible_cpus())
182*4882a593Smuzhiyun 		cpu = 0;
183*4882a593Smuzhiyun 	return cpu;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun #ifdef CONFIG_KALLSYMS
187*4882a593Smuzhiyun extern const char *kdb_walk_kallsyms(loff_t *pos);
188*4882a593Smuzhiyun #else /* ! CONFIG_KALLSYMS */
kdb_walk_kallsyms(loff_t * pos)189*4882a593Smuzhiyun static inline const char *kdb_walk_kallsyms(loff_t *pos)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	return NULL;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun #endif /* ! CONFIG_KALLSYMS */
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /* Dynamic kdb shell command registration */
196*4882a593Smuzhiyun extern int kdb_register(char *, kdb_func_t, char *, char *, short);
197*4882a593Smuzhiyun extern int kdb_register_flags(char *, kdb_func_t, char *, char *,
198*4882a593Smuzhiyun 			      short, kdb_cmdflags_t);
199*4882a593Smuzhiyun extern int kdb_unregister(char *);
200*4882a593Smuzhiyun #else /* ! CONFIG_KGDB_KDB */
kdb_printf(const char * fmt,...)201*4882a593Smuzhiyun static inline __printf(1, 2) int kdb_printf(const char *fmt, ...) { return 0; }
kdb_init(int level)202*4882a593Smuzhiyun static inline void kdb_init(int level) {}
kdb_register(char * cmd,kdb_func_t func,char * usage,char * help,short minlen)203*4882a593Smuzhiyun static inline int kdb_register(char *cmd, kdb_func_t func, char *usage,
204*4882a593Smuzhiyun 			       char *help, short minlen) { return 0; }
kdb_register_flags(char * cmd,kdb_func_t func,char * usage,char * help,short minlen,kdb_cmdflags_t flags)205*4882a593Smuzhiyun static inline int kdb_register_flags(char *cmd, kdb_func_t func, char *usage,
206*4882a593Smuzhiyun 				     char *help, short minlen,
207*4882a593Smuzhiyun 				     kdb_cmdflags_t flags) { return 0; }
kdb_unregister(char * cmd)208*4882a593Smuzhiyun static inline int kdb_unregister(char *cmd) { return 0; }
209*4882a593Smuzhiyun #endif	/* CONFIG_KGDB_KDB */
210*4882a593Smuzhiyun enum {
211*4882a593Smuzhiyun 	KDB_NOT_INITIALIZED,
212*4882a593Smuzhiyun 	KDB_INIT_EARLY,
213*4882a593Smuzhiyun 	KDB_INIT_FULL,
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun extern int kdbgetintenv(const char *, int *);
217*4882a593Smuzhiyun extern int kdb_set(int, const char **);
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #endif	/* !_KDB_H */
220