aboutsummaryrefslogtreecommitdiff
path: root/Debug
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-03-02 22:17:43 -0800
committerpx4dev <px4@purgatory.org>2013-03-02 22:17:43 -0800
commit42694a5736f0b4493318f0d1c03cab70752ddec7 (patch)
tree01e34a97aabb450b010bea355fbc7836c8bbc7d3 /Debug
parent72a8ba074e39c385be51a5be44b907d65ba0a2d0 (diff)
downloadpx4-firmware-42694a5736f0b4493318f0d1c03cab70752ddec7.tar.gz
px4-firmware-42694a5736f0b4493318f0d1c03cab70752ddec7.tar.bz2
px4-firmware-42694a5736f0b4493318f0d1c03cab70752ddec7.zip
Make some improvements to the ARMv7M fault decode logic.
Diffstat (limited to 'Debug')
-rw-r--r--Debug/ARMv7M206
1 files changed, 109 insertions, 97 deletions
diff --git a/Debug/ARMv7M b/Debug/ARMv7M
index 3d96da682..803d96453 100644
--- a/Debug/ARMv7M
+++ b/Debug/ARMv7M
@@ -19,120 +19,132 @@ end
define vecstate
- set $icsr = *(uint32_t *)0xe000ed04
+ set $icsr = *(unsigned *)0xe000ed04
set $vect = $icsr & 0x1ff
set $pend = ($icsr & 0x1ff000) >> 12
- set $shcsr = *(uint32_t *)0xe000ed24
- set $cfsr = *(uint32_t *)0xe000ed28
+ set $shcsr = *(unsigned *)0xe000ed24
+ set $cfsr = *(unsigned *)0xe000ed28
set $mmfsr = $cfsr & 0xff
set $bfsr = ($cfsr >> 8) & 0xff
set $ufsr = ($cfsr >> 16) & 0xffff
- set $hfsr = *(uint32_t *)0xe000ed2c
- set $bfar = *(uint32_t *)0xe000ed38
- set $mmfar = *(uint32_t *)0xe000ed34
+ set $hfsr = *(unsigned *)0xe000ed2c
+ set $bfar = *(unsigned *)0xe000ed38
+ set $mmfar = *(unsigned *)0xe000ed34
- # XXX Currently, rather than look at $vect, we just decode the
- # fault status registers directly.
+ if $vect < 15
- if $hfsr != 0
- printf "HardFault:"
- if $hfsr & (1<<1)
- printf " due to vector table read fault\n"
+ if $hfsr != 0
+ printf "HardFault:"
+ if $hfsr & (1<<1)
+ printf " due to vector table read fault\n"
+ end
+ if $hfsr & (1<<30)
+ printf " forced due to escalated or disabled configurable fault (see below)\n"
+ end
+ if $hfsr & (1<<31)
+ printf " due to an unexpected debug event\n"
+ end
+ end
+ if $mmfsr != 0
+ printf "MemManage:"
+ if $mmfsr & (1<<5)
+ printf " during lazy FP state save"
+ end
+ if $mmfsr & (1<<4)
+ printf " during exception entry"
+ end
+ if $mmfsr & (1<<3)
+ printf " during exception return"
+ end
+ if $mmfsr & (1<<0)
+ printf " during data access"
+ end
+ if $mmfsr & (1<<0)
+ printf " during instruction prefetch"
+ end
+ if $mmfsr & (1<<7)
+ printf " accessing 0x%08x", $mmfar
+ end
+ printf "\n"
+ end
+ if $bfsr != 0
+ printf "BusFault:"
+ if $bfsr & (1<<2)
+ printf " (imprecise)"
+ end
+ if $bfsr & (1<<1)
+ printf " (precise)"
+ end
+ if $bfsr & (1<<5)
+ printf " during lazy FP state save"
+ end
+ if $bfsr & (1<<4)
+ printf " during exception entry"
+ end
+ if $bfsr & (1<<3)
+ printf " during exception return"
+ end
+ if $bfsr & (1<<0)
+ printf " during instruction prefetch"
+ end
+ if $bfsr & (1<<7)
+ printf " accessing 0x%08x", $bfar
+ end
+ printf "\n"
+ end
+ if $ufsr != 0
+ printf "UsageFault"
+ if $ufsr & (1<<9)
+ printf " due to divide-by-zero"
+ end
+ if $ufsr & (1<<8)
+ printf " due to unaligned memory access"
+ end
+ if $ufsr & (1<<3)
+ printf " due to access to disabled/absent coprocessor"
+ end
+ if $ufsr & (1<<2)
+ printf " due to a bad EXC_RETURN value"
+ end
+ if $ufsr & (1<<1)
+ printf " due to bad T or IT bits in EPSR"
+ end
+ if $ufsr & (1<<0)
+ printf " due to executing an undefined instruction"
+ end
+ printf "\n"
end
- if $hfsr & (1<<30)
- printf " forced ue to escalated or disabled configurable fault (see below)\n"
- end
- if $hfsr & (1<<31)
- printf " due to an unexpected debug event\n"
- end
- end
- if $mmfsr != 0
- printf "MemManage:"
- if $mmfsr & (1<<5)
- printf " during lazy FP state save"
- end
- if $mmfsr & (1<<4)
- printf " during exception entry"
- end
- if $mmfsr & (1<<3)
- printf " during exception return"
- end
- if $mmfsr & (1<<0)
- printf " during data access"
- end
- if $mmfsr & (1<<0)
- printf " during instruction prefetch"
- end
- if $mmfsr & (1<<7)
- printf " accessing 0x%08x", $mmfar
- end
- printf "\n"
- end
- if $bfsr != 0
- printf "BusFault:"
- if $bfsr & (1<<2)
- printf " (imprecise)"
- end
- if $bfsr & (1<<1)
- printf " (precise)"
- end
- if $bfsr & (1<<5)
- printf " during lazy FP state save"
- end
- if $bfsr & (1<<4)
- printf " during exception entry"
- end
- if $bfsr & (1<<3)
- printf " during exception return"
- end
- if $bfsr & (1<<0)
- printf " during instruction prefetch"
- end
- if $bfsr & (1<<7)
- printf " accessing 0x%08x", $bfar
- end
- printf "\n"
- end
- if $ufsr != 0
- printf "UsageFault"
- if $ufsr & (1<<9)
- printf " due to divide-by-zero"
- end
- if $ufsr & (1<<8)
- printf " due to unaligned memory access"
- end
- if $ufsr & (1<<3)
- printf " due to access to disabled/absent coprocessor"
- end
- if $ufsr & (1<<2)
- printf " due to a bad EXC_RETURN value"
- end
- if $ufsr & (1<<1)
- printf " due to bad T or IT bits in EPSR"
- end
- if $ufsr & (1<<0)
- printf " due to executing an undefined instruction"
+ else
+ if $vect >= 15
+ printf "Handling vector %u\n", $vect
end
- printf "\n"
end
- if ((uint32_t)$lr & 0xf0000000) == 0xf0000000
+ if ((unsigned)$lr & 0xf0000000) == 0xf0000000
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
- set $frame_ptr = (uint32_t *)$psp
+ printf "exception frame is on PSP, backtrace may not be possible\n"
+ #set $frame_ptr = (unsigned *)$psp
+ set $frame_ptr = (unsigned *)$sp
end
- printf " r0: %08x r1: %08x r2: %08x r3: %08x\n, $frame_ptr[0], $frame_ptr[1], $frame_ptr[2], $frame_ptr[3]
+ if $lr & 0x10
+ set $fault_sp = $frame_ptr + (8 * 4)
+ else
+ set $fault_sp = $frame_ptr + (26 * 4)
+ end
+
+
+ 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 " 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
set $saved_sp = $sp
- if $lr & 0x10
- set $sp = $frame_ptr + (8 * 4)
- else
- set $sp = $frame_ptr + (26 * 4)
- end
+ set $sp = $fault_sp
set $saved_lr = $lr
set $lr = $frame_ptr[5]
set $saved_pc = $pc
@@ -142,7 +154,7 @@ define vecstate
set $lr = $saved_lr
set $pc = $saved_pc
else
- printf "(not currently in exception state)\n"
+ printf "(not currently in exception handler)\n"
end
end