From e1e0d31f9aad0ed6c64f61208e94cef43e256de7 Mon Sep 17 00:00:00 2001 From: Tat-Chee Wan (USM) Date: Thu, 24 Mar 2011 10:43:07 +0800 Subject: cleaned up register get and set routines --- Debugger/debug_stub.S | 64 ++++++++++++++++++++++++++------------------------- Debugger/debug_stub.h | 32 +++++++++++++++++++++++--- 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__ -- cgit v1.2.3