From c459f880d4a63516664434c0da480905e4481400 Mon Sep 17 00:00:00 2001 From: Tat-Chee Wan (USM) Date: Wed, 20 Jul 2011 11:43:49 +0800 Subject: refactoring of message copying macros Cleaned up macros used to copy debug messages to output buffers --- Debugger/debug_internals.h | 6 +- Debugger/debug_macros.h | 165 ++++++++++++++++++++++----------------------- Debugger/debug_stub.S | 31 +++++++-- 3 files changed, 113 insertions(+), 89 deletions(-) diff --git a/Debugger/debug_internals.h b/Debugger/debug_internals.h index c0291f3..e187b82 100644 --- a/Debugger/debug_internals.h +++ b/Debugger/debug_internals.h @@ -126,7 +126,11 @@ /*@{*/ #define CMD_QUERY_MINPARAMLEN 0 #define CMD_QUERY_CURRTID_PARAMLEN 1 -#define CMD_QUERY_CURRTID_CHAR 'C' +#define CMD_QUERY_FTINFO_PARAMLEN 11 +#define CMD_QUERY_STINFO_PARAMLEN 11 +#define CMD_QUERY_CURRTID_CHAR 'C' +#define CMD_QUERY_FTINFO_CHAR 'f' +#define CMD_QUERY_STINFO_CHAR 's' /*@}*/ diff --git a/Debugger/debug_macros.h b/Debugger/debug_macros.h index b25c7b4..8d63e46 100644 --- a/Debugger/debug_macros.h +++ b/Debugger/debug_macros.h @@ -122,17 +122,44 @@ bne 1b .endm +/* _dbg_CopyMsg2OutputBuf + * Copies source message to output buffer + * On entry: + * R2: source message buffer (ASCIIZ terminated) + * On exit: + * R0: Pointer to Output Buffer ASCIIZ location + * R2-R3: destroyed + */ + .macro _dbg_CopyMsg2OutputBuf + ldr r0, =debug_OutMsgBuf + _dbg_stpcpy r0, r2, r3 + .endm + +/* _dbg_CopyMsg2OutputBuf_withParam + * Internal Routine called to output message with parameters + * Return Message with byte-sized parameter + * On entry: + * R1: byte-sized param + * R2: source message buffer (ASCIIZ terminated) + * On exit: + * R0: Pointer to Output Buffer ASCIIZ location + * R1-R3: destroyed + */ + .macro _dbg_CopyMsg2OutputBuf_withParam + _dbg_CopyMsg2OutputBuf /* R1 unchanged */ + bl byte2ascii /* R0 points to buffer position after byte value */ + _asciiz r0, r1 + .endm + /* _dbg_outputAckOnlyFlag * Return Flag ('+') for Continue or Step * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R2-R3: destroyed */ .macro _dbg_outputAckOnlyFlag - ldr r0, =debug_OutMsgBuf - ldr r1, =debug_AckOnlyFlag /* ASCIIZ terminated */ - _dbg_stpcpy r0, r1, r2 + ldr r2, =debug_AckOnlyFlag /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf .endm @@ -140,60 +167,67 @@ * Return Flag ('-') for Checksum Error (retransmission needed) * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R2-R3: destroyed */ .macro _dbg_outputRetransmitFlag - ldr r0, =debug_OutMsgBuf - ldr r1, =debug_RetransmitFlag /* ASCIIZ terminated */ - _dbg_stpcpy r0, r1, r2 + ldr r2, =debug_RetransmitFlag /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf .endm /* _dbg_outputMsgValidResponse * Return Message with valid response ('+$') * On exit: * R0: Pointer to Output Buffer next character slot location - * R1: destroyed - * R2: destroyed + * R2-R3: destroyed */ .macro _dbg_outputMsgValidResponse - ldr r0, =debug_OutMsgBuf - ldr r1, =debug_ValidResponsePrefix - _dbg_stpcpy r0, r1, r2 + ldr r2, =debug_ValidResponsePrefix + _dbg_CopyMsg2OutputBuf .endm - /* _dbg_outputMsgStatusOk * Return Message with Ok ('+$OK') status * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R2-R3: destroyed */ .macro _dbg_outputMsgStatusOk - ldr r0, =debug_OutMsgBuf - ldr r1, =debug_OkResponse /* ASCIIZ terminated */ - _dbg_stpcpy r0, r1, r2 + ldr r2, =debug_OkResponse /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf .endm -/* __dbg_outputErrMsg - * Internal Routine called to generate error messages - * Return Message with Error ('+$ENN') status - * On entry: - * R1: error code - * On exit: +/* _dbg_outputMsgCurrTID + * Return Message with Default Thread ID ('+$QC0') + * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed - * R3: destroyed - */ - .macro __dbg_outputErrMsg - ldr r0, =debug_OutMsgBuf - ldr r2, =debug_ErrorResponsePrefix - _dbg_stpcpy r0, r2, r3 - bl byte2ascii /* R0 points to buffer position after byte value */ - _asciiz r0, r1 - .endm + * R2-R3: destroyed + */ + .macro _dbg_outputMsgCurrTID + ldr r2, =debug_ThreadIDResponse /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf + .endm + +/* _dbg_outputMsgFirstThreadInfo + * Return Message with Default Current Thread ID ('+$m0') + * On exit: + * R0: Pointer to Output Buffer ASCIIZ location + * R2-R3: destroyed + */ + .macro _dbg_outputMsgFirstThreadInfo + ldr r2, =debug_FirstThreadInfoResponse /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf + .endm + +/* _dbg_outputMsgSubsequentThreadInfo + * Return Message with Default Current Thread ID ('+$m0') + * On exit: + * R0: Pointer to Output Buffer ASCIIZ location + * R2-R3: destroyed + */ + .macro _dbg_outputMsgSubsequentThreadInfo + ldr r2, =debug_SubsequentThreadInfoResponse /* ASCIIZ terminated */ + _dbg_CopyMsg2OutputBuf + .endm /* _dbg_outputMsgStatusErr * Return Message with Error ('+$ENN') status @@ -201,43 +235,22 @@ * R1: error code * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed - * R3: destroyed + * R1-R3: destroyed */ .macro _dbg_outputMsgStatusErr - __dbg_outputErrMsg + ldr r2, =debug_ErrorResponsePrefix + _dbg_CopyMsg2OutputBuf_withParam .endm /* _dbg_outputMsgStatusErrCode * Return Message with Error ('+$ENN') status * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R1-R3: destroyed */ .macro _dbg_outputMsgStatusErrCode errcode mov r1, #\errcode - __dbg_outputErrMsg - .endm - -/* __dbg_outputSigMsg - * Internal Routine called to generate Signal messages - * Return Message with Signal ('+$SNN') status - * On entry: - * R1: signal code - * On exit: - * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed - * R3: destroyed - */ - .macro __dbg_outputSigMsg - ldr r0, =debug_OutMsgBuf - ldr r2, =debug_SignalResponsePrefix - _dbg_stpcpy r0, r2, r3 - bl byte2ascii /* R0 points to buffer position after byte value */ - _asciiz r0, r1 + _dbg_outputMsgStatusErr .endm /* _dbg_outputMsgStatusSig @@ -246,38 +259,24 @@ * R1: signal code * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R1-R3: destroyed */ .macro _dbg_outputMsgStatusSig - __dbg_outputSigMsg + ldr r2, =debug_SignalResponsePrefix + _dbg_CopyMsg2OutputBuf_withParam .endm /* _dbg_outputMsgStatusSigCode * Return Message with Signal ('+$SNN') status * On exit: * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed + * R1-R3: destroyed */ .macro _dbg_outputMsgStatusSigCode statuscode mov r1, #\statuscode - __dbg_outputSigMsg + _dbg_outputMsgStatusSig .endm -/* _dbg_outputMsgCurrTID - * Return Message with Default Thread ID ('+$QC0') - * On exit: - * R0: Pointer to Output Buffer ASCIIZ location - * R1: destroyed - * R2: destroyed - */ - .macro _dbg_outputMsgCurrTID - ldr r0, =debug_OutMsgBuf - ldr r1, =debug_ThreadIDResponse /* ASCIIZ terminated */ - _dbg_stpcpy r0, r1, r2 - .endm - /* _regenum2index * Convert register enum to debugger stack index diff --git a/Debugger/debug_stub.S b/Debugger/debug_stub.S index 1b0ef8c..cbb253a 100644 --- a/Debugger/debug_stub.S +++ b/Debugger/debug_stub.S @@ -254,6 +254,11 @@ debug_OkResponse: debug_ThreadIDResponse: .byte '+','$','Q','C','0',0 /* 0: Any thread */ +debug_FirstThreadInfoResponse: + .byte '+','$','m','0',0 /* 0: One default thread */ +debug_SubsequentThreadInfoResponse: + .byte '+','$','l',0 /* End of Thread List */ + /* The CmdIndexTable and CmdJumpTable must be kept in sync */ debug_cmdIndexTable: .byte 'g','G','p','P','m','M','D','c','s','k','z','Z','?','q','Q',0 @@ -693,11 +698,11 @@ __dbg__procCmdReturnOutputLengthError: */ __dbg__procBreakpointAddrError: mov r1, #MSG_UNKNOWNBRKPT - b __dbg__procErrorMsg +/* b __dbg__procErrorMsg */ __dbg__procErrorMsg: - __dbg_outputErrMsg + _dbg_outputMsgStatusErr /* b __dbg__sendDebugMsgExit */ __dbg__sendDebugMsgExit: @@ -743,15 +748,31 @@ _dbg__cmd_Query: _dbg_setstate DBG_CONFIGURED /* We have exchanged query messages with the GDB server */ ldmfd sp!, {r0, r1} /* Restore parameters needed for subsequent processing */ bl __dbg__cmdParamLen - cmp r1, #CMD_QUERY_CURRTID_PARAMLEN - bne _dbg__cmd_Query_default + cmp r1, #CMD_QUERY_MINPARAMLEN + beq _dbg__cmd_Query_default -_dbg__cmd_Query_check: ldrb r2, [r0] /* Get First Query Param Char */ +_dbg__cmd_Query_check_C: teq r2, #CMD_QUERY_CURRTID_CHAR /* Handle Current Thread ID Query */ + bne _dbg__cmd_Query_check_fThreadInfo + cmp r1, #CMD_QUERY_CURRTID_PARAMLEN bne _dbg__cmd_Query_default _dbg_outputMsgCurrTID b __dbg__sendDebugMsgExit +_dbg__cmd_Query_check_fThreadInfo: + teq r2, #CMD_QUERY_FTINFO_CHAR /* Handle fThreadInfo Query */ + bne _dbg__cmd_Query_check_sThreadInfo + cmp r1, #CMD_QUERY_FTINFO_PARAMLEN + bne _dbg__cmd_Query_default + _dbg_outputMsgFirstThreadInfo + b __dbg__sendDebugMsgExit +_dbg__cmd_Query_check_sThreadInfo: + teq r2, #CMD_QUERY_STINFO_CHAR /* Handle sThreadInfo ID Query */ + bne _dbg__cmd_Query_default + cmp r1, #CMD_QUERY_STINFO_PARAMLEN + bne _dbg__cmd_Query_default + _dbg_outputMsgSubsequentThreadInfo + b __dbg__sendDebugMsgExit _dbg__cmd_Query_default: b __dbg__procUnimplementedError /* FIXME: return an empty message to GDB (no modifiable settings) */ -- cgit v1.2.3