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