Kernel debug
QNX SDP8.0Building Embedded SystemsConfigurationDeveloper
The kernel uses the debug callouts when it needs to print out some internal debugging information or encounters a fault.
The kernel uses these callouts to interact with a serial port, console, or other
device to output debug or instrumentation information. For example, a
display_msg command in a boot image startup script can make
procnto use a debug kernel callout to output a message
like the following one:
Running default qnxbasedma.build...We recommend that when working on a startup program, you start by getting a debug kernel callout working. The ability to output messages to a device helps you debug code as you add or modify it.
Kernel callouts
- break_detect()
- Check if a break has been detected.
- display_char()
- Receive a
charfrom the kernel and output it to a device. - poll_key()
- Pass a
char, if available, to the kernel. If nocharis available, pass back-1. - spare()
- Currently unused by the kernel; reserved for future usage.
Only the display_char() callout is required; the others are optional.
Example
This kernel callout takes a character passed in through register r4
and outputs it to the serial controller.
The CALLOUT_START macro's third argument invokes the
patch_debug() routine. This routine replaces the
0x1234 and 0x5678 memory locations with
the base address of the serial controller register.
The lis (load immediate and shift) and ori
(OR immediate) instructions load the base address of the device registers into
r6:
CALLOUT_START display_char_5200, 0, patch_debug
lis %r6,0x1234
ori %r6,%r6,0x5678Disable interrupts:
loadi %r9,PPC_MSR_EE
mfmsr %r8
andc %r9,%r8,%r9
mtmsr %r9
isyncLoop until the Transmit Ready bit has been set:
1:
lwz %r0,MGT5200_PSC_SR(%r6)
andis. %r0,%r0,MGT5200_PSC_SR_TXRDY
beq 1bStore the byte (the
char passed in by the kernel in
r4) in the Transmit Byte register:
stb %r4,MGT5200_PSC_TB(%r6)
eieioRe-enable interrupts, then branch to the link register and continue executing at the
instruction that follows the call to this routine:
mtmsr %r8
isync
blrEnd of callout marker:
CALLOUT_END display_char_5200Note:
The startup code must look after some specific debug tasks in addition to those
handled by the kernel callouts (see
Debug startup tasksin the Startup Programs chapter).
Page updated:
