/********************************************************************************************************* ** 函数名称: archProgramExceptionHandle ** 功能描述: 程序异常处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archProgramExceptionHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; LW_VMM_ABORT abtInfo; #if LW_CFG_GDB_EN > 0 UINT uiBpType = archDbgTrapType(ulRetAddr, (PVOID)LW_NULL); /* 断点指令探测 */ if (uiBpType) { if (API_DtraceBreakTrap(ulRetAddr, uiBpType) == ERROR_NONE) { /* 进入调试接口断点处理 */ return; } } #endif /* LW_CFG_GDB_EN > 0 */ LW_TCB_GET_CUR(ptcbCur); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_UNDEF; abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC; API_VmmAbortIsr(ulRetAddr, ulRetAddr, &abtInfo, ptcbCur); }
/********************************************************************************************************* ** 函数名称: archUndHandle ** 功能描述: archUndEntry 需要调用此函数处理未定义指令 ** 输 入 : ulAddr 对应的地址 ** uiCpsr 产生异常时的 CPSR ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID archUndHandle (addr_t ulAddr, UINT32 uiCpsr) { PLW_CLASS_TCB ptcbCur; #if LW_CFG_GDB_EN > 0 UINT uiBpType = archDbgTrapType(ulAddr, (PVOID)uiCpsr); /* 断点指令探测 */ if (uiBpType) { if (API_DtraceBreakTrap(ulAddr, uiBpType) == ERROR_NONE) { /* 进入调试接口断点处理 */ return; } } #endif /* LW_CFG_GDB_EN > 0 */ LW_TCB_GET_CUR(ptcbCur); #if LW_CFG_CPU_FPU_EN > 0 if (archFpuUndHandle(ptcbCur) == ERROR_NONE) { /* 进行 FPU 指令探测 */ return; } #endif /* LW_CFG_CPU_FPU_EN > 0 */ API_VmmAbortIsr(ulAddr, ulAddr, LW_VMM_ABORT_TYPE_UNDEF, ptcbCur); }