/********************************************************************************************************* ** 函数名称: archDataStorageExceptionHandle ** 功能描述: 数据存储异常处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archDataStorageExceptionHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; addr_t ulAbortAddr; LW_VMM_ABORT abtInfo; ulAbortAddr = ppcGetDAR(); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL; LW_TCB_GET_CUR(ptcbCur); #if LW_CFG_VMM_EN > 0 UINT32 uiDSISR = ppcMmuGetDSISR(); /* * See << programming_environment_manual >> Figure 7-16 */ if (uiDSISR & (0x1 << (31 - 1))) { /* * Page fault (no PTE found) */ abtInfo.VMABT_uiType = ppcMmuPteMissHandle(ulAbortAddr); abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_READ; } else if (uiDSISR & (0x1 << (31 - 4))) { /* * Page protection violation */ if (uiDSISR & (0x1 << (31 - 6))) { /* * If the access is a store */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_PERM; abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_WRITE; } else { /* * 不允许读 */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_PERM; abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_READ; } } else { /* * dcbt/dcbtst Instruction */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL; } #endif if (abtInfo.VMABT_uiType) { API_VmmAbortIsr(ulRetAddr, ulAbortAddr, &abtInfo, ptcbCur); } }
/********************************************************************************************************* ** 函数名称: archTraceHandle ** 功能描述: Trace 处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archTraceHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; LW_VMM_ABORT abtInfo; LW_TCB_GET_CUR(ptcbCur); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL; API_VmmAbortIsr(ulRetAddr, ulRetAddr, &abtInfo, ptcbCur); }
/********************************************************************************************************* ** 函数名称: archSystemCallHandle ** 功能描述: 系统调用处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archSystemCallHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; LW_VMM_ABORT abtInfo; LW_TCB_GET_CUR(ptcbCur); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_SYS; API_VmmAbortIsr(ulRetAddr, ulRetAddr, &abtInfo, ptcbCur); }
/********************************************************************************************************* ** 函数名称: archInstructionStorageExceptionHandle ** 功能描述: 指令访问异常处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archInstructionStorageExceptionHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; addr_t ulAbortAddr; LW_VMM_ABORT abtInfo; ulAbortAddr = ppcGetDAR(); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL; LW_TCB_GET_CUR(ptcbCur); #if LW_CFG_VMM_EN > 0 /* * See << programming_environment_manual >> Figure 7-16 */ UINT32 uiSRR1 = ppcMmuGetSRR1(); if (uiSRR1 & (0x1 << (31 - 1))) { /* * Page fault (no PTE found) */ abtInfo.VMABT_uiType = ppcMmuPteMissHandle(ulAbortAddr); abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_READ; } else if (uiSRR1 & (0x1 << (31 - 4))) { /* * Page protection violation * 不允许预取 */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_PERM; abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_READ; } else if (uiSRR1 & (0x1 << (31 - 3))) { /* * If the segment is designated as no-execute */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_PERM; abtInfo.VMABT_uiMethod = LW_VMM_ABORT_METHOD_EXEC; } else { /* * dcbt/dcbtst Instruction */ abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_TERMINAL; } #endif if (abtInfo.VMABT_uiType) { API_VmmAbortIsr(ulRetAddr, ulAbortAddr, &abtInfo, ptcbCur); } }
/********************************************************************************************************* ** 函数名称: archAlignmentExceptionHandle ** 功能描述: 非对齐异常处理 ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: ** 注 意 : 此函数退出时必须为中断关闭状态. *********************************************************************************************************/ VOID archAlignmentExceptionHandle (addr_t ulRetAddr) { PLW_CLASS_TCB ptcbCur; addr_t ulAbortAddr; LW_VMM_ABORT abtInfo; ulAbortAddr = ppcGetDAR(); abtInfo.VMABT_uiType = LW_VMM_ABORT_TYPE_BUS; LW_TCB_GET_CUR(ptcbCur); API_VmmAbortIsr(ulRetAddr, ulAbortAddr, &abtInfo, ptcbCur); }
/********************************************************************************************************* ** 函数名称: 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); }
/********************************************************************************************************* ** 函数名称: 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); }
/********************************************************************************************************* ** 函数名称: archAbtHandle ** 功能描述: 系统发生 data abort 或者 prefetch_abort 异常时会调用此函数 ** 输 入 : ulRetAddr 异常返回地址. ** uiArmExcType ARM 异常类型 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID archAbtHandle (addr_t ulRetAddr, UINT32 uiArmExcType) { #define ARM_EXC_TYPE_ABT 8 #define ARM_EXC_TYPE_PRE 4 PLW_CLASS_TCB ptcbCur; addr_t ulAbortAddr; ULONG ulAbortType; if (uiArmExcType == ARM_EXC_TYPE_ABT) { ulAbortAddr = armGetAbtAddr(); ulAbortType = armGetAbtType(); } else { ulAbortAddr = armGetPreAddr(ulRetAddr); ulAbortType = armGetPreType(); } LW_TCB_GET_CUR(ptcbCur); API_VmmAbortIsr(ulRetAddr, ulAbortAddr, ulAbortType, 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); }