summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTat-Chee Wan (USM)2011-03-24 10:43:07 +0800
committerTat-Chee Wan (USM)2011-03-24 10:43:07 +0800
commite1e0d31f9aad0ed6c64f61208e94cef43e256de7 (patch)
tree6efe3c2cb5acad94fd1e7f498a40db1d47bfd456
parent13d2797ab2263a0703668feb8208eb3911524232 (diff)
cleaned up register get and set routines
-rw-r--r--Debugger/debug_stub.S64
-rw-r--r--Debugger/debug_stub.h32
2 files changed, 62 insertions, 34 deletions
diff --git a/Debugger/debug_stub.S b/Debugger/debug_stub.S
index 9943ba2..de126be 100644
--- a/Debugger/debug_stub.S
+++ b/Debugger/debug_stub.S
@@ -792,7 +792,7 @@ _dbg__cmd_GetOneReg:
bne __dbg__procCmdParamError /* Unexpected input, report error */
ldrb r0, [r0] /* Load Register index parameter */
teq r0, #MSGBUF_CPSRREG /* Check for CPSR register indicator */
- moveq r0, #DBGSTACK_USERCPSR_OFFSET /* Put offset from User Registers (-1) into index, so that after adjustment it points to CPSR slot */
+ moveq r0, #REG_CPSR /* Use CPSR Enum (-1) */
beq _dbg__proc_getRegister /* Handle User CPSR */
bl char2hex /* Convert to Hex value (assume input is valid) */
cmp r0, #NIBBLE0 /* sanity check, (though it is not foolproof as input char in 0x0-0xF (ctrl-chars) will pass through) */
@@ -808,10 +808,10 @@ _dbg__proc_getRegister:
ldmfd sp!, {pc}
/* _dbg_outputOneRegValue
- * Given Register Index (-1: CPSR, 0-F: R0-R15), output hex char to buffer
+ * Given Register Enum (-1: CPSR, 0-F: R0-R15), output hex char to buffer
* On entry:
* r0: output message buffer pointer
- * r1: register index (-1, 0-F)
+ * r1: register enum (-1, 0-F)
* On exit:
* r0: updated (points to next character slot at end of Output Buffer)
* r1: original output message buffer pointer
@@ -819,7 +819,7 @@ _dbg__proc_getRegister:
*/
_dbg_outputOneRegValue:
stmfd sp!, {lr}
- add r2, r1, #DBGSTACK_USERREG_INDEX /* Convert register index to Debug Stack index */
+ add r2, r1, #DBGSTACK_USERREG_INDEX /* Convert register enum to Debug Stack index */
_getdbgregisterfromindex r2, r1 /* Retrieve Register contents into R1 */
#ifdef __BIG_ENDIAN__
bl word2ascii_be /* Convert and put hex chars into Output Message Buffer */
@@ -846,30 +846,32 @@ _dbg__cmd_GetAllRegs:
_dbg_outputMsgValidResponse /* R0: address of output message buffer data pointer (after response prefix) */
/* We must return R0-R15, then CPSR */
- mov r3, #DBGSTACK_USERREG_INDEX /* Output User Register Values first */
+ mov r3, #REG_R0 /* Output User Register Values first */
1: mov r1, r3
bl _dbg_outputOneRegValue /* update output buffer */
add r3, r3, #1 /* increment index */
- cmp r3, #0xF
- ble 1b /* process all the registers */
-
- mov r1, #DBGSTACK_USERCPSR_OFFSET /* Output User CPSR Value lasat */
+ cmp r3, #REG_PC
+ bls 1b /* process all the registers */
+_get_cpsr:
+ mov r1, #REG_CPSR /* Output User CPSR Value last */
bl _dbg_outputOneRegValue /* update output buffer */
_asciiz r0, r1
bl dbg__putDebugMsg /* Send response to the GDB server */
ldmfd sp!, {pc}
-/* Internal Routine: Do not call directly
- * Shared by _dbg__cmd_SetOneReg and _dbg__cmd_SetAllRegs
- * On entry:
+/* _dbg_setOneRegValue
+ * Given Register Enum (-1: CPSR, 0-F: R0-R15), set register to buffer contents
+ * On entry:
* r0: parameter buffer pointer
- * r2: Register Index in Debug Stack (NOT Register Enum)
- * On exit:
- * r0, r2, r3: destroyed
+ * r1: register enum (-1, 0-F)
+ * On exit:
+ * r0: (Updated) Address of parameter in buffer
+ * r1, r2, r3: destroyed
*/
-__dbg_setRegister_fromIndex_withBufferVal:
+_dbg_setOneRegValue:
stmfd sp!, {lr}
+ add r2, r1, #DBGSTACK_USERREG_INDEX /* Convert register enum to Debug Stack index */
#ifdef __BIG_ENDIAN__
bl ascii2word_be
#else
@@ -877,6 +879,7 @@ __dbg_setRegister_fromIndex_withBufferVal:
#endif
/* R0: value, R1: pointer to next char in buffer */
_setdbgregisterfromindex r2, r0, r3 /* Set Register contents in R0, using index in R2, and scratch register R3 */
+ mov r0, r1 /* Copy buffer pointer to next parameter to R0 for return value */
ldmfd sp!, {pc}
@@ -891,28 +894,27 @@ __dbg_setRegister_fromIndex_withBufferVal:
* r0, r1, r2, r3: destroyed
*
*/
-
_dbg__cmd_SetOneReg:
stmfd sp!, {lr}
bl __dbg__cmdParamLen
teq r1, #CMD_REG_SETONE_PARAMLEN /* Check for correct length */
bne __dbg__procCmdParamError /* Unexpected input, report error */
mov r3, r0 /* Keep parameter buffer address in R3 */
- ldrb r1, [r3], #1 /* Load Register index parameter */
+ ldrb r1, [r3], #1 /* Load Register enum parameter */
_check_msgassignment r3
bne __dbg__procCmdParamError /* Can't find '=' */
- mov r0, r1 /* Move register index to R0 for subsequent processing */
- teq r0, #MSGBUF_CPSRREG /* Check for CPSR register indicator */
- moveq r0, #DBGSTACK_USERCPSR_OFFSET /* Put offset from User Registers (-1) into index, so that after adjustment it points to CPSR slot */
+ teq r1, #MSGBUF_CPSRREG /* Check for CPSR register indicator */
+ moveq r1, #REG_CPSR /* Use CPSR enum (-1) */
beq _dbg__proc_setRegister /* Handle User CPSR */
+ mov r0, r1 /* Move register enum to R0 for subsequent processing */
bl char2hex /* Convert to Hex value (assume input is valid) */
cmp r0, #NIBBLE0 /* sanity check, (though it is not foolproof as input char in 0x0-0xF (ctrl-chars) will pass through) */
bhi __dbg__procCmdParamError /* Non-hex char, report error */
+ mov r1, r0 /* move register enum to R1 to call _dbg_setOneRegValue */
_dbg__proc_setRegister:
- add r2, r0, #DBGSTACK_USERREG_INDEX /* Convert register index to Debug Stack index, keep in R2 */
mov r0, r3 /* Retrieve parameter buffer pointer */
- bl __dbg_setRegister_fromIndex_withBufferVal
+ bl _dbg_setOneRegValue
b __dbg__procCmdOk
/* _dbg__cmd_SetAllReg
@@ -930,17 +932,17 @@ _dbg__cmd_SetAllRegs:
bl __dbg__cmdParamLen /* R0: pointer to parameters in buffer */
teq r1, #CMD_REG_SETALL_PARAMLEN /* Check for correct length */
bne __dbg__procCmdParamError /* Unexpected input, report error */
- mov r2, #DBGSTACK_USERREG_INDEX /* R2: register index, starting with R0 */
-1: bl __dbg_setRegister_fromIndex_withBufferVal
- mov r0, r1 /* setup R0 for next ascii2word call */
- add r2, r2, #1 /* increment index */
- cmp r2, #DBGSTACK_USERPC_INDEX
+ mov r4, #REG_R0 /* R4: register enum, starting with enum for R0 */
+1: mov r1, r4 /* Copy enum to R1; R0 already points to current parameter */
+ bl _dbg_setOneRegValue /* R0: next parameter address pointer */
+ add r4, r4, #1 /* increment index */
+ cmp r4, #REG_PC
bls 1b
_set_cpsr:
- mov r2, #DBGSTACK_USERCPSR_INDEX /* R2: CPSR Index */
- bl __dbg_setRegister_fromIndex_withBufferVal
- ldrb r0, [r1]
+ mov r1, #REG_CPSR /* Use CPSR enum (-1) */
+ bl _dbg_setOneRegValue /* R0: next parameter address pointer */
+ ldrb r0, [r0]
teq r0, #0 /* Look for ASCIIZ character to terminate loop */
beq __dbg__procCmdOk
bne __dbg__procCmdParamError /* Unexpected input, report error */
diff --git a/Debugger/debug_stub.h b/Debugger/debug_stub.h
index 7dc9aa8..229c6d6 100644
--- a/Debugger/debug_stub.h
+++ b/Debugger/debug_stub.h
@@ -147,9 +147,9 @@
#define DBGSTACK_NEXTINSTR_INDEX 0 /* Next Instruction Address is at index 0 from bottom of Debug Stack */
#define DBGSTACK_USERCPSR_INDEX 1 /* User CPSR (SPSR_UNDEF) is at index 1 from bottom of Debug Stack */
#define DBGSTACK_USERREG_INDEX 2 /* R0 starts at index 2 from bottom of Debug Stack */
-#define DBGSTACK_USERSP_INDEX (DBGSTACK_USERREG_INDEX + 13) /* SP is R13 */
-#define DBGSTACK_USERPC_INDEX (DBGSTACK_USERREG_INDEX + 15) /* PC is R15 */
-#define DBGSTACK_USERCPSR_OFFSET (DBGSTACK_USERCPSR_INDEX-DBGSTACK_USERREG_INDEX) /* = -1, offset for calculating Debug Stack index */
+#define DBGSTACK_USERSP_INDEX (DBGSTACK_USERREG_INDEX + REG_SP) /* SP is R13 */
+#define DBGSTACK_USERLR_INDEX (DBGSTACK_USERREG_INDEX + REG_LR) /* LR is R14 */
+#define DBGSTACK_USERPC_INDEX (DBGSTACK_USERREG_INDEX + REG_PC) /* PC is R15 */
/*@}*/
/** @name Bitmask Definitions.
@@ -252,6 +252,32 @@ ENUM_VAL(MSG_UNKNOWNPARAM) /**< Unrecognized Parameter Error. */
ENUM_VAL(MSG_UNKNOWNBRKPT) /**< Unrecognized Breakpoint Error. */
ENUM_END(dbg_msg_errno)
+/** Register Enums
+ *
+ * Register Enums.
+ * The enums must be consecutive, starting from -1
+ */
+ENUM_BEGIN
+ENUM_VALASSIGN(REG_CPSR, -1) /**< Previous Mode CPSR */
+ENUM_VAL(REG_R0) /**< User Reg R0 */
+ENUM_VAL(REG_R1) /**< User Reg R1 */
+ENUM_VAL(REG_R2) /**< User Reg R2 */
+ENUM_VAL(REG_R3) /**< User Reg R3 */
+ENUM_VAL(REG_R4) /**< User Reg R4 */
+ENUM_VAL(REG_R5) /**< User Reg R5 */
+ENUM_VAL(REG_R6) /**< User Reg R6 */
+ENUM_VAL(REG_R7) /**< User Reg R7 */
+ENUM_VAL(REG_R8) /**< User Reg R8 */
+ENUM_VAL(REG_R9) /**< User Reg R9 */
+ENUM_VAL(REG_R10) /**< User Reg R10 */
+ENUM_VAL(REG_R11) /**< User Reg R11 */
+ENUM_VAL(REG_R12) /**< User Reg R12 */
+ENUM_VAL(REG_SP) /**< Previous Mode SP (R13) */
+ENUM_VAL(REG_LR) /**< Previous Mode LR (R14) */
+ENUM_VAL(REG_PC) /**< Program Counter (R15) */
+
+ENUM_END(register_enum_t)
+
#ifndef __ASSEMBLY__