| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | ## Assorted ARMv7M macros for debugging with GDB#echo Loading ARMv7M GDB macros.  Use 'help armv7m' for more information.\ndefine armv7m	echo Use 'help armv7m' for more information.\nenddocument armv7m. Various macros for working with the ARMv7M family of processors...    vecstate.        Print information about the current exception handling state... Use 'help <macro>' for more specific help.enddefine vecstate	set $icsr  = *(unsigned *)0xe000ed04	set $vect  = $icsr & 0x1ff	set $pend  = ($icsr & 0x1ff000) >> 12	set $shcsr = *(unsigned *)0xe000ed24	set $cfsr  = *(unsigned *)0xe000ed28	set $mmfsr = $cfsr & 0xff	set $bfsr  = ($cfsr >> 8) & 0xff	set $ufsr  = ($cfsr >> 16) & 0xffff	set $hfsr  = *(unsigned *)0xe000ed2c	set $bfar  = *(unsigned *)0xe000ed38	set $mmfar = *(unsigned *)0xe000ed34	if $vect < 15		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	else		if $vect >= 15			printf "Handling vector %u\n", $vect		end	end	if ((unsigned)$lr & 0xf0000000) == 0xf0000000		if ($lr & 1)			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		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: %08x PSR: %08x\n", $frame_ptr[4], $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 $saved_lr = $lr		set $lr = $frame_ptr[5]		set $saved_pc = $pc		set $pc = $frame_ptr[6]		bt		set $sp = $saved_sp		set $lr = $saved_lr		set $pc = $saved_pc	else		printf "(not currently in exception handler)\n"	endenddocument vecstate.    vecstate.        Print information about the current exception handling state.enddefine hf_backtrace	set $pc = ((uint32_t*)$psp)[6]	set $lr = ((uint32_t*)$psp)[5]	set $r12 = ((uint32_t*)$psp)[4]	set $r3 = ((uint32_t*)$psp)[3]	set $r2 = ((uint32_t*)$psp)[2]	set $r1 = ((uint32_t*)$psp)[1]	set $r0 = ((uint32_t*)$psp)[0]	set $sp = $psp + 4*26	btend
 |