예제 #1
0
/*********************************************************************************************************
** 函数名称: API_TShellSetOption
** 功能描述: 设置新的 shell 选项.
** 输 入  : hTShellHandle   shell 线程
**           ulNewOpt        新的 shell 选项
** 输 出  : 错误代码.
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_TShellSetOption (LW_OBJECT_HANDLE  hTShellHandle, ULONG  ulNewOpt)
{
    PLW_CLASS_TCB   ptcbShell;
    UINT16          usIndex;
    
    usIndex = _ObjectGetIndex(hTShellHandle);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(hTShellHandle, _OBJECT_THREAD)) {               /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (PX_ERROR);
    }
    
    ptcbShell = __GET_TCB_FROM_INDEX(usIndex);
    __TTINY_SHELL_SET_OPT(ptcbShell, ulNewOpt);
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (ERROR_NONE);
}
예제 #2
0
/*********************************************************************************************************
** 函数名称: API_InterVectorDisconnect
** 功能描述: 解除系统指定向量中断服务
** 输 入  : ulVector                      中断向量号
**           pfuncIsr                      服务函数
**           pvArg                         服务函数参数
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API
ULONG  API_InterVectorDisconnect (ULONG             ulVector,
                                  PINT_SVR_ROUTINE  pfuncIsr,
                                  PVOID             pvArg)
{
    INTREG              iregInterLevel;
    BOOL                bNeedFree = LW_FALSE;
    
    PLW_LIST_LINE       plineTemp;
    PLW_CLASS_INTACT    piaction;
    PLW_CLASS_INTDESC   pidesc;

    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (ERROR_KERNEL_IN_ISR);
    }
    
    INTER_SHOWLOCK_CREATE();

    if (_Inter_Vector_Invalid(ulVector)) {
        _ErrorHandle(ERROR_KERNEL_VECTOR_NULL);
        return  (ERROR_KERNEL_VECTOR_NULL);
    }
    
    if (pfuncIsr == LW_NULL) {
        _ErrorHandle(ERROR_KERNEL_VECTOR_NULL);
        return  (ERROR_KERNEL_VECTOR_NULL);
    }
    
    INTER_SHOWLOCK_LOCK();

    pidesc = LW_IVEC_GET_IDESC(ulVector);

    LW_SPIN_LOCK_QUICK(&pidesc->IDESC_slLock, &iregInterLevel);         /*  关闭中断同时锁住 spinlock   */
    
    for (plineTemp  = pidesc->IDESC_plineAction;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
         
        piaction = _LIST_ENTRY(plineTemp, LW_CLASS_INTACT, IACT_plineManage);
        if ((piaction->IACT_pfuncIsr == pfuncIsr) &&
            (piaction->IACT_pvArg    == pvArg)) {
            _List_Line_Del(&piaction->IACT_plineManage,
                           &pidesc->IDESC_plineAction);
            bNeedFree = LW_TRUE;
            break;
        }
    }
    
    LW_SPIN_UNLOCK_QUICK(&pidesc->IDESC_slLock, iregInterLevel);        /*  打开中断, 同时打开 spinlock */
    
    INTER_SHOWLOCK_UNLOCK();
    
    if (bNeedFree) {
        __KHEAP_FREE(piaction);
    }
    
    return  (ERROR_NONE);
}
예제 #3
0
/*********************************************************************************************************
** 函数名称: __inetPingSend
** 功能描述: 发送 ping 包
** 输 入  : iSock         套接字
**           inaddr        目标 ip 地址.
**           iDataSize     数据大小
**           pusSeqRecv    需要判断的 seq
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  __inetPingSend (INT  iSock, struct in_addr  inaddr, INT  iDataSize, UINT16  *pusSeqRecv)
{
    REGISTER size_t                stPingSize = sizeof(struct icmp_echo_hdr) + iDataSize;
             struct icmp_echo_hdr *icmphdrEcho;
             ssize_t               sstError;
             struct sockaddr_in    sockaddrin;
             
    icmphdrEcho = (struct icmp_echo_hdr *)__SHEAP_ALLOC(stPingSize);
    if (icmphdrEcho == LW_NULL) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory\r\n");
        return  (PX_ERROR);
    }
    
    __inetPingPrepare(icmphdrEcho, iDataSize, pusSeqRecv);
    
    sockaddrin.sin_len    = sizeof(struct sockaddr_in);
    sockaddrin.sin_family = AF_INET;
    sockaddrin.sin_port   = 0;
    sockaddrin.sin_addr   = inaddr;
    
    sstError = sendto(iSock, icmphdrEcho, stPingSize, 0, 
                      (const struct sockaddr *)&sockaddrin, 
                      sizeof(struct sockaddr_in));
                         
    __SHEAP_FREE(icmphdrEcho);
    
    return ((sstError > 0) ? ERR_OK : ERR_VAL);
}
예제 #4
0
/*********************************************************************************************************
** 函数名称: API_HotplugPollAdd
** 功能描述: 在 hotplug 事件处理上下文中, 加入一个循环检测函数.
** 输 入  : pfunc                      函数指针
**           pvArg                      函数参数
** 输 出  : 操作是否成功
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_HotplugPollAdd (VOIDFUNCPTR   pfunc, PVOID  pvArg)
{
    PLW_HOTPLUG_POLLNODE        phppn;
    
    phppn = (PLW_HOTPLUG_POLLNODE)__SHEAP_ALLOC(sizeof(LW_HOTPLUG_POLLNODE));
                                                                        /*  申请控制块内存              */
    if (!phppn) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n");
        _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY);                          /*  缺少内存                    */
        return  (PX_ERROR);
    }
    
    phppn->HPPN_pfunc = pfunc;
    phppn->HPPN_pvArg = pvArg;
    
    __HOTPLUG_LOCK();                                                   /*  lock hotplug poll list      */
    _List_Line_Add_Ahead(&phppn->HPPN_lineManage, &_G_plineHotplugPoll);
    __HOTPLUG_UNLOCK();                                                 /*  unlock hotplug poll list    */
    
