/********************************************************************************************************* ** 函数名称: archDbgTrapType ** 功能描述: 获取 trap 类型. ** 输 入 : ulAddr 断点地址 ** pvArch 体系结构相关参数 (ARM 处理器为 CPSR) ** 输 出 : LW_TRAP_INVAL / LW_TRAP_BRKPT / LW_TRAP_ABORT ** 全局变量: ** 调用模块: *********************************************************************************************************/ UINT archDbgTrapType (addr_t ulAddr, PVOID pvArch) { REGISTER UINT32 uiCpsr = (UINT32)pvArch; #if (LW_CFG_SMP_EN > 0) && (LW_CFG_CACHE_EN > 0) && (LW_CFG_GDB_SMP_TU_LAZY > 0) ULONG ulCPUId; #endif /* LW_CFG_SMP_EN > 0 */ if (API_DtraceIsValid() == LW_FALSE) { /* 不存在调试节点 */ return (LW_TRAP_INVAL); } if (uiCpsr & 0x20) { /* Thumb 模式 */ switch (*(UINT16 *)ulAddr) { case ARM_BREAKPOINT_INS_TMB: return (LW_TRAP_BRKPT); case ARM_ABORTPOINT_INS_TMB: return (LW_TRAP_ABORT); default: break; } } else { /* ARM 模式 */ switch (*(ULONG *)ulAddr) { case ARM_BREAKPOINT_INS: return (LW_TRAP_BRKPT); case ARM_ABORTPOINT_INS: return (LW_TRAP_ABORT); default: break; } } #if (LW_CFG_SMP_EN > 0) && (LW_CFG_CACHE_EN > 0) && (LW_CFG_GDB_SMP_TU_LAZY > 0) if (API_CacheGetOption() & CACHE_TEXT_UPDATE_MP) { ulCPUId = LW_CPU_GET_CUR_ID(); if (ulLastBpAddr[ulCPUId] == ulAddr) { /* 不是断点的停止 */ ulLastBpAddr[ulCPUId] = (addr_t)PX_ERROR; /* 同一地址连续失效 */ return (LW_TRAP_INVAL); } else { ulLastBpAddr[ulCPUId] = ulAddr; API_CacheLocalTextUpdate((PVOID)ulAddr, sizeof(ulAddr)); /* 刷新一次 I CACHE 再去尝试 */ return (LW_TRAP_RETRY); } } else #endif /* LW_CFG_SMP_EN > 0 */ /* LW_CFG_CACHE_EN > 0 */ /* LW_CFG_GDB_SMP_TU_LAZY > 0 */ { return (LW_TRAP_INVAL); } }
/********************************************************************************************************* ** 函数名称: archDbgBpRemove ** 功能描述: 删除一个断点. ** 输 入 : ulAddr 断点地址 ** stSize 断点大小 ** pulIns 返回的之前的指令 ** bLocal 是否仅更新当前 CPU I-CACHE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID archDbgBpRemove (addr_t ulAddr, size_t stSize, ULONG ulIns, BOOL bLocal) { lib_memcpy((PCHAR)ulAddr, (PCHAR)&ulIns, stSize); #if LW_CFG_CACHE_EN > 0 if (bLocal) { API_CacheLocalTextUpdate((PVOID)ulAddr, stSize); } else { API_CacheTextUpdate((PVOID)ulAddr, stSize); } #endif /* LW_CFG_CACHE_EN > 0 */ }
/********************************************************************************************************* ** 函数名称: archDbgBpInsert ** 功能描述: 插入一个断点. ** 输 入 : ulAddr 断点地址 ** stSize 断点大小 ** pulIns 返回的之前的指令 ** bLocal 是否仅更新当前 CPU I-CACHE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID archDbgBpInsert (addr_t ulAddr, size_t stSize, ULONG *pulIns, BOOL bLocal) { ULONG ulIns = ARM_BREAKPOINT_INS; lib_memcpy((PCHAR)pulIns, (PCHAR)ulAddr, stSize); /* memcpy 避免 arm 对齐问题 */ lib_memcpy((PCHAR)ulAddr, (PCHAR)&ulIns, stSize); #if LW_CFG_CACHE_EN > 0 if (bLocal) { API_CacheLocalTextUpdate((PVOID)ulAddr, stSize); } else { API_CacheTextUpdate((PVOID)ulAddr, stSize); } #endif /* LW_CFG_CACHE_EN > 0 */ }