|
|
@ -19,20 +19,19 @@ end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
define vecstate |
|
|
|
define vecstate |
|
|
|
set $icsr = *(uint32_t *)0xe000ed04 |
|
|
|
set $icsr = *(unsigned *)0xe000ed04 |
|
|
|
set $vect = $icsr & 0x1ff |
|
|
|
set $vect = $icsr & 0x1ff |
|
|
|
set $pend = ($icsr & 0x1ff000) >> 12 |
|
|
|
set $pend = ($icsr & 0x1ff000) >> 12 |
|
|
|
set $shcsr = *(uint32_t *)0xe000ed24 |
|
|
|
set $shcsr = *(unsigned *)0xe000ed24 |
|
|
|
set $cfsr = *(uint32_t *)0xe000ed28 |
|
|
|
set $cfsr = *(unsigned *)0xe000ed28 |
|
|
|
set $mmfsr = $cfsr & 0xff |
|
|
|
set $mmfsr = $cfsr & 0xff |
|
|
|
set $bfsr = ($cfsr >> 8) & 0xff |
|
|
|
set $bfsr = ($cfsr >> 8) & 0xff |
|
|
|
set $ufsr = ($cfsr >> 16) & 0xffff |
|
|
|
set $ufsr = ($cfsr >> 16) & 0xffff |
|
|
|
set $hfsr = *(uint32_t *)0xe000ed2c |
|
|
|
set $hfsr = *(unsigned *)0xe000ed2c |
|
|
|
set $bfar = *(uint32_t *)0xe000ed38 |
|
|
|
set $bfar = *(unsigned *)0xe000ed38 |
|
|
|
set $mmfar = *(uint32_t *)0xe000ed34 |
|
|
|
set $mmfar = *(unsigned *)0xe000ed34 |
|
|
|
|
|
|
|
|
|
|
|
# XXX Currently, rather than look at $vect, we just decode the |
|
|
|
if $vect < 15 |
|
|
|
# fault status registers directly. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if $hfsr != 0 |
|
|
|
if $hfsr != 0 |
|
|
|
printf "HardFault:" |
|
|
|
printf "HardFault:" |
|
|
@ -40,7 +39,7 @@ define vecstate |
|
|
|
printf " due to vector table read fault\n" |
|
|
|
printf " due to vector table read fault\n" |
|
|
|
end |
|
|
|
end |
|
|
|
if $hfsr & (1<<30) |
|
|
|
if $hfsr & (1<<30) |
|
|
|
printf " forced ue to escalated or disabled configurable fault (see below)\n" |
|
|
|
printf " forced due to escalated or disabled configurable fault (see below)\n" |
|
|
|
end |
|
|
|
end |
|
|
|
if $hfsr & (1<<31) |
|
|
|
if $hfsr & (1<<31) |
|
|
|
printf " due to an unexpected debug event\n" |
|
|
|
printf " due to an unexpected debug event\n" |
|
|
@ -115,24 +114,37 @@ define vecstate |
|
|
|
end |
|
|
|
end |
|
|
|
printf "\n" |
|
|
|
printf "\n" |
|
|
|
end |
|
|
|
end |
|
|
|
if ((uint32_t)$lr & 0xf0000000) == 0xf0000000 |
|
|
|
else |
|
|
|
|
|
|
|
if $vect >= 15 |
|
|
|
|
|
|
|
printf "Handling vector %u\n", $vect |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
if ((unsigned)$lr & 0xf0000000) == 0xf0000000 |
|
|
|
if ($lr & 1) |
|
|
|
if ($lr & 1) |
|
|
|
set $frame_ptr = (uint32_t *)$msp |
|
|
|
printf "exception frame is on MSP\n" |
|
|
|
|
|
|
|
#set $frame_ptr = (unsigned *)$msp |
|
|
|
|
|
|
|
set $frame_ptr = (unsigned *)$sp |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
printf "exception frame is on PSP, backtrace may not be possible\n" |
|
|
|
|
|
|
|
#set $frame_ptr = (unsigned *)$psp |
|
|
|
|
|
|
|
set $frame_ptr = (unsigned *)$sp |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
if $lr & 0x10 |
|
|
|
|
|
|
|
set $fault_sp = $frame_ptr + (8 * 4) |
|
|
|
else |
|
|
|
else |
|
|
|
set $frame_ptr = (uint32_t *)$psp |
|
|
|
set $fault_sp = $frame_ptr + (26 * 4) |
|
|
|
end |
|
|
|
end |
|
|
|
printf " r0: %08x r1: %08x r2: %08x r3: %08x\n, $frame_ptr[0], $frame_ptr[1], $frame_ptr[2], $frame_ptr[3] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf " r0: %08x r1: %08x r2: %08x r3: %08x\n", $frame_ptr[0], $frame_ptr[1], $frame_ptr[2], $frame_ptr[3] |
|
|
|
printf " r4: %08x r5: %08x r6: %08x r7: %08x\n", $r4, $r5, $r6, $r7 |
|
|
|
printf " r4: %08x r5: %08x r6: %08x r7: %08x\n", $r4, $r5, $r6, $r7 |
|
|
|
printf " r8: %08x r9: %08x r10: %08x r11: %08x\n", $r8, $r9, $r10, $r11 |
|
|
|
printf " r8: %08x r9: %08x r10: %08x r11: %08x\n", $r8, $r9, $r10, $r11 |
|
|
|
printf " r12: $08x lr: %08x pc: %08xx PSR: %08x\n", $frame_ptr[4], $frame_ptr[5], $frame_ptr[6], $frame_ptr[7] |
|
|
|
printf " r12: %08x\n", $frame_ptr[4] |
|
|
|
|
|
|
|
printf " sp: %08x lr: %08x pc: %08x PSR: %08x\n", $fault_sp, $frame_ptr[5], $frame_ptr[6], $frame_ptr[7] |
|
|
|
|
|
|
|
|
|
|
|
# Swap to the context of the faulting code and try to print a backtrace |
|
|
|
# Swap to the context of the faulting code and try to print a backtrace |
|
|
|
set $saved_sp = $sp |
|
|
|
set $saved_sp = $sp |
|
|
|
if $lr & 0x10 |
|
|
|
set $sp = $fault_sp |
|
|
|
set $sp = $frame_ptr + (8 * 4) |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
set $sp = $frame_ptr + (26 * 4) |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
set $saved_lr = $lr |
|
|
|
set $saved_lr = $lr |
|
|
|
set $lr = $frame_ptr[5] |
|
|
|
set $lr = $frame_ptr[5] |
|
|
|
set $saved_pc = $pc |
|
|
|
set $saved_pc = $pc |
|
|
@ -142,7 +154,7 @@ define vecstate |
|
|
|
set $lr = $saved_lr |
|
|
|
set $lr = $saved_lr |
|
|
|
set $pc = $saved_pc |
|
|
|
set $pc = $saved_pc |
|
|
|
else |
|
|
|
else |
|
|
|
printf "(not currently in exception state)\n" |
|
|
|
printf "(not currently in exception handler)\n" |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|