Skip to content
Branch: master
Find file History
Permalink
Type Name Latest commit message Commit time
..
Failed to load latest commit information.
Makefile
Makefile.clang Added makefiles for LLVM Clang Feb 17, 2019
Makefile.gcc Added makefiles for LLVM Clang Feb 17, 2019
OLVASSEL.md New version of disassembler Jul 15, 2018
README.md New version of disassembler Jul 15, 2018
dbg.c New tutorials Jan 22, 2018
dbg.h New tutorials Jan 22, 2018
disasm.h Added makefiles for LLVM Clang Feb 17, 2019
gpio.h New tutorials Jan 22, 2018
kernel8.img Clearified mbox call in uart per issue #49 Nov 10, 2018
link.ld New tutorials Jan 22, 2018
main.c New tutorials Jan 22, 2018
mbox.c
mbox.h New tutorials Jan 22, 2018
sprintf.c New tutorials Jan 22, 2018
sprintf.h New tutorials Jan 22, 2018
start.S New tutorials Jan 22, 2018
uart.c Clearified mbox call in uart per issue #49 Nov 10, 2018
uart.h New tutorials Jan 22, 2018

README.md

Tutorial 13 - Debugger

Let's rock by implementing an interactive debugger in our exception handler! :-) Now that we have printf(), it shouldn't be hard.

$ qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial stdio
Synchronous: Breakpoint instruction
> x 
0007FFF0: 13 60 09 00  00 00 00 00  24 10 20 3F  00 00 00 00  .`......$. ?....
> i x30 x30+64 
00080804: D2800000      movz      x0, #0x0
00080808: 94003D1C      bl        0x8FC78
0008080C: 94003ECF      bl        0x90348
00080810: D69F03E0      eret      
00080814: D503201F        27 x nop
>

Dbg.h, dbg.c

A very minimal and simple debugger (~300 lines in C).

breakpoint a newly defined keyword. We can use this anywhere in our code where we want to invoke the debugger

dbg_decodeexc() similar to exc_handler in tutorial 11, decodes the cause of the exception and prints it

dbg_getline() yep, another low level library we're missing. We need a way to allow the user to edit command line and return it as a string when he/she presses Enter. A minimal implementation, as usual

dbg_getoffs() this function parses the command line for arguments. Accepts hex, decimal number in "register+/-offset" format

dbg_main() the main loop of the debugger.

Disasm.h

Because it's small (~64k), yet supports all ARMv8.2 instructions, only depends on sprintf() (which we have now), I decided to use the Universal Disassembler for this tutorial. If you don't want to compile a disassembler into your debugger, simply set the DISASSEMBLER define 0 in top of dbg.c.

Start

Our _vector table looks different. We have to save registers in memory with dbg_saveregs, print out the cause of the exception, and call our mini-debugger's main loop.

Main

We'll test our shiny new breakpoint keyword in C.

You can’t perform that action at this time.