svn commit: r252320 - head/sys/arm/arm
Andrew Turner
andrew at FreeBSD.org
Thu Jun 27 22:26:56 UTC 2013
Author: andrew
Date: Thu Jun 27 22:26:56 2013
New Revision: 252320
URL: http://svnweb.freebsd.org/changeset/base/252320
Log:
Support reading registers r0-r3 when unwinding. There is a seperate
instruction to load these. We only hit it when unwinding past an trap frame
as in C r0-r3 would never have been saved onto the stack.
Modified:
head/sys/arm/arm/db_trace.c
Modified: head/sys/arm/arm/db_trace.c
==============================================================================
--- head/sys/arm/arm/db_trace.c Thu Jun 27 21:34:29 2013 (r252319)
+++ head/sys/arm/arm/db_trace.c Thu Jun 27 22:26:56 2013 (r252320)
@@ -108,6 +108,7 @@ extern int extab_start, extab_end, exidx
#define INSN_VSP_REG 0x90
#define INSN_POP_COUNT 0xa0
#define INSN_FINISH 0xb0
+#define INSN_POP_REGS 0xb1
#define INSN_VSP_LARGE_INC 0xb2
/* An item in the exception index table */
@@ -268,6 +269,24 @@ db_unwind_exec_insn(struct unwind_state
/* Stop processing */
state->entries = 0;
+ } else if ((insn == INSN_POP_REGS)) {
+ unsigned int mask, reg;
+
+ mask = db_unwind_exec_read_byte(state);
+ if (mask == 0 || (mask & 0xf0) != 0)
+ return 1;
+
+ /* Update SP */
+ update_vsp = 1;
+
+ /* Load the registers */
+ for (reg = 0; mask && reg < 4; mask >>= 1, reg++) {
+ if (mask & 1) {
+ state->registers[reg] = *vsp++;
+ state->update_mask |= 1 << reg;
+ }
+ }
+
} else if ((insn & INSN_VSP_LARGE_INC_MASK) == INSN_VSP_LARGE_INC) {
unsigned int uleb128;
More information about the svn-src-all
mailing list