Using KGDB and The KGDB Internals: Jason Wessel
Using KGDB and The KGDB Internals: Jason Wessel
Jason Wessel
[email protected]
Tom Rini
[email protected]
Amit S. Kale
[email protected]
Using kgdb and the kgdb Internals by Jason Wessel by Tom Rini by Amit S. Kale Copyright 2008 Wind River Systems, Inc. Copyright 2004-2005 MontaVista Software, Inc. Copyright 2004 Amit S. Kale
This le 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.
Table of Contents
1. Introduction............................................................................................................................................1 2. Compiling a kernel.................................................................................................................................2 3. Enable kgdb for debugging ...................................................................................................................3 3.1. Kernel parameter: kgdbwait ........................................................................................................3 3.2. Kernel parameter: kgdboc ...........................................................................................................3 3.2.1. Using kgdboc..................................................................................................................3 3.3. Kernel parameter: kgdbcon .........................................................................................................4 4. Connecting gdb ......................................................................................................................................6 5. kgdb Test Suite .......................................................................................................................................7 6. KGDB Internals .....................................................................................................................................8 6.1. Architecture Specics .................................................................................................................8 kgdb_skipexception ..................................................................................................................9 kgdb_post_primary_code .......................................................................................................10 kgdb_disable_hw_debug ........................................................................................................11 kgdb_breakpoint .....................................................................................................................12 kgdb_arch_init........................................................................................................................12 kgdb_arch_exit .......................................................................................................................13 pt_regs_to_gdb_regs...............................................................................................................14 sleeping_thread_to_gdb_regs .................................................................................................15 gdb_regs_to_pt_regs...............................................................................................................15 kgdb_arch_handle_exception .................................................................................................16 kgdb_roundup_cpus ...............................................................................................................17 struct kgdb_arch .....................................................................................................................18 struct kgdb_io .........................................................................................................................19 6.2. kgdboc internals ........................................................................................................................21 7. Credits...................................................................................................................................................22
iii
Chapter 1. Introduction
kgdb is a source level debugger for linux kernel. It is used along with gdb to debug a linux kernel. The expectation is that gdb can be used to "break in" to the kernel to inspect memory, variables and look through call stack information similar to what an application developer would use gdb for. It is possible to place breakpoints in kernel code and perform some limited execution stepping. Two machines are required for using kgdb. One of these machines is a development machine and the other is a test machine. The kernel to be debugged runs on the test machine. The development machine runs an instance of gdb against the vmlinux le which contains the symbols (not boot image such as bzImage, zImage, uImage...). In gdb the developer species the connection parameters and connects to kgdb. The type of connection a developer makes with gdb depends on the availability of kgdb I/O modules compiled as builtins or kernel modules in the test machines kernel.
kgdboc=<tty-device>,[baud]
Chapter 3. Enable kgdb for debugging The example here would be if your console port was typically ttyS0, you would use something like kgdboc=ttyS0,115200 or on the ARM Versatile AB you would likely use
kgdboc=ttyAMA0,115200
2. From sysfs
NOTE: Kgdboc does not support interrupting the target via the gdb remote protocol. You must manually send a sysrq-g unless you have a proxy that splits console output to a terminal problem and has a separate port for the debugger to connect to that sends the sysrq-g for you. When using kgdboc with no debugger proxy, you can end up connecting the debugger for one of two entry points. If an exception occurs after you have loaded kgdboc a message should print on the console stating it is waiting for the debugger. In case you disconnect your terminal program and then connect the debugger in its place. If you want to interrupt the target system and forcibly enter a debug session you have to issue a Sysrq sequence and then type the letter g. Then you disconnect the terminal session and connect gdb. Your options if you dont like this are to hack gdb to send the sysrq-g for you as well as on the initial connect, or to use a debugger proxy that allows an unmodied gdb to do the debugging.
kgdbcon
NOTE: If you do this after you congure the kgdb I/O driver, the setting will not take effect until the next point the I/O is recongured.
Chapter 3. Enable kgdb for debugging IMPORTANT NOTE: Using this option with kgdb over the console (kgdboc) is not supported.
Once connected, you can debug a kernel the way you would debug an application program. If you are having problems connecting or something is going seriously wrong while debugging, it will most often be the case that you want to enable gdb to be verbose about its target communications. You do this prior to issuing the target remote command by typing in: set remote debug 1
All the logic to implement the gdb serial protocol A generic OS exception handler which includes syncing the processors into a stopped state on an multi cpu system. The API to talk to the kgdb I/O drivers The API to make calls to the arch specic kgdb implementation The logic to perform safe memory reads and writes to memory while using the debugger A full implementation for software breakpoints unless overridden by the arch
2. kgdb arch specic implementation This implementation is generally found in arch/*/kernel/kgdb.c. As an example, arch/x86/kernel/kgdb.c contains the specics to implement HW breakpoint as well as the initialization to dynamically register and unregister for the trap handlers on this architecture. The arch specic portion implements:
contains an arch specic trap catcher which invokes kgdb_handle_exception() to start kgdb about doing its work translation to and from gdb specic packet format to pt_regs Registration and unregistration of architecture specic trap hooks Any special exception handling and cleanup NMI exception handling and cleanup (optional)HW breakpoints
3. kgdb I/O driver Each kgdb I/O driver has to provide an implemenation for the following:
dynamic conguration and kgdb hook registration calls read and write character interface A cleanup handler for unconguring from the kgdb core (optional) Early debug methodology
Any given kgdb I/O driver has to operate very closely with the hardware and must do it in such a way that does not enable interrupts or change other parts of the system context without completely restoring them. The kgdb core will repeatedly "poll" a kgdb I/O driver for characters when it needs input. The I/O driver is expected to return immediately if there is no data available. Doing so allows for the future possibility to touch watch dog hardware in such a way as to have a target system not reset when these are enabled.
If you are intent on adding kgdb architecture specic support for a new architecture, the architecture should dene HAVE_ARCH_KGDB in the architecture specic Kcong le. This will enable kgdb for the architecture, and at that point you must create an architecture specic kgdb implementation. There are a few ags which must be set on every architecture in their <asm/kgdb.h> le. These are:
NUMREGBYTES: The size in bytes of all of the registers, so that we can ensure they will all t into a packet. BUFMAX: The size in bytes of the buffer GDB will read into. This must be larger than NUMREGBYTES. CACHE_FLUSH_IS_SAFE: Set to 1 if it is always safe to call ush_cache_range or ush_icache_range. On some architectures, these functions may not be safe to call on SMP since we keep other CPUs in a holding pattern.
There are also the following functions for the common backend, found in kernel/kgdb.c, that must be supplied by the architecture-specic backend unless marked as (optional), in which case a default function maybe used if the architecture does not need to provide a specic implementation.
kgdb_skipexception
LINUX
Name
kgdb_skipexception (optional) exit kgdb_handle_exception early
Synopsis
int kgdb_skipexception (int exception, struct pt_regs * regs);
Arguments
exception
Description
On some architectures it is required to skip a breakpoint exception when it occurs after a breakpoint has been removed. This can be implemented in the architecture specic portion of for kgdb.
kgdb_post_primary_code
LINUX
Kernel Hackers ManualApril 2009
Name
kgdb_post_primary_code (optional) Save error vector/code numbers.
Synopsis
void kgdb_post_primary_code (struct pt_regs * regs, int e_vector, int err_code);
10
Arguments
regs
Original pt_regs.
e_vector
Description
This is usually needed on architectures which support SMP and KGDB. This function is called after all the secondary cpus have been put to a know spin state and the primary CPU has control over KGDB.
kgdb_disable_hw_debug
LINUX
Kernel Hackers ManualApril 2009
Name
kgdb_disable_hw_debug (optional) Disable hardware debugging hook
Synopsis
void kgdb_disable_hw_debug (struct pt_regs * regs);
Arguments
regs
11
Description
This function will be called if the particular architecture must disable hardware debugging while it is processing gdb packets or handling exception.
kgdb_breakpoint
LINUX
Kernel Hackers ManualApril 2009
Name
kgdb_breakpoint compiled in breakpoint
Synopsis
void kgdb_breakpoint ( void);
Arguments
void
no arguments
Description
This will be impelmented a static inline per architecture. This function is called by the kgdb core to execute an architecture specic trap to cause kgdb to enter the exception processing.
kgdb_arch_init
LINUX
12
Name
kgdb_arch_init Perform any architecture specic initalization.
Synopsis
int kgdb_arch_init ( void);
Arguments
void
no arguments
Description
This function will handle the initalization of any architecture specic callbacks.
kgdb_arch_exit
LINUX
Kernel Hackers ManualApril 2009
Name
kgdb_arch_exit Perform any architecture specic uninitalization.
Synopsis
void kgdb_arch_exit ( void);
13
Arguments
void
no arguments
Description
This function will handle the uninitalization of any architecture specic callbacks, for dynamic registration and unregistration.
pt_regs_to_gdb_regs
LINUX
Kernel Hackers ManualApril 2009
Name
pt_regs_to_gdb_regs Convert ptrace regs to GDB regs
Synopsis
void pt_regs_to_gdb_regs (unsigned long * gdb_regs, struct pt_regs * regs);
Arguments
gdb_regs
14
Description
Convert the pt_regs in regs into the format for registers that GDB expects, stored in gdb_regs.
sleeping_thread_to_gdb_regs
LINUX
Kernel Hackers ManualApril 2009
Name
sleeping_thread_to_gdb_regs Convert ptrace regs to GDB regs
Synopsis
void sleeping_thread_to_gdb_regs (unsigned long * gdb_regs, struct task_struct * p);
Arguments
gdb_regs
Description
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 ll the gdb registers gdb_regs with what has been saved in struct thread_struct thread eld during switch_to.
15
gdb_regs_to_pt_regs
LINUX
Kernel Hackers ManualApril 2009
Name
gdb_regs_to_pt_regs Convert GDB regs to ptrace regs.
Synopsis
void gdb_regs_to_pt_regs (unsigned long * gdb_regs, struct pt_regs * regs);
Arguments
gdb_regs
Description
Convert the GDB regs in gdb_regs into the pt_regs, and store them in regs.
kgdb_arch_handle_exception
LINUX
Kernel Hackers ManualApril 2009
Name
kgdb_arch_handle_exception Handle architecture specic GDB packets.
16
Synopsis
int kgdb_arch_handle_exception (int vector, int signo, int err_code, char * remcom_in_buffer, char * remcom_out_buffer, struct pt_regs * regs);
Arguments
vector
Description
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.
kgdb_roundup_cpus
LINUX
17
Name
kgdb_roundup_cpus Get other CPUs into a holding pattern
Synopsis
void kgdb_roundup_cpus (unsigned long flags);
Arguments
flags
Description
On SMP systems, we need to get the attention of the other CPUs and get them be in a known state. This should do what is needed 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 ags 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.
struct kgdb_arch
LINUX
Kernel Hackers ManualApril 2009
Name
struct kgdb_arch Describe architecture specic values.
18
Synopsis
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); void (* remove_all_hw_break) (void); void (* correct_hw_break) (void); };
Members
gdb_bpt_instr[BREAK_INSTR_SIZE] The instruction to trigger a breakpoint. ags 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. 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.
19
struct kgdb_io
LINUX
Kernel Hackers ManualApril 2009
Name
struct kgdb_io Describe the interface for an I/O driver to talk with KGDB.
Synopsis
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); };
Members
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. ush Pointer to a function that will ush 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.
20
Chapter 6. KGDB Internals post_exception Pointer to a function that will do any cleanup work for the I/O driver.
Any implementation specics around creating a polling driver use the #ifdef CONFIG_CONSOLE_POLL, as shown above. Keep in mind that polling hooks have to be implemented in such a way that they can be called from an atomic context and have to restore the state of the uart chip on return such that the system can return to normal when the debugger detaches. You need to be very careful with any kind of lock you consider, because failing here is most going to mean pressing the reset button.
21
Chapter 7. Credits
The following people have contributed to this document: 1. Amit Kale<[email protected]> 2. Tom Rini<[email protected]> In March 2008 this document was completely rewritten by:
Jason Wessel<[email protected]>
22