/********************************************************************************************************* ** 函数名称: archFpuUnavailableExceptionHandle ** 功能描述: FPU 不可用异常处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archFpuUnavailableExceptionHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; LW_VMM_ABORT abtInfo; 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 */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_FPE; 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); }