Blame view
include/linux/kgdb.h
10.2 KB
dc7d55270 kgdb: core |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* * This provides the callbacks and functions that KGDB needs to share between * the core, I/O and arch-specific portions. * * Author: Amit Kale <amitkale@linsyssoft.com> and * Tom Rini <trini@kernel.crashing.org> * * 2001-2004 (c) Amit S. Kale and 2003-2005 (c) MontaVista Software, Inc. * This file is licensed under the terms of the GNU General Public License * version 2. This program is licensed "as is" without any warranty of any * kind, whether express or implied. */ #ifndef _KGDB_H_ #define _KGDB_H_ #include <linux/serial_8250.h> #include <linux/linkage.h> #include <linux/init.h> |
60063497a atomic: use <linu... |
19 |
#include <linux/atomic.h> |
dcc787112 kgdb: core change... |
20 |
#ifdef CONFIG_HAVE_ARCH_KGDB |
dc7d55270 kgdb: core |
21 |
#include <asm/kgdb.h> |
dcc787112 kgdb: core change... |
22 |
#endif |
dc7d55270 kgdb: core |
23 |
|
dcc787112 kgdb: core change... |
24 |
#ifdef CONFIG_KGDB |
dc7d55270 kgdb: core |
25 |
struct pt_regs; |
e3e2aaf7d kgdb: add documen... |
26 27 |
/** * kgdb_skipexception - (optional) exit kgdb_handle_exception early |
dc7d55270 kgdb: core |
28 29 30 |
* @exception: Exception vector number * @regs: Current &struct pt_regs. * |
e3e2aaf7d kgdb: add documen... |
31 32 |
* On some architectures it is required to skip a breakpoint * exception when it occurs after a breakpoint has been removed. |
b11e1eca7 kgdb: Fix kernel-... |
33 |
* This can be implemented in the architecture specific portion of kgdb. |
dc7d55270 kgdb: core |
34 35 |
*/ extern int kgdb_skipexception(int exception, struct pt_regs *regs); |
dc7d55270 kgdb: core |
36 37 38 |
struct tasklet_struct; struct task_struct; struct uart_port; |
e3e2aaf7d kgdb: add documen... |
39 40 41 |
/** * kgdb_breakpoint - compiled in breakpoint * |
b11e1eca7 kgdb: Fix kernel-... |
42 |
* This will be implemented as a static inline per architecture. This |
e3e2aaf7d kgdb: add documen... |
43 44 45 46 |
* function is called by the kgdb core to execute an architecture * specific trap to cause kgdb to enter the exception processing. * */ |
dc7d55270 kgdb: core |
47 48 49 |
void kgdb_breakpoint(void); extern int kgdb_connected; |
f503b5ae5 x86,kgdb: Add low... |
50 |
extern int kgdb_io_module_registered; |
dc7d55270 kgdb: core |
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
extern atomic_t kgdb_setting_breakpoint; extern atomic_t kgdb_cpu_doing_single_step; extern struct task_struct *kgdb_usethread; extern struct task_struct *kgdb_contthread; enum kgdb_bptype { BP_BREAKPOINT = 0, BP_HARDWARE_BREAKPOINT, BP_WRITE_WATCHPOINT, BP_READ_WATCHPOINT, BP_ACCESS_WATCHPOINT }; enum kgdb_bpstate { BP_UNDEFINED = 0, BP_REMOVED, BP_SET, BP_ACTIVE }; struct kgdb_bkpt { unsigned long bpt_addr; unsigned char saved_instr[BREAK_INSTR_SIZE]; enum kgdb_bptype type; enum kgdb_bpstate state; }; |
534af1082 kgdb,kdb: individ... |
79 80 81 82 83 84 85 86 87 88 89 90 91 |
struct dbg_reg_def_t { char *name; int size; int offset; }; #ifndef DBG_MAX_REG_NUM #define DBG_MAX_REG_NUM 0 #else extern struct dbg_reg_def_t dbg_reg_def[]; extern char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs); extern int dbg_set_reg(int regno, void *mem, struct pt_regs *regs); #endif |
dc7d55270 kgdb: core |
92 93 94 95 96 97 98 99 100 |
#ifndef KGDB_MAX_BREAKPOINTS # define KGDB_MAX_BREAKPOINTS 1000 #endif #define KGDB_HW_BREAKPOINT 1 /* * Functions each KGDB-supporting architecture must provide: */ |
e3e2aaf7d kgdb: add documen... |
101 |
/** |
dc7d55270 kgdb: core |
102 103 104 105 106 107 |
* kgdb_arch_init - Perform any architecture specific initalization. * * This function will handle the initalization of any architecture * specific callbacks. */ extern int kgdb_arch_init(void); |
e3e2aaf7d kgdb: add documen... |
108 |
/** |
dc7d55270 kgdb: core |
109 110 111 112 113 114 |
* kgdb_arch_exit - Perform any architecture specific uninitalization. * * This function will handle the uninitalization of any architecture * specific callbacks, for dynamic registration and unregistration. */ extern void kgdb_arch_exit(void); |
e3e2aaf7d kgdb: add documen... |
115 |
/** |
dc7d55270 kgdb: core |
116 117 118 119 120 121 122 123 |
* pt_regs_to_gdb_regs - Convert ptrace regs to GDB regs * @gdb_regs: A pointer to hold the registers in the order GDB wants. * @regs: The &struct pt_regs of the current process. * * Convert the pt_regs in @regs into the format for registers that * GDB expects, stored in @gdb_regs. */ extern void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs); |
e3e2aaf7d kgdb: add documen... |
124 |
/** |
dc7d55270 kgdb: core |
125 126 127 128 129 130 131 132 133 134 135 136 137 |
* sleeping_thread_to_gdb_regs - Convert ptrace regs to GDB regs * @gdb_regs: A pointer to hold the registers in the order GDB wants. * @p: The &struct task_struct of the desired process. * * Convert the register values of the sleeping process in @p to * the format that GDB expects. * This function is called when kgdb does not have access to the * &struct pt_regs and therefore it should fill the gdb registers * @gdb_regs with what has been saved in &struct thread_struct * thread field during switch_to. */ extern void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p); |
e3e2aaf7d kgdb: add documen... |
138 |
/** |
dc7d55270 kgdb: core |
139 140 141 142 143 144 145 146 |
* gdb_regs_to_pt_regs - Convert GDB regs to ptrace regs. * @gdb_regs: A pointer to hold the registers we've received from GDB. * @regs: A pointer to a &struct pt_regs to hold these values in. * * Convert the GDB regs in @gdb_regs into the pt_regs, and store them * in @regs. */ extern void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs); |
e3e2aaf7d kgdb: add documen... |
147 |
/** |
dc7d55270 kgdb: core |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
* kgdb_arch_handle_exception - Handle architecture specific GDB packets. * @vector: The error vector of the exception that happened. * @signo: The signal number of the exception that happened. * @err_code: The error code of the exception that happened. * @remcom_in_buffer: The buffer of the packet we have read. * @remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into. * @regs: The &struct pt_regs of the current process. * * This function MUST handle the 'c' and 's' command packets, * as well packets to set / remove a hardware breakpoint, if used. * If there are additional packets which the hardware needs to handle, * they are handled here. The code should return -1 if it wants to * process more packets, and a %0 or %1 if it wants to exit from the * kgdb callback. */ extern int kgdb_arch_handle_exception(int vector, int signo, int err_code, char *remcom_in_buffer, char *remcom_out_buffer, struct pt_regs *regs); |
e3e2aaf7d kgdb: add documen... |
168 |
/** |
dc7d55270 kgdb: core |
169 170 171 172 |
* kgdb_roundup_cpus - Get other CPUs into a holding pattern * @flags: Current IRQ state * * On SMP systems, we need to get the attention of the other CPUs |
b11e1eca7 kgdb: Fix kernel-... |
173 |
* and get them into a known state. This should do what is needed |
dc7d55270 kgdb: core |
174 175 176 177 178 179 180 181 182 183 184 |
* to get the other CPUs to call kgdb_wait(). Note that on some arches, * the NMI approach is not used for rounding up all the CPUs. For example, * in case of MIPS, smp_call_function() is used to roundup CPUs. In * this case, we have to make sure that interrupts are enabled before * calling smp_call_function(). The argument to this function is * the flags that will be used when restoring the interrupts. There is * local_irq_save() call before kgdb_roundup_cpus(). * * On non-SMP systems, this is not called. */ extern void kgdb_roundup_cpus(unsigned long flags); |
84c08fd61 kgdb,docs: Update... |
185 186 187 188 189 190 191 192 193 |
/** * kgdb_arch_set_pc - Generic call back to the program counter * @regs: Current &struct pt_regs. * @pc: The new value for the program counter * * This function handles updating the program counter and requires an * architecture specific implementation. */ extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc); |
dc7d55270 kgdb: core |
194 195 196 197 |
/* Optional functions. */ extern int kgdb_validate_break_address(unsigned long addr); extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr); extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle); |
e3e2aaf7d kgdb: add documen... |
198 |
/** |
0b4b3827d x86, kgdb, init: ... |
199 200 201 202 203 204 205 206 207 208 209 |
* kgdb_arch_late - Perform any architecture specific initalization. * * This function will handle the late initalization of any * architecture specific callbacks. This is an optional function for * handling things like late initialization of hw breakpoints. The * default implementation does nothing. */ extern void kgdb_arch_late(void); /** |
dc7d55270 kgdb: core |
210 211 212 213 214 215 216 217 218 219 220 |
* struct kgdb_arch - Describe architecture specific values. * @gdb_bpt_instr: The instruction to trigger a breakpoint. * @flags: Flags for the breakpoint, currently just %KGDB_HW_BREAKPOINT. * @set_breakpoint: Allow an architecture to specify how to set a software * breakpoint. * @remove_breakpoint: Allow an architecture to specify how to remove a * software breakpoint. * @set_hw_breakpoint: Allow an architecture to specify how to set a hardware * breakpoint. * @remove_hw_breakpoint: Allow an architecture to specify how to remove a * hardware breakpoint. |
d7ba979d4 debug_core,x86,bl... |
221 222 |
* @disable_hw_break: Allow an architecture to specify how to disable * hardware breakpoints for a single cpu. |
dc7d55270 kgdb: core |
223 224 225 226 227 228 229 230 231 232 233 234 235 |
* @remove_all_hw_break: Allow an architecture to specify how to remove all * hardware breakpoints. * @correct_hw_break: Allow an architecture to specify how to correct the * hardware debug registers. */ struct kgdb_arch { unsigned char gdb_bpt_instr[BREAK_INSTR_SIZE]; unsigned long flags; int (*set_breakpoint)(unsigned long, char *); int (*remove_breakpoint)(unsigned long, char *); int (*set_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); int (*remove_hw_breakpoint)(unsigned long, int, enum kgdb_bptype); |
d7ba979d4 debug_core,x86,bl... |
236 |
void (*disable_hw_break)(struct pt_regs *regs); |
dc7d55270 kgdb: core |
237 238 239 |
void (*remove_all_hw_break)(void); void (*correct_hw_break)(void); }; |
e3e2aaf7d kgdb: add documen... |
240 |
/** |
dc7d55270 kgdb: core |
241 242 243 244 245 246 247 248 249 250 |
* struct kgdb_io - Describe the interface for an I/O driver to talk with KGDB. * @name: Name of the I/O driver. * @read_char: Pointer to a function that will return one char. * @write_char: Pointer to a function that will write one char. * @flush: Pointer to a function that will flush any pending writes. * @init: Pointer to a function that will initialize the device. * @pre_exception: Pointer to a function that will do any prep work for * the I/O driver. * @post_exception: Pointer to a function that will do any cleanup work * for the I/O driver. |
efe2f29e3 kgdboc,kdb: Allow... |
251 252 |
* @is_console: 1 if the end device is a console 0 if the I/O device is * not a console |
dc7d55270 kgdb: core |
253 254 255 256 257 258 259 260 261 |
*/ struct kgdb_io { const char *name; int (*read_char) (void); void (*write_char) (u8); void (*flush) (void); int (*init) (void); void (*pre_exception) (void); void (*post_exception) (void); |
efe2f29e3 kgdboc,kdb: Allow... |
262 |
int is_console; |
dc7d55270 kgdb: core |
263 264 265 |
}; extern struct kgdb_arch arch_kgdb_ops; |
688b744d8 kgdb: fix signedn... |
266 |
extern unsigned long __weak kgdb_arch_pc(int exception, struct pt_regs *regs); |
dc7d55270 kgdb: core |
267 268 |
extern int kgdb_register_io_module(struct kgdb_io *local_kgdb_io_ops); extern void kgdb_unregister_io_module(struct kgdb_io *local_kgdb_io_ops); |
53197fc49 Separate the gdbs... |
269 |
extern struct kgdb_io *dbg_io_ops; |
dc7d55270 kgdb: core |
270 |
|
688b744d8 kgdb: fix signedn... |
271 |
extern int kgdb_hex2long(char **ptr, unsigned long *long_val); |
55751145d gdbstub: Implemen... |
272 |
extern char *kgdb_mem2hex(char *mem, char *buf, int count); |
dc7d55270 kgdb: core |
273 274 275 |
extern int kgdb_hex2mem(char *buf, char *mem, int count); extern int kgdb_isremovedbreak(unsigned long addr); |
1cee5e35f kgdb: Add the abi... |
276 |
extern void kgdb_schedule_breakpoint(void); |
dc7d55270 kgdb: core |
277 278 279 280 281 |
extern int kgdb_handle_exception(int ex_vector, int signo, int err_code, struct pt_regs *regs); extern int kgdb_nmicallback(int cpu, void *regs); |
d57f078b1 KGDB: Notify GDB ... |
282 |
extern void gdbstub_exit(int status); |
dc7d55270 kgdb: core |
283 284 285 |
extern int kgdb_single_step; extern atomic_t kgdb_active; |
dcc787112 kgdb: core change... |
286 287 |
#define in_dbg_master() \ (raw_smp_processor_id() == atomic_read(&kgdb_active)) |
0b4b3827d x86, kgdb, init: ... |
288 289 |
extern bool dbg_is_early; extern void __init dbg_late_init(void); |
dcc787112 kgdb: core change... |
290 291 |
#else /* ! CONFIG_KGDB */ #define in_dbg_master() (0) |
0b4b3827d x86, kgdb, init: ... |
292 |
#define dbg_late_init() |
dcc787112 kgdb: core change... |
293 |
#endif /* ! CONFIG_KGDB */ |
dc7d55270 kgdb: core |
294 |
#endif /* _KGDB_H_ */ |