#if LW_CFG_MODULELOADER_EN > 0
    if (__PROC_GET_PID_CUR() && vprocFindProc((PVOID)pfunc)) {
        __resAddRawHook(&phppn->HPPN_resraw, (VOIDFUNCPTR)API_HotplugPollDelete,
                        (PVOID)pfunc, pvArg, 0, 0, 0, 0);
    } else {
        phppn->HPPN_resraw.RESRAW_bIsInstall = LW_FALSE;                /*  不需要回收操作              */
    }
#else
    __resAddRawHook(&phppn->HPPN_resraw, (VOIDFUNCPTR)API_HotplugPollDelete,
                    (PVOID)pfunc, pvArg, 0, 0, 0, 0);
#endif
    
    return  (ERROR_NONE);
}
예제 #5
0
/*********************************************************************************************************
** 函数名称: mips32CacheProbe
** 功能描述: CACHE 探测
** 输 入  : NONE
** 输 出  : ERROR or OK
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
static INT  mips32CacheProbe (VOID)
{
    UINT32  uiTemp;
    UINT32  uiConfig = mipsCp0ConfigRead();                             /*  读 Config0                  */

    if (!(uiConfig & (M_ConfigMore))) {                                 /*  没有 Config1, 退出          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "No CP0 Config1 Register!\r\n");
        return  (PX_ERROR);
    }

    uiConfig = mipsCp0Config1Read();                                    /*  读 Config1                  */
    uiTemp   = (uiConfig & M_Config1IL) >> S_Config1IL;
    if (uiTemp) {
        _G_ICache.CACHE_bPresent   = LW_TRUE;

        _G_ICache.CACHE_uiLineSize = 2 << uiTemp;

        uiTemp                     = (uiConfig & M_Config1IS) >> S_Config1IS;
        _G_ICache.CACHE_uiSetNr    = 64 << uiTemp;

        uiTemp                     = (uiConfig & M_Config1IA) >> S_Config1IA;
        _G_ICache.CACHE_uiWayNr    = 1 + uiTemp;

        _G_ICache.CACHE_uiSize     = _G_ICache.CACHE_uiSetNr * _G_ICache.CACHE_uiWayNr *
                                     _G_ICache.CACHE_uiLineSize;

        _G_ICache.CACHE_uiWayStep  = _G_ICache.CACHE_uiSetNr * _G_ICache.CACHE_uiLineSize;
    } else {                                                            /*  没有 I-Cache                */
예제 #6
0
LW_API  
ULONG  API_SemaphoreCStatus (LW_OBJECT_HANDLE   ulId,
                             ULONG             *pulCounter,
                             ULONG             *pulOption,
                             ULONG             *pulThreadBlockNum)
{
             INTREG                iregInterLevel;
    REGISTER UINT16                usIndex;
    REGISTER PLW_CLASS_EVENT       pevent;
    
    usIndex = _ObjectGetIndex(ulId);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_SEM_C)) {                         /*  类型是否正确                */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "semaphore handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    if (_Event_Index_Invalid(usIndex)) {                                /*  下标是否正正确              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "semaphore handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
#endif
    pevent = &_K_eventBuffer[usIndex];
    
    iregInterLevel = __KERNEL_ENTER_IRQ();                              /*  进入内核                    */
    if (_Event_Type_Invalid(usIndex, LW_TYPE_EVENT_SEMC)) {
        __KERNEL_EXIT_IRQ(iregInterLevel);                              /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "semaphore handle invalidate.\r\n");
        _ErrorHandle(ERROR_EVENT_TYPE);
        return  (ERROR_EVENT_TYPE);
    }
    
    if (pulCounter) {
        *pulCounter = pevent->EVENT_ulCounter;
    }
    if (pulOption) {
        *pulOption  = pevent->EVENT_ulOption;
    }
    if (pulThreadBlockNum) {
        *pulThreadBlockNum = _EventWaitNum(pevent);
    }
    __KERNEL_EXIT_IRQ(iregInterLevel);                                  /*  退出内核                    */
    
    return  (ERROR_NONE);
}
예제 #7
0
파일: ataLib.c 프로젝트: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __ataPread
** 功能描述: 读取设备的参数
** 输 入  : patactrler  ATA控制器结构指针
**                       iDrive    驱动号
**                       pvBuffer  缓冲
** 输 出  : ERROR
** 全局变量:
** 调用模块:
*********************************************************************************************************/
static INT __ataPread (__PATA_CTRL patactrler,
                       INT         iDrive,
                       PVOID       pvBuffer)
{
    __PATA_CTRL patactrl    = LW_NULL;

    INT         iRetry      = 1;
    INT         iRetryCount = 0;
    ULONG       ulSemStatus = 0;

    INT16      *psBuf       = LW_NULL;

    if ((!patactrler) || (!pvBuffer)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "parameter error.\r\n");
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }

    patactrl = patactrler;

    while (iRetry) {
        if (__ataWait(patactrl, __ATA_STAT_READY) != ERROR_NONE) {
            return  (PX_ERROR);
        }

        __ATA_CTRL_OUTBYTE(patactrl, __ATA_SDH(patactrl),   \
                           (UINT8)(__ATA_SDH_LBA | (iDrive << __ATA_DRIVE_BIT)));
        __ATA_CTRL_OUTBYTE(patactrl, __ATA_COMMAND(patactrl), __ATA_CMD_READP);
                                                                        /*  写入确认命令                */
        if (patactrl->ATACTRL_bIntDisable == LW_FALSE) {
            ulSemStatus = API_SemaphoreBPend(patactrl->ATACTRL_ulSyncSem,   \
                                patactrl->ATACTRL_ulSyncSemTimeout);    /*  等待同步信号                */
        }

        if ((patactrl->ATACTRL_iIntStatus & __ATA_STAT_ERR) || (ulSemStatus != ERROR_NONE)) {
            ATA_DEBUG_MSG(("__ataPread() error : status=0x%x intStatus=0x%x "     \
                           "error=0x%x ulSemStatus=%d\n",                         \
                           __ATA_CTRL_INBYTE(patactrl, __ATA_ASTATUS(patactrl)),  \
                           patactrl->ATACTRL_iIntStatus,                          \
                           __ATA_CTRL_INBYTE(patactrl, __ATA_ERROR(patactrl)), ulSemStatus));
            if (++iRetryCount > _G_iAtaRetry) {
                return  (PX_ERROR);
            }
        } else {
            iRetry = 0;
        }
    }

    if (__ataWait(patactrl, __ATA_STAT_DRQ) != ERROR_NONE) {            /*  等待设备准备好传输数据      */
        return  (PX_ERROR);
    }

    psBuf = (INT16 *)pvBuffer;
    __ATA_CTRL_INSTRING(patactrl, __ATA_DATA(patactrl), psBuf, 256);

    ATA_DEBUG_MSG(("__ataPread() end :\n"));

    return  (ERROR_NONE);
}
예제 #8
0
/*********************************************************************************************************
** 函数名称: sigprocmask
** 功能描述: 测试或改变当前线程的信号掩码
** 输 入  : iCmd                    命令
**           psigset                 新信号集
**           psigsetOld              先早信号集
** 输 出  : ERROR or OK
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  sigprocmask (INT              iCmd, 
                  const sigset_t  *psigset, 
                        sigset_t  *psigsetOld)
{
    PLW_CLASS_TCB         ptcbCur;
    PLW_CLASS_SIGCONTEXT  psigctx;
    sigset_t              sigsetBlock;
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        return  (PX_ERROR);
    }
    
    LW_TCB_GET_CUR_SAFE(ptcbCur);
    
    psigctx = _signalGetCtx(ptcbCur);
    
    if (psigsetOld) {                                                   /*  保存古老的                  */
        *psigsetOld = psigctx->SIGCTX_sigsetSigBlockMask;
    }
    
    if (!psigset) {                                                     /*  新的是否有效                */
        return  (ERROR_NONE);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    
    switch (iCmd) {
    
    case SIG_BLOCK:                                                     /*  添加阻塞                    */
        sigsetBlock  = *psigset;
        sigsetBlock &= ~__SIGNO_UNMASK;                                 /*  有些信号是不可屏蔽的        */
        psigctx->SIGCTX_sigsetSigBlockMask |= sigsetBlock;
        __KERNEL_EXIT();                                                /*  退出内核                    */
        return  (ERROR_NONE);
        
    case SIG_UNBLOCK:                                                   /*  删除阻塞                    */
        psigctx->SIGCTX_sigsetSigBlockMask &= ~(*psigset);
        break;
        
    case SIG_SETMASK:                                                   /*  设置阻塞                    */
        psigctx->SIGCTX_sigsetSigBlockMask  = *psigset;
        break;
    
    default:                                                            /*  错误                        */
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "command invalidate.\r\n");
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    _sigPendRun(ptcbCur);                                               /*  可能有先前被阻塞信号需要运行*/
    
    __KERNEL_EXIT();                                                    /*  退出内核                    */

    return  (ERROR_NONE);
}
예제 #9
0
/*********************************************************************************************************
** 函数名称: API_ThreadIsSafe
** 功能描述: 检测目标线程是否处于安全模式.
** 输 入  : 
**           ulId         线程句柄
** 输 出  :
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
BOOL    API_ThreadIsSafe (LW_OBJECT_HANDLE    ulId)
{
    REGISTER UINT16                usIndex;
    REGISTER PLW_CLASS_TCB         ptcb;
	REGISTER BOOL                  bIsInSafeMode;
	
    usIndex = _ObjectGetIndex(ulId);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {                        /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (LW_FALSE);
    }
    
    if (_Thread_Index_Invalid(usIndex)) {                               /*  检查线程有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (LW_FALSE);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (LW_FALSE);
    }
    
    ptcb = _K_ptcbTCBIdTable[usIndex];                                  /*  获得 TCB 指针               */
    
    if (ptcb->TCB_ulThreadSafeCounter) {
        bIsInSafeMode = LW_TRUE;
    
    } else {
        bIsInSafeMode = LW_FALSE;
    }
    
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    return  (bIsInSafeMode);
}
예제 #10
0
LW_API  
ULONG  API_EventSetStatus (LW_OBJECT_HANDLE  ulId, 
                           ULONG            *pulEvent,
                           ULONG            *pulOption)
{
             INTREG                    iregInterLevel;
    REGISTER UINT16                    usIndex;
    REGISTER PLW_CLASS_EVENTSET        pes;
    
    usIndex = _ObjectGetIndex(ulId);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_EVENT_SET)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "eventset handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    if (_EventSet_Index_Invalid(usIndex)) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "eventset handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
