| This page describes the process of obtaining diagnostic information | |
| from SeaBIOS and for reporting problems. | |
| Diagnostic information | |
| ====================== | |
| SeaBIOS has the ability to output diagnostic messages. This is | |
| implemented in the code via calls to the "dprintf()" C function. | |
| On QEMU these messages are written to a special debug port. One can | |
| view these messages by adding '-chardev stdio,id=seabios -device | |
| isa-debugcon,iobase=0x402,chardev=seabios' to the QEMU command line. | |
| Once this is done, one should see status messages on the console. | |
| On coreboot these messages are generally written to the "cbmem" | |
| console (CONFIG_DEBUG_COREBOOT). If SeaBIOS launches a Linux operating | |
| system, one can obtain the cbmem tool from the coreboot repository and | |
| run "cbmem -c" to view the SeaBIOS diagnostic messages. | |
| Additionally, if a serial port is available, one may compile SeaBIOS | |
| to send the diagnostic messages to the serial port. See the SeaBIOS | |
| CONFIG_DEBUG_SERIAL option. | |
| Trouble reporting | |
| ================= | |
| If you are experiencing problems with SeaBIOS, it's useful to increase | |
| the debugging level. This is done by running "make menuconfig" and | |
| setting CONFIG_DEBUG_LEVEL to a higher value. A debug level of 8 will | |
| show a lot of diagnostic information without flooding the serial port | |
| (levels above 8 will frequently cause too much data). | |
| To report an issue, please collect the serial boot log with SeaBIOS | |
| set to a debug level of 8 and forward the full log along with a | |
| description of the problem to the SeaBIOS [mailing | |
| list](Mailinglist.md). | |
| Timing debug messages | |
| ===================== | |
| The SeaBIOS repository has a tool (**scripts/readserial.py**) that can | |
| timestamp each diagnostic message produced. The timestamps can provide | |
| some additional information on how long internal processes take. It | |
| also provides a simple profiling mechanism. | |
| The tool can be used on coreboot builds that have diagnostic messages | |
| sent to a serial port. Make sure SeaBIOS is configured with | |
| CONFIG_DEBUG_SERIAL and run the following on the host receiving serial | |
| output: | |
| `/path/to/seabios/scripts/readserial.py /dev/ttyS0 115200` | |
| Update the above command with the appropriate serial device and baud | |
| rate. | |
| The tool can also timestamp the messages from the QEMU debug port. To | |
| use with QEMU run the following: | |
| ``` | |
| mkfifo qemudebugpipe | |
| qemu -chardev pipe,path=qemudebugpipe,id=seabios -device isa-debugcon,iobase=0x402,chardev=seabios ... | |
| ``` | |
| And then in another session: | |
| `/path/to/seabios/scripts/readserial.py -nf qemudebugpipe` | |
| The mkfifo command only needs to be run once to create the pipe file. | |
| When readserial.py is running, it shows a timestamp with millisecond | |
| precision of the amount of time since the start of the log. If one | |
| presses the "enter" key in the readserial.py session it will add a | |
| blank line to the screen and also reset the time back to zero. The | |
| readserial.py program also keeps a log of all output in files that | |
| look like "seriallog-YYYYMMDD_HHMMSS.log". | |
| Debugging with gdb on QEMU | |
| ========================== | |
| One can use gdb with QEMU to debug system images. To do this, add '-s | |
| -S' to the QEMU command line. For example: | |
| `qemu -bios out/bios.bin -fda myfdimage.img -s -S` | |
| Then, in another session, run gdb with either out/rom16.o (to debug | |
| bios 16bit code) or out/rom.o (to debug bios 32bit code). For example: | |
| `gdb out/rom16.o` | |
| Once in gdb, use the command `target remote localhost:1234` to have | |
| gdb connect to QEMU. See the QEMU documentation for more information | |
| on using gdb and QEMU in this mode. | |
| When debugging 16bit code it is necessary to load the 16bit symbols | |
| twice in order for gdb to properly handle break points. To do this, | |
| run the following command `objcopy --adjust-vma 0xf0000 out/rom16.o | |
| rom16offset.o` and then run the following in gdb: | |
| ``` | |
| set architecture i8086 | |
| add-symbol-file rom16offset.o 0 | |
| ``` | |
| To debug a VGA BIOS image, run `gdb out/vgarom.o`, create a | |
| vgaromoffset.o file with offset 0xc0000, add use the gdb | |
| command `add-symbol-file out/vgaromoffset.o 0` to load the 16bit VGA | |
| BIOS symbols twice. | |
| If debugging the 32bit SeaBIOS initialization code with gdb, note that | |
| SeaBIOS does self relocation by default. This relocation will alter | |
| the location of initialization code symbols. Disable | |
| CONFIG_RELOCATE_INIT to prevent SeaBIOS from doing this. |