123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- ====================
- DEBUGGING FR-V LINUX
- ====================
- The kernel contains a GDB stub that talks GDB remote protocol across a serial
- port. This permits GDB to single step through the kernel, set breakpoints and
- trap exceptions that happen in kernel space and interrupt execution. It also
- permits the NMI interrupt button or serial port events to jump the kernel into
- the debugger.
- On the CPUs that have on-chip UARTs (FR400, FR403, FR405, FR555), the
- GDB stub hijacks a serial port for its own purposes, and makes it
- generate level 15 interrupts (NMI). The kernel proper cannot see the serial
- port in question under these conditions.
- On the MB93091-VDK CPU boards, the GDB stub uses UART1, which would otherwise
- be /dev/ttyS1. On the MB93093-PDK, the GDB stub uses UART0. Therefore, on the
- PDK there is no externally accessible serial port and the serial port to
- which the touch screen is attached becomes /dev/ttyS0.
- Note that the GDB stub runs entirely within CPU debug mode, and so should not
- incur any exceptions or interrupts whilst it is active. In particular, note
- that the clock will lose time since it is implemented in software.
- ==================
- KERNEL PREPARATION
- ==================
- Firstly, a debuggable kernel must be built. To do this, unpack the kernel tree
- and copy the configuration that you wish to use to .config. Then reconfigure
- the following things on the "Kernel Hacking" tab:
- (*) "Include debugging information"
- Set this to "Y". This causes all C and Assembly files to be compiled
- to include debugging information.
- (*) "In-kernel GDB stub"
- Set this to "Y". This causes the GDB stub to be compiled into the
- kernel.
- (*) "Immediate activation"
- Set this to "Y" if you want the GDB stub to activate as soon as possible
- and wait for GDB to connect. This allows you to start tracing right from
- the beginning of start_kernel() in init/main.c.
- (*) "Console through GDB stub"
- Set this to "Y" if you wish to be able to use "console=gdb0" on the
- command line. That tells the kernel to pass system console messages to
- GDB (which then prints them on its standard output). This is useful when
- debugging the serial drivers that'd otherwise be used to pass console
- messages to the outside world.
- Then build as usual, download to the board and execute. Note that if
- "Immediate activation" was selected, then the kernel will wait for GDB to
- attach. If not, then the kernel will boot immediately and GDB will have to
- interrupt it or wait for an exception to occur before doing anything with
- the kernel.
- =========================
- KERNEL DEBUGGING WITH GDB
- =========================
- Set the serial port on the computer that's going to run GDB to the appropriate
- baud rate. Assuming the board's debug port is connected to ttyS0/COM1 on the
- computer doing the debugging:
- stty -F /dev/ttyS0 115200
- Then start GDB in the base of the kernel tree:
- frv-uclinux-gdb linux [uClinux]
- Or:
- frv-uclinux-gdb vmlinux [MMU linux]
- When the prompt appears:
- GNU gdb frv-031024
- Copyright 2003 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License, and you are
- welcome to change it and/or distribute copies of it under certain conditions.
- Type "show copying" to see the conditions.
- There is absolutely no warranty for GDB. Type "show warranty" for details.
- This GDB was configured as "--host=i686-pc-linux-gnu --target=frv-uclinux"...
- (gdb)
- Attach to the board like this:
- (gdb) target remote /dev/ttyS0
- Remote debugging using /dev/ttyS0
- start_kernel () at init/main.c:395
- (gdb)
- This should show the appropriate lines from the source too. The kernel can
- then be debugged almost as if it's any other program.
- ===============================
- INTERRUPTING THE RUNNING KERNEL
- ===============================
- The kernel can be interrupted whilst it is running, causing a jump back to the
- GDB stub and the debugger:
- (*) Pressing Ctrl-C in GDB. This will cause GDB to try and interrupt the
- kernel by sending an RS232 BREAK over the serial line to the GDB
- stub. This will (mostly) immediately interrupt the kernel and return it
- to the debugger.
- (*) Pressing the NMI button on the board will also cause a jump into the
- debugger.
- (*) Setting a software breakpoint. This sets a break instruction at the
- desired location which the GDB stub then traps the exception for.
- (*) Setting a hardware breakpoint. The GDB stub is capable of using the IBAR
- and DBAR registers to assist debugging.
- Furthermore, the GDB stub will intercept a number of exceptions automatically
- if they are caused by kernel execution. It will also intercept BUG() macro
- invocation.
|