#endif
    pes = &_K_esBuffer[usIndex];
    
    iregInterLevel = __KERNEL_ENTER_IRQ();                              /*  进入内核                    */
    if (_EventSet_Type_Invalid(usIndex, LW_TYPE_EVENT_EVENTSET)) {
        __KERNEL_EXIT_IRQ(iregInterLevel);                              /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "eventset handle invalidate.\r\n");
        _ErrorHandle(ERROR_EVENTSET_TYPE);
        return  (ERROR_EVENTSET_TYPE);
    }
    
    if (pulEvent) {
        *pulEvent = pes->EVENTSET_ulEventSets;
    }
    
    if (pulOption) {
        *pulOption = 0ul;
    }
    __KERNEL_EXIT_IRQ(iregInterLevel);                                  /*  退出内核                    */
    
    return  (ERROR_NONE);
}
예제 #11
0
LW_API  
ULONG  API_MsgQueueClear (LW_OBJECT_HANDLE  ulId)
{
             INTREG                iregInterLevel;
    REGISTER UINT16                usIndex;
    REGISTER PLW_CLASS_EVENT       pevent;
    REGISTER PLW_CLASS_MSGQUEUE    pmsgqueue;
    
    usIndex = _ObjectGetIndex(ulId);
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_MSGQUEUE)) {                      /*  类型是否正确                */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "msgqueue handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
    if (_Event_Index_Invalid(usIndex)) {                                /*  下标是否正正确              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "msgqueue handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }
#endif
    pevent = &_K_eventBuffer[usIndex];
    
    iregInterLevel = __KERNEL_ENTER_IRQ();                              /*  进入内核                    */
    if (_Event_Type_Invalid(usIndex, LW_TYPE_EVENT_MSGQUEUE)) {
        __KERNEL_EXIT_IRQ(iregInterLevel);                              /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "msgqueue handle invalidate.\r\n");
        _ErrorHandle(ERROR_MSGQUEUE_TYPE);
        return  (ERROR_MSGQUEUE_TYPE);
    }
    
    pmsgqueue = (PLW_CLASS_MSGQUEUE)pevent->EVENT_pvPtr;
    
    pevent->EVENT_ulCounter = 0ul;
    
    pmsgqueue->MSGQUEUE_pucInputPtr  = pmsgqueue->MSGQUEUE_pucBufferLowAddr;
    pmsgqueue->MSGQUEUE_pucOutputPtr = pmsgqueue->MSGQUEUE_pucBufferLowAddr;
    __KERNEL_EXIT_IRQ(iregInterLevel);                                  /*  退出内核                    */
        
    MONITOR_EVT_LONG1(MONITOR_EVENT_ID_MSGQ, MONITOR_EVENT_MSGQ_CLEAR, ulId, LW_NULL);
    
    return  (ERROR_NONE);
}
예제 #12
0
/*********************************************************************************************************
** 函数名称: API_ThreadGetSliceEx
** 功能描述: 获得指定线程时间片(扩展接口)
** 输 入  :
**           ulId            线程ID
**           pusSliceTemp    时间片
**           pusCounter      剩余时间片
** 输 出  :
** 全局变量:
** 调用模块:
                                           API 函数
*********************************************************************************************************/
LW_API
ULONG  API_ThreadGetSliceEx (LW_OBJECT_HANDLE  ulId, UINT16  *pusSliceTemp, UINT16  *pusCounter)
{
    REGISTER UINT16                usIndex;
    REGISTER PLW_CLASS_TCB         ptcb;

    usIndex = _ObjectGetIndex(ulId);

#if LW_CFG_ARG_CHK_EN > 0
    if (!_ObjectClassOK(ulId, _OBJECT_THREAD)) {                        /*  检查 ID 类型有效性          */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_KERNEL_HANDLE_NULL);
        return  (ERROR_KERNEL_HANDLE_NULL);
    }

    if (_Thread_Index_Invalid(usIndex)) {                               /*  检查线程有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }
#endif

    __KERNEL_ENTER();                                                   /*  进入内核                    */
    if (_Thread_Invalid(usIndex)) {
        __KERNEL_EXIT();                                                /*  退出内核                    */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "thread handle invalidate.\r\n");
        _ErrorHandle(ERROR_THREAD_NULL);
        return  (ERROR_THREAD_NULL);
    }

    ptcb = _K_ptcbTCBIdTable[usIndex];

    if (pusSliceTemp) {
        *pusSliceTemp = ptcb->TCB_usSchedSlice;
    }
    if (pusCounter) {
        *pusCounter = ptcb->TCB_usSchedCounter;
    }

    __KERNEL_EXIT();                                                    /*  退出内核                    */

    return  (ERROR_NONE);
}
예제 #13
0
/*********************************************************************************************************
** 函数名称: API_DiskRiad0Delete
** 功能描述: 删除一个 RAID-0 类型磁盘阵列块设备
** 输 入  : pblkDiskRaid      之前创建的 RAID-0 虚拟磁盘
** 输 出  : ERROR CODE
** 全局变量:
** 调用模块:
                                           API 函数
*********************************************************************************************************/
LW_API
INT  API_DiskRiad0Delete (PLW_BLK_DEV  pblkDiskRaid)
{
    if (pblkDiskRaid == LW_NULL) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }

    _DebugHandle(__LOGMESSAGE_LEVEL, "RAID-0 system has been delete.\r\n");
    return  (ERROR_NONE);
}
예제 #14
0
파일: vmm.c 프로젝트: Ga-vin/libsylixos
LW_API  
ULONG  API_VmmLibSecondaryInit (CPCHAR  pcMachineName)
{
    ULONG    ulError;
    
    ulError = __vmmLibSecondaryInit(pcMachineName);
    
    _DebugHandle(__LOGMESSAGE_LEVEL, "secondary MMU initilaized.\r\n");

    return  (ulError);
}
예제 #15
0
LW_API  
LW_OBJECT_HANDLE  API_SemaphoreCCreate (CPCHAR             pcName,
                                        ULONG              ulInitCounter, 
                                        ULONG              ulMaxCounter,
                                        ULONG              ulOption,
                                        LW_OBJECT_ID      *pulId)
{
    REGISTER PLW_CLASS_EVENT       pevent;
    REGISTER ULONG                 ulI;
    REGISTER PLW_CLASS_WAITQUEUE   pwqTemp;
    REGISTER ULONG                 ulIdTemp;
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!ulMaxCounter) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "max counter invalidate.\r\n");
        _ErrorHandle(ERROR_EVENT_MAX_COUNTER_NULL);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
    if (ulInitCounter > ulMaxCounter) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "initialize counter invalidate.\r\n");
        _ErrorHandle(ERROR_EVENT_INIT_COUNTER);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
