/********************************************************************************************************* ** 函数名称: mips32CacheDisable ** 功能描述: 禁能 CACHE ** 输 入 : cachetype INSTRUCTION_CACHE / DATA_CACHE ** 输 出 : ERROR or OK ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT mips32CacheDisable (LW_CACHE_TYPE cachetype) { if (cachetype == INSTRUCTION_CACHE) { mips32ICacheDisable(); #if LW_CFG_MIPS_CACHE_L2 > 0 if (LW_CPU_GET_CUR_ID() == 0) { iCacheStatus &= ~L1_CACHE_I_EN; } #endif /* LW_CFG_MIPS_CACHE_L2 > 0 */ mips32BranchPredictionDisable(); } else { mips32DCacheDisable(); #if LW_CFG_MIPS_CACHE_L2 > 0 if (LW_CPU_GET_CUR_ID() == 0) { iCacheStatus &= ~L1_CACHE_D_EN; } #endif /* LW_CFG_MIPS_CACHE_L2 > 0 */ } #if LW_CFG_MIPS_CACHE_L2 > 0 if ((LW_CPU_GET_CUR_ID() == 0) && (iCacheStatus == L1_CACHE_DIS)) { mips32L2Disable(); } #endif /* LW_CFG_MIPS_CACHE_L2 > 0 */ return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: 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); } }
/********************************************************************************************************* ** 函数名称: _SmpSendIpiAllOther ** 功能描述: 发送一个除自定义以外的核间中断给所有其他 CPU 关中断情况下被调用, 如果需要等待, 则必须保证其他 CPU 已经运行. ** 输 入 : ulIPIVec 核间中断类型 (除自定义类型中断以外) ** iWait 是否等待处理结束 (LW_IPI_SCHED 绝不允许等待, 否则会死锁) ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _SmpSendIpiAllOther (ULONG ulIPIVec, INT iWait) { ULONG i; ULONG ulCPUId; ulCPUId = LW_CPU_GET_CUR_ID(); KN_SMP_WMB(); for (i = 0; i < LW_NCPUS; i++) { if (ulCPUId != i) { _SmpSendIpi(i, ulIPIVec, iWait); } } }
/********************************************************************************************************* ** 函数名称: _SmpCallIpiAllOther ** 功能描述: 发送一个自定义核间中断给其他所有 CPU 关中断情况下被调用, 如果需要等待, 则必须保证其他 CPU 已经运行. ** 输 入 : pipim 核间中断参数 ** 输 出 : NONE (无法确定返回值) ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID _SmpCallIpiAllOther (PLW_IPI_MSG pipim) { ULONG i; ULONG ulCPUId; INT iWaitSave = pipim->IPIM_iWait; ulCPUId = LW_CPU_GET_CUR_ID(); KN_SMP_WMB(); for (i = 0; i < LW_NCPUS; i++) { if (ulCPUId != i) { _SmpCallIpi(i, pipim); KN_SMP_MB(); pipim->IPIM_iWait = iWaitSave; KN_SMP_WMB(); } } }
LW_API INT API_KernelSmpCall (ULONG ulCPUId, FUNCPTR pfunc, PVOID pvArg, VOIDFUNCPTR pfuncAsync, PVOID pvAsync, INT iOpt) { BOOL bLock; INT iRet; bLock = __SMP_CPU_LOCK(); /* 锁定当前 CPU 执行 */ if (ulCPUId == LW_CPU_GET_CUR_ID()) { /* 不能自己调用自己 */ iRet = PX_ERROR; } else { iRet = _SmpCallFunc(ulCPUId, pfunc, pvArg, pfuncAsync, pvAsync, iOpt); } __SMP_CPU_UNLOCK(bLock); /* 解锁当前 CPU 执行 */ return (iRet); }
/********************************************************************************************************* ** 函数名称: API_InterStackBaseGet ** 功能描述: 获得中断堆栈栈顶 (当前调用者所在的 CPU, 关中断模式下被调用) ** 输 入 : NONE ** 输 出 : 中断栈顶 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API PVOID API_InterStackBaseGet (VOID) { return (_K_pstkInterruptBase[LW_CPU_GET_CUR_ID()]); }