Пример #1
0
/*********************************************************************************************************
** 函数名称: 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);
}
Пример #2
0
/*********************************************************************************************************
** 函数名称: 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);
    }
}
Пример #3
0
/*********************************************************************************************************
** 函数名称: _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);
        }
    }
}
Пример #4
0
/*********************************************************************************************************
** 函数名称: _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();
        }
    }
}
Пример #5
0
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);
}
Пример #6
0
/*********************************************************************************************************
** 函数名称: API_InterStackBaseGet
** 功能描述: 获得中断堆栈栈顶 (当前调用者所在的 CPU, 关中断模式下被调用)
** 输 入  : NONE
** 输 出  : 中断栈顶
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
PVOID  API_InterStackBaseGet (VOID)
{
    return  (_K_pstkInterruptBase[LW_CPU_GET_CUR_ID()]);
}