#endif

    if (_Object_Name_Invalid(pcName)) {                                 /*  检查名字有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "name too long.\r\n");
        _ErrorHandle(ERROR_KERNEL_PNAME_TOO_LONG);
        return  (LW_OBJECT_HANDLE_INVALID);
    }

    __KERNEL_MODE_PROC(
        pevent = _Allocate_Event_Object();                              /*  获得一个事件控制块          */
    );
예제 #16
0
파일: aio_lib.c 프로젝트: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: _posixAioInit
** 功能描述: 初始化 AIO 函数库
** 输 入  : NONE
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
VOID  _posixAioInit (VOID)
{
    _G_aioqueue.aioq_mutex = API_SemaphoreMCreate("aio_mutex", LW_PRIO_DEF_CEILING, 
                                    LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY, LW_NULL);
    if (_G_aioqueue.aioq_mutex == 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "can not initialize mutex.\r\n");
        return;
    }
    
    if (API_ThreadCondInit(&_G_aioqueue.aioq_newreq, LW_THREAD_PROCESS_SHARED) != ERROR_NONE) {
        API_SemaphoreMDelete(&_G_aioqueue.aioq_mutex);
        _DebugHandle(__ERRORMESSAGE_LEVEL, "can not initialize thread cond.\r\n");
        return;
    }
    
    _G_aioqueue.aioq_plinework = LW_NULL;
    _G_aioqueue.aioq_plineidle = LW_NULL;
    
    _G_aioqueue.aioq_idlethread = 0;
    _G_aioqueue.aioq_actthread  = 0;
}
예제 #17
0
/*********************************************************************************************************
** 函数名称: archCacheReset
** 功能描述: 复位 CACHE, MMU 初始化时需要调用此函数
** 输 入  : pcMachineName  机器名称
** 输 出  : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID  archCacheReset (CPCHAR  pcMachineName)
{
    if (lib_strcmp(pcMachineName, MIPS_MACHINE_LS1X) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_24KF) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_LS2X) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_JZ47XX) == 0) {
        mips32CacheReset(pcMachineName);

    } else {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "unknown machine name.\r\n");
    }
}
예제 #18
0
/*********************************************************************************************************
** 函数名称: _KernelHighLevelInit
** 功能描述: 内核高层初始化
** 输 入  : NONE
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
VOID  _KernelHighLevelInit (VOID)
{
    VOID  _HookListInit(VOID);
    
#if LW_CFG_SIGNAL_EN > 0
    VOID  _signalInit(VOID);
#endif                                                                  /*  LW_CFG_SIGNAL_EN            */
    
    REGISTER INT    iErr;
    
    _DebugHandle(__LOGMESSAGE_LEVEL, "kernel high level initialize...\r\n");
    
    _HookListInit();                                                    /*  系统动态 HOOK 初始化        */

#if LW_CFG_SIGNAL_EN > 0
    _signalInit();                                                      /*  信号初始化                  */
#endif                                                                  /*  LW_CFG_SIGNAL_EN            */

    _CreateIdleThread();                                                /*  建立空闲任务                */
    _CreateITimerThread();                                              /*  ITIMER 任务建立             */
    
#if LW_CFG_ISR_DEFER_EN > 0
    _interDeferInit();
#endif                                                                  /*  LW_CFG_ISR_DEFER_EN > 0     */
    
    iErr = _SysInit();
    if (iErr != ERROR_NONE) {
        _DebugHandle(__LOGMESSAGE_LEVEL, "system initialized error!\r\n");
    
    } else {
        _DebugHandle(__LOGMESSAGE_LEVEL, "system initialized.\r\n");
    }

#if LW_CFG_MPI_EN > 0
    _mpiInit();
#endif                                                                  /*  LW_CFG_MPI_EN               */
    
    bspKernelInitHook();
    __LW_KERNEL_INIT_END_HOOK(iErr);                                    /*  入口参数为系统初始化结果    */
}
예제 #19
0
/*********************************************************************************************************
** 函数名称: API_ThreadPoolCreate
** 功能描述: 建立一个 ThreadPool
** 输 入  : pcName                        线程池名字
**           pfuncThread                   代码入口
**           pthreadattr                   线程属性控制块
**           usMaxThreadCounter            最大线程数量
**           pulId                         Id指针
** 输 出  : 新建立的线程池句柄
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
LW_OBJECT_HANDLE  API_ThreadPoolCreate (PCHAR                    pcName,
                                        PTHREAD_START_ROUTINE    pfuncThread,
                                        PLW_CLASS_THREADATTR     pthreadattr,
                                        UINT16                   usMaxThreadCounter,
                                        LW_OBJECT_ID            *pulId)
{
    REGISTER PLW_CLASS_THREADPOOL   pthreadpool;
    REGISTER ULONG                  ulIdTemp;
    REGISTER ULONG                  ulOption;
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
#if LW_CFG_ARG_CHK_EN > 0
    if (!pfuncThread) {                                                 /*  没有线程执行函数            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "pfuncThread invalidate.\r\n");
        _ErrorHandle(EINVAL);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    if (usMaxThreadCounter >= LW_CFG_MAX_THREADS || 
        usMaxThreadCounter == 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "usMaxThreadCounter invalidate.\r\n");
        _ErrorHandle(ERROR_THREADPOOL_MAX_COUNTER);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
#endif

    if (_Object_Name_Invalid(pcName)) {                                 /*  检查名字有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "name too long.\r\n");
        _ErrorHandle(ERROR_KERNEL_PNAME_TOO_LONG);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
    __KERNEL_MODE_PROC(
        pthreadpool = _Allocate_ThreadPool_Object();                    /*  获得一个分区控制块          */
    );
예제 #20
0
/*********************************************************************************************************
** 函数名称: API_KernelReboot
** 功能描述: 内核重新启动函数
** 输 入  : iRebootType        重启类型 
                                LW_REBOOT_FORCE
                                LW_REBOOT_WARM
                                LW_REBOOT_COLD
                                LW_REBOOT_SHUTDOWN
                                LW_REBOOT_POWEROFF
**           ulStartAddress     启动地址
** 输 出  : NONE
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
VOID   API_KernelRebootEx (INT  iRebootType, addr_t  ulStartAddress)
{
    INTREG  iregInterLevel;
    ULONG   ulI;
    
    if (iRebootType == LW_REBOOT_FORCE) {
        archReboot(iRebootType, ulStartAddress);                        /*  调用体系架构重启操作        */
        _BugHandle(LW_TRUE, LW_TRUE, "kernel reboot error!\r\n");       /*  不会运行到这里              */
    }

    if (LW_CPU_GET_CUR_NESTING() || (API_ThreadIdSelf() != API_KernelGetExc())) {
        _excJobAdd(API_KernelRebootEx, (PVOID)iRebootType, (PVOID)ulStartAddress, 0, 0, 0, 0);
        return;
    }

    _DebugHandle(__LOGMESSAGE_LEVEL, "kernel rebooting...\r\n");
    
    _K_ulRebootStartAddress = ulStartAddress;                           /*  记录局部变量, 防止 XXX      */
    
#if LW_CFG_SMP_EN > 0
    if (LW_NCPUS > 1) {
        __makeOtherDown();                                              /*  将其他 CPU 设置为 idle 模式 */
    }
#endif                                                                  /*  LW_CFG_SMP_EN               */
    
    if (iRebootType != LW_REBOOT_FORCE) {
        __LW_KERNEL_REBOOT_HOOK(iRebootType);                           /*  调用回调函数                */
        _cppRtUninit();                                                 /*  卸载 C++ 运行时             */
    }
    
    for (ulI = 0; ulI < LW_CFG_MAX_INTER_SRC; ulI++) {
        API_InterVectorDisable(ulI);                                    /*  关闭所有中断                */
    }
    
    iregInterLevel = __KERNEL_ENTER_IRQ();                              /*  进入内核同时关闭中断        */

#if LW_CFG_CACHE_EN > 0
    API_CacheDisable(DATA_CACHE);                                       /*  禁能 CACHE                  */
    API_CacheDisable(INSTRUCTION_CACHE);
#endif                                                                  /*  LW_CFG_CACHE_EN > 0         */

#if LW_CFG_VMM_EN > 0
    API_VmmMmuDisable();                                                /*  关闭 MMU                    */
#endif                                                                  /*  LW_CFG_VMM_EN > 0           */

    archReboot(iRebootType, _K_ulRebootStartAddress);                   /*  调用体系架构重启操作        */
    
    _BugHandle(LW_TRUE, LW_TRUE, "kernel reboot error!\r\n");           /*  不会运行到这里              */
    
    __KERNEL_EXIT_IRQ(iregInterLevel);                                  /*  退出内核同时打开中断        */
}
예제 #21
0
/*********************************************************************************************************
** 函数名称: API_IoGetDrvLicense
** 功能描述: 获得指定驱动程序的许可证信息
** 输 入  : 
**           iDrvNum                       驱动程式号 (主设备号)
** 输 出  : 许可证字符串
** 全局变量: 
** 调用模块: 
                                           API 函数
********************************************************************************************************/
LW_API  
PCHAR   API_IoGetDrvLicense (INT  iDrvNum)
{
    REGISTER LW_DRV_LICENSE     *pdrvlic;
    
    if (iDrvNum >= LW_CFG_MAX_DRIVERS ||
        iDrvNum <  0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (LW_NULL);
    }
        
    if (_S_deventryTbl[iDrvNum].DEVENTRY_bInUse == LW_FALSE) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (LW_NULL);
    }
    
    pdrvlic = &_S_deventryTbl[iDrvNum].DEVENTRY_drvlicLicense;
    
    return  (pdrvlic->DRVLIC_pcLicense);
}
예제 #22
0
/*********************************************************************************************************
** 函数名称: spiBusDrv
** 功能描述: 初始化 spi 总线并获取驱动程序
** 输 入  : uiChannel         通道号
** 输 出  : spi 总线驱动程序
** 全局变量:
** 调用模块:
*********************************************************************************************************/
PLW_SPI_FUNCS  spiBusDrv (UINT  uiChannel)
{
    if (uiChannel >= LS1X_SPI_CHANNEL_NR) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "spiBusDrv(): spi channel invalid!\r\n");
        return  (LW_NULL);
    }

    if (ls1xSpiInit(&_G_ls1xSpiChannels[uiChannel]) != ERROR_NONE) {
        return  (LW_NULL);
    }

    return  (&_G_ls1xSpiFuncs[uiChannel]);
}
예제 #23
0
LW_API  
LW_OBJECT_HANDLE  API_TimerCreate (CPCHAR             pcName,
                                   ULONG              ulOption,
                                   LW_OBJECT_ID      *pulId)
{
    REGISTER PLW_CLASS_TIMER       ptmr;
    REGISTER ULONG                 ulIdTemp;
    
    if (LW_CPU_GET_CUR_NESTING()) {                                     /*  不能在中断中调用            */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n");
        _ErrorHandle(ERROR_KERNEL_IN_ISR);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
    if (_Object_Name_Invalid(pcName)) {                                 /*  检查名字有效性              */
        _DebugHandle(__ERRORMESSAGE_LEVEL, "name too long.\r\n");
        _ErrorHandle(ERROR_KERNEL_PNAME_TOO_LONG);
        return  (LW_OBJECT_HANDLE_INVALID);
    }
    
    __KERNEL_MODE_PROC(
        ptmr = _Allocate_Timer_Object();                                /*  获得一个定时器控制块        */
    );
예제 #24
0
/*********************************************************************************************************
** 函数名称: API_IoSetDrvDescroption
** 功能描述: 设置指定驱动程序的描述信息
** 输 入  : 
**           iDrvNum                       驱动程式号 (主设备号)
**           pcDescription                 描述信息
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
********************************************************************************************************/
LW_API  
INT   API_IoSetDrvDescription (INT  iDrvNum, PCHAR  pcDescription)
{
    REGISTER LW_DRV_LICENSE     *pdrvlic;
    
    if (iDrvNum >= LW_CFG_MAX_DRIVERS ||
        iDrvNum <  0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
        
    if (_S_deventryTbl[iDrvNum].DEVENTRY_bInUse == LW_FALSE) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "driver invalidate.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
    
    pdrvlic = &_S_deventryTbl[iDrvNum].DEVENTRY_drvlicLicense;
    
    pdrvlic->DRVLIC_pcDescription = pcDescription;
    
    return  (ERROR_NONE);
}
예제 #25
0
파일: virPage.c 프로젝트: Ga-vin/libsylixos
/*********************************************************************************************************
** 函数名称: __vmmVirtualCreate
** 功能描述: 创建虚拟空间区域.
** 输 入  : ulAddr            起始地址
**           stSize            虚拟空间大小
** 输 出  : ERROR CODE
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
ULONG  __vmmVirtualCreate (addr_t  ulAddr, size_t  stSize)
{
    REGISTER PLW_MMU_CONTEXT  pmmuctx = __vmmGetCurCtx();
    REGISTER ULONG            ulError;

    ulError = __pageZoneCreate(&pmmuctx->MMUCTX_vmzoneVirtual, ulAddr, stSize, LW_ZONE_ATTR_NONE,
                               __VMM_PAGE_TYPE_VIRTUAL);
    if (ulError) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "kernel low memory.\r\n");
        return  (ulError);
    
    } else {
        return  (ERROR_NONE);
    }
}
예제 #26
0
/*********************************************************************************************************
** 函数名称: API_CoroutineStackCheck
** 功能描述: 检测一个协程的堆栈使用量!!, 该协程的父系线程建立时必须使用 STK_CHK 选项.
** 输 入  : pvCrcb                        协程句柄
**           pstFreeByteSize               空闲堆栈大小   (可为 LW_NULL)
**           pstUsedByteSize               使用堆栈大小   (可为 LW_NULL)
**           pstCrcbByteSize               协程控制块大小 (可为 LW_NULL)
** 输 出  : ERROR
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
ULONG   API_CoroutineStackCheck (PVOID      pvCrcb,
                                 size_t    *pstFreeByteSize,
                                 size_t    *pstUsedByteSize,
                                 size_t    *pstCrcbByteSize)
{
    REGISTER PLW_CLASS_COROUTINE   pcrcb = (PLW_CLASS_COROUTINE)pvCrcb;
    REGISTER size_t                stTotal;
    REGISTER size_t                stFree = 0;
    
    REGISTER PLW_STACK             pstkButtom;

    if (!pcrcb) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "coroutine handle invalidate.\r\n");
        _ErrorHandle(EINVAL);
        return  (EINVAL);
    }
    
    __KERNEL_ENTER();                                                   /*  进入内核                    */
    stTotal = pcrcb->COROUTINE_stStackSize;                             /*  总大小                      */
    
#if CPU_STK_GROWTH == 0                                                 /*  寻找堆栈头尾                */
    for (pstkButtom = pcrcb->COROUTINE_pstkStackBottom;
         *pstkButtom == _K_stkFreeFlag;
         pstkButtom--,
         stFree++);
#else
    for (pstkButtom = pcrcb->COROUTINE_pstkStackBottom;
         *pstkButtom == _K_stkFreeFlag;
         pstkButtom++,
         stFree++);
#endif
    __KERNEL_EXIT();                                                    /*  退出内核                    */
    
    if (pstFreeByteSize) {
        *pstFreeByteSize = stFree * sizeof(LW_STACK);
    }
    
    if (pstUsedByteSize) {
        *pstUsedByteSize = (stTotal - stFree) * sizeof(LW_STACK);
    }
    
    if (pstCrcbByteSize) {
        *pstCrcbByteSize = sizeof(LW_CLASS_COROUTINE);
    }
    
    return  (ERROR_NONE);
}
예제 #27
0
/*********************************************************************************************************
** 函数名称: archCacheInit
** 功能描述: 初始化 CACHE
** 输 入  : uiInstruction  指令 CACHE 参数
**           uiData         数据 CACHE 参数
**           pcMachineName  机器名称
** 输 出  : NONE
** 全局变量:
** 调用模块:
*********************************************************************************************************/
VOID  archCacheInit (CACHE_MODE  uiInstruction, CACHE_MODE  uiData, CPCHAR  pcMachineName)
{
    LW_CACHE_OP *pcacheop = API_CacheGetLibBlock();

    _DebugFormat(__LOGMESSAGE_LEVEL, "%s L1 cache controller initialization.\r\n", pcMachineName);

    if (lib_strcmp(pcMachineName, MIPS_MACHINE_LS1X) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_24KF) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_LS2X) == 0 ||
        lib_strcmp(pcMachineName, MIPS_MACHINE_JZ47XX) == 0) {
        mips32CacheInit(pcacheop, uiInstruction, uiData, pcMachineName);

    } else {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "unknown machine name.\r\n");
    }
}
예제 #28
0
VOID  API_KernelSecondaryStart (PKERNEL_START_ROUTINE  pfuncStartHook)
{
    KN_SMP_MB();
    while (KN_SECONDARY_WAIT()) {
        LW_SPINLOCK_DELAY();                                            /*  短延迟并释放总线            */
    }
    
    _KernelSecondaryLowLevelInit();                                     /*  从核底层初始化              */
    
    _DebugHandle(__LOGMESSAGE_LEVEL, "kernel secondary cpu usrStartup...\r\n");
    if (pfuncStartHook) {                                               /*  用户是否要求需要初始化      */
        pfuncStartHook();                                               /*  用户系统初始化              */
    }

    _KernelSecondaryCoreStartup(LW_CPU_GET_CUR());                      /*  主核初始化完毕直接启动多任务*/
}
예제 #29
0
/*********************************************************************************************************
** 函数名称: API_EventfdDevCreate
** 功能描述: 安装 eventfd 设备
** 输 入  : NONE
** 输 出  : 设备是否创建成功
** 全局变量: 
** 调用模块: 
                                           API 函数
*********************************************************************************************************/
LW_API  
INT  API_EventfdDevCreate (VOID)
{
    if (_G_iEvtfdDrvNum <= 0) {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "no driver.\r\n");
        _ErrorHandle(ERROR_IO_NO_DRIVER);
        return  (PX_ERROR);
    }
    
    if (iosDevAddEx(&_G_evtfddev.ED_devhdrHdr, LW_EVTFD_DEV_PATH, 
                    _G_iEvtfdDrvNum, DT_CHR) != ERROR_NONE) {
        return  (PX_ERROR);
    }
    
    return  (ERROR_NONE);
}
예제 #30
0
VOID  archFpuSecondaryInit (CPCHAR  pcMachineName, CPCHAR  pcFpuName)
{
    _DebugFormat(__LOGMESSAGE_LEVEL, "%s %s FPU sec-core initialization.\r\n", 
                 pcMachineName, pcFpuName);

    if (lib_strcmp(pcFpuName, PPC_FPU_NONE) == 0) {                     /*  选择 VFP 架构               */
        ppcVfpNoneSecondaryInit(pcMachineName, pcFpuName);
    
    } else if (lib_strcmp(pcFpuName, PPC_FPU_VFP) == 0) {
        ppcVfpSecondaryInit(pcMachineName, pcFpuName);

    } else {
        _DebugHandle(__ERRORMESSAGE_LEVEL, "unknown fpu name.\r\n");
        return;
    }
}