| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 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 | #ifdef	CONFIG_KGDB_KDB | 
|  | 17 | #include <linux/init.h> | 
|  | 18 | #include <linux/sched.h> | 
| Arun Sharma | 6006349 | 2011-07-26 16:09:06 -0700 | [diff] [blame] | 19 | #include <linux/atomic.h> | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 20 |  | 
|  | 21 | #define KDB_POLL_FUNC_MAX	5 | 
| Jason Wessel | f5316b4 | 2010-05-20 21:04:22 -0500 | [diff] [blame] | 22 | extern int kdb_poll_idx; | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 23 |  | 
|  | 24 | /* | 
|  | 25 | * kdb_initial_cpu is initialized to -1, and is set to the cpu | 
|  | 26 | * number whenever the kernel debugger is entered. | 
|  | 27 | */ | 
|  | 28 | extern int kdb_initial_cpu; | 
|  | 29 | extern atomic_t kdb_event; | 
|  | 30 |  | 
| Jason Wessel | f7030bb | 2010-10-11 10:20:14 -0500 | [diff] [blame] | 31 | /* Types and messages used for dynamically added kdb shell commands */ | 
|  | 32 |  | 
|  | 33 | #define KDB_MAXARGS    16 /* Maximum number of arguments to a function  */ | 
|  | 34 |  | 
|  | 35 | typedef enum { | 
|  | 36 | KDB_REPEAT_NONE = 0,	/* Do not repeat this command */ | 
|  | 37 | KDB_REPEAT_NO_ARGS,	/* Repeat the command without arguments */ | 
|  | 38 | KDB_REPEAT_WITH_ARGS,	/* Repeat the command including its arguments */ | 
|  | 39 | } kdb_repeat_t; | 
|  | 40 |  | 
|  | 41 | typedef int (*kdb_func_t)(int, const char **); | 
|  | 42 |  | 
|  | 43 | /* KDB return codes from a command or internal kdb function */ | 
|  | 44 | #define KDB_NOTFOUND	(-1) | 
|  | 45 | #define KDB_ARGCOUNT	(-2) | 
|  | 46 | #define KDB_BADWIDTH	(-3) | 
|  | 47 | #define KDB_BADRADIX	(-4) | 
|  | 48 | #define KDB_NOTENV	(-5) | 
|  | 49 | #define KDB_NOENVVALUE	(-6) | 
|  | 50 | #define KDB_NOTIMP	(-7) | 
|  | 51 | #define KDB_ENVFULL	(-8) | 
|  | 52 | #define KDB_ENVBUFFULL	(-9) | 
|  | 53 | #define KDB_TOOMANYBPT	(-10) | 
|  | 54 | #define KDB_TOOMANYDBREGS (-11) | 
|  | 55 | #define KDB_DUPBPT	(-12) | 
|  | 56 | #define KDB_BPTNOTFOUND	(-13) | 
|  | 57 | #define KDB_BADMODE	(-14) | 
|  | 58 | #define KDB_BADINT	(-15) | 
|  | 59 | #define KDB_INVADDRFMT  (-16) | 
|  | 60 | #define KDB_BADREG      (-17) | 
|  | 61 | #define KDB_BADCPUNUM   (-18) | 
|  | 62 | #define KDB_BADLENGTH	(-19) | 
|  | 63 | #define KDB_NOBP	(-20) | 
|  | 64 | #define KDB_BADADDR	(-21) | 
|  | 65 |  | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 66 | /* | 
|  | 67 | * kdb_diemsg | 
|  | 68 | * | 
|  | 69 | *	Contains a pointer to the last string supplied to the | 
|  | 70 | *	kernel 'die' panic function. | 
|  | 71 | */ | 
|  | 72 | extern const char *kdb_diemsg; | 
|  | 73 |  | 
|  | 74 | #define KDB_FLAG_EARLYKDB	(1 << 0) /* set from boot parameter kdb=early */ | 
|  | 75 | #define KDB_FLAG_CATASTROPHIC	(1 << 1) /* A catastrophic event has occurred */ | 
|  | 76 | #define KDB_FLAG_CMD_INTERRUPT	(1 << 2) /* Previous command was interrupted */ | 
|  | 77 | #define KDB_FLAG_NOIPI		(1 << 3) /* Do not send IPIs */ | 
|  | 78 | #define KDB_FLAG_ONLY_DO_DUMP	(1 << 4) /* Only do a dump, used when | 
|  | 79 | * kdb is off */ | 
|  | 80 | #define KDB_FLAG_NO_CONSOLE	(1 << 5) /* No console is available, | 
|  | 81 | * kdb is disabled */ | 
|  | 82 | #define KDB_FLAG_NO_VT_CONSOLE	(1 << 6) /* No VT console is available, do | 
|  | 83 | * not use keyboard */ | 
|  | 84 | #define KDB_FLAG_NO_I8042	(1 << 7) /* No i8042 chip is available, do | 
|  | 85 | * not use keyboard */ | 
|  | 86 |  | 
|  | 87 | extern int kdb_flags;	/* Global flags, see kdb_state for per cpu state */ | 
|  | 88 |  | 
|  | 89 | extern void kdb_save_flags(void); | 
|  | 90 | extern void kdb_restore_flags(void); | 
|  | 91 |  | 
|  | 92 | #define KDB_FLAG(flag)		(kdb_flags & KDB_FLAG_##flag) | 
|  | 93 | #define KDB_FLAG_SET(flag)	((void)(kdb_flags |= KDB_FLAG_##flag)) | 
|  | 94 | #define KDB_FLAG_CLEAR(flag)	((void)(kdb_flags &= ~KDB_FLAG_##flag)) | 
|  | 95 |  | 
|  | 96 | /* | 
|  | 97 | * External entry point for the kernel debugger.  The pt_regs | 
|  | 98 | * at the time of entry are supplied along with the reason for | 
|  | 99 | * entry to the kernel debugger. | 
|  | 100 | */ | 
|  | 101 |  | 
|  | 102 | typedef enum { | 
|  | 103 | KDB_REASON_ENTER = 1,	/* KDB_ENTER() trap/fault - regs valid */ | 
|  | 104 | KDB_REASON_ENTER_SLAVE,	/* KDB_ENTER_SLAVE() trap/fault - regs valid */ | 
|  | 105 | KDB_REASON_BREAK,	/* Breakpoint inst. - regs valid */ | 
|  | 106 | KDB_REASON_DEBUG,	/* Debug Fault - regs valid */ | 
|  | 107 | KDB_REASON_OOPS,	/* Kernel Oops - regs valid */ | 
|  | 108 | KDB_REASON_SWITCH,	/* CPU switch - regs valid*/ | 
|  | 109 | KDB_REASON_KEYBOARD,	/* Keyboard entry - regs valid */ | 
|  | 110 | KDB_REASON_NMI,		/* Non-maskable interrupt; regs valid */ | 
|  | 111 | KDB_REASON_RECURSE,	/* Recursive entry to kdb; | 
|  | 112 | * regs probably valid */ | 
|  | 113 | KDB_REASON_SSTEP,	/* Single Step trap. - regs valid */ | 
|  | 114 | } kdb_reason_t; | 
|  | 115 |  | 
| Jason Wessel | d37d39a | 2010-05-20 21:04:27 -0500 | [diff] [blame] | 116 | extern int kdb_trap_printk; | 
| Joe Perches | b9075fa | 2011-10-31 17:11:33 -0700 | [diff] [blame] | 117 | extern __printf(1, 0) int vkdb_printf(const char *fmt, va_list args); | 
|  | 118 | extern __printf(1, 2) int kdb_printf(const char *, ...); | 
|  | 119 | typedef __printf(1, 2) int (*kdb_printf_t)(const char *, ...); | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 120 |  | 
|  | 121 | extern void kdb_init(int level); | 
|  | 122 |  | 
|  | 123 | /* Access to kdb specific polling devices */ | 
|  | 124 | typedef int (*get_char_func)(void); | 
|  | 125 | extern get_char_func kdb_poll_funcs[]; | 
|  | 126 | extern int kdb_get_kbd_char(void); | 
|  | 127 |  | 
|  | 128 | static inline | 
|  | 129 | int kdb_process_cpu(const struct task_struct *p) | 
|  | 130 | { | 
|  | 131 | unsigned int cpu = task_thread_info(p)->cpu; | 
|  | 132 | if (cpu > num_possible_cpus()) | 
|  | 133 | cpu = 0; | 
|  | 134 | return cpu; | 
|  | 135 | } | 
|  | 136 |  | 
|  | 137 | /* kdb access to register set for stack dumping */ | 
|  | 138 | extern struct pt_regs *kdb_current_regs; | 
| Jason Wessel | 91b152a | 2010-08-23 09:20:14 -0500 | [diff] [blame] | 139 | #ifdef CONFIG_KALLSYMS | 
|  | 140 | extern const char *kdb_walk_kallsyms(loff_t *pos); | 
|  | 141 | #else /* ! CONFIG_KALLSYMS */ | 
|  | 142 | static inline const char *kdb_walk_kallsyms(loff_t *pos) | 
|  | 143 | { | 
|  | 144 | return NULL; | 
|  | 145 | } | 
|  | 146 | #endif /* ! CONFIG_KALLSYMS */ | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 147 |  | 
| Jason Wessel | f7030bb | 2010-10-11 10:20:14 -0500 | [diff] [blame] | 148 | /* Dynamic kdb shell command registration */ | 
|  | 149 | extern int kdb_register(char *, kdb_func_t, char *, char *, short); | 
|  | 150 | extern int kdb_register_repeat(char *, kdb_func_t, char *, char *, | 
|  | 151 | short, kdb_repeat_t); | 
|  | 152 | extern int kdb_unregister(char *); | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 153 | #else /* ! CONFIG_KGDB_KDB */ | 
|  | 154 | #define kdb_printf(...) | 
|  | 155 | #define kdb_init(x) | 
| Jason Wessel | f7030bb | 2010-10-11 10:20:14 -0500 | [diff] [blame] | 156 | #define kdb_register(...) | 
|  | 157 | #define kdb_register_repeat(...) | 
|  | 158 | #define kdb_uregister(x) | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 159 | #endif	/* CONFIG_KGDB_KDB */ | 
|  | 160 | enum { | 
|  | 161 | KDB_NOT_INITIALIZED, | 
|  | 162 | KDB_INIT_EARLY, | 
|  | 163 | KDB_INIT_FULL, | 
|  | 164 | }; | 
| Jason Wessel | 81d4450 | 2010-08-05 09:22:30 -0500 | [diff] [blame] | 165 |  | 
|  | 166 | extern int kdbgetintenv(const char *, int *); | 
|  | 167 | extern int kdb_set(int, const char **); | 
|  | 168 |  | 
| Jason Wessel | 5d5314d | 2010-05-20 21:04:20 -0500 | [diff] [blame] | 169 | #endif	/* !_KDB_H */ |