/* kernelLibP.h - private header file for kernelLib.c */ /* * Copyright (c) 1992, 2003, 2005-2010 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. No license to Wind River intellectual property rights * is granted herein. All rights not licensed by Wind River are reserved * by Wind River. */ /* modification history -------------------- 02g,30mar10,pad Moved declaration of extern C block for C++ after the inclusion of header files. Added _ASMLANGUAGE protection. 02g,11feb10,cww Updated usrSmpCpuEnableHook param name 02f,03feb10,cww Fixed usrSmpCpuEnableHook parameter (WIND00190082) 02f,04feb10,d_c Defect WIND190082: Fix prototype for usrSmpCpuEnableHook(). 02e,17sep09,s_s Added macro KERNEL_INT_CPU_LOCK/UNLOCK 02d,14jul09,s_s moved KERNEL_INT_CPU_LOCK/UNLOCK definition to intMicroLibP.h 02c,06jun09,kk added intLibP.h to pick up intCpuMicroLock 02b,04jun09,s_s added macro definition for intCpuMicroLock()/Unlock() 02c,20feb09,pcs Updated to add support for the LP64 data model. 02b,11feb09,zl removed qLib.h inclusion 02a,27aug08,jpb Renamed VSB header file 01z,08jul08,gls added warning about inclusion in semLibInline.h 01y,24jun08,jpb Added include path for kernel configurations options set in vsb. Renamed _WRS_VX_SMP to _WRS_CONFIG_SMP. 01x,17jun08,zl added code barriers for UP kernel state macros. 01w,29apr08,zl removal of SMP_Q_NODE, phase 2. 01v,19mar08,zl removal of SMP_Q_NODE, phase 1. 01u,11mar08,to include taskLibP.h first to use taskIdCurrent for UP 01t,12feb08,zl moved ready queue macros to windReadyQClassP.h 01s,05sep07,jmg Added vxcpuEnableTimeout, kernelCpuEnableInternal() and usrSmpCpuEnableHook(). 01r,31aug07,kk added _WRS_KERNEL_IS_TASKING() 01q,06mar07,lei added SMP_Q_NODE; updated PENDQ_NODE_PTR, READYQ_NODE_PTR and NODE_PTR_TO_TCB. 01p,20feb07,lei added PENDQ_NODE_PTR(), READYQ_NODE_PTR(), READYQ_NODE_TO_TCB and PENDQ_NODE_TO_TCB(); renamed SCHEDULER_[ADD REMOVE] to SCHEDULER_[ADD REMOVE]_ALL; removed smpchedulerAdd/Remove/Order. 01o,06dec06,jln change KERNEL_ENTERED_ME() to use in task context 01n,29nov06,cjj modified KERNEL_ENTERED_ME() for SMP 01m,15nov06,mmi switched to kernelLock API's 01l,08nov06,lei added kernelIdleTaskActivate() 01k,26sep06,pcs Add macro KERNEL_ENTERED_ME 01j,30aug06,lei added _WRS_ARCH_HAS_NEW_KERNEL_LOCK 01i,07aug06,pcs Modify macro KERNEL_LOCK to reflect introduction of OBJ locking/unlocking support. 01h,20jul06,lei SMP clean up: renamed local and global ready queue; removed the parameter for windExit 01g,17jul06,zl use _WRS_CPU_INDEX_GET() for CPU index. 01f,11aug05,dbt Added KERNEL_CONTEXT(), KERNEL_ENTER(), KERNEL_EXIT() macros. 01e,25may05,md added SMP support 01d,04feb05,pch SPR 102772: add usrKernelIntStkSizeAdj() 01c,07apr03,to removed activeQHead. 01b,22sep92,rrr added support for c++ 01a,04jul92,jcf created. */ #ifndef __INCkernelLibPh #define __INCkernelLibPh #include #include #include #include #include #include #include #include #include #ifdef _WRS_CONFIG_SMP #include #endif /* _WRS_CONFIG_SMP */ /* * ***** WARNING ***** * * This private header file is included by the public header file(s): * - h/inline/semLibInline.h * * Ensure that no usage of a VSB source configuration macro is made * by any structure or macro in this file that is also used(directly or * indirectly) by the above list of public header files. */ #ifndef _ASMLANGUAGE #ifdef __cplusplus extern "C" { #endif /* variable declarations */ extern BOOL roundRobinOn; /* state of round robin scheduling */ extern ULONG roundRobinSlice; /* round robin task slice in ticks */ extern TASK_ID rootTaskId; /* root task id */ extern char * pRootMemStart; /* bottom of root task's memory */ extern size_t rootMemNBytes; /* actual root task memory size */ extern Q_HEAD tickQHead; /* queue for timeouts/delays/wdogs */ #ifdef _WRS_CONFIG_SMP extern int vxCpuEnableTimeout; /* timeout for enabling CPUs */ #else /* _WRS_CONFIG_SMP */ extern BOOL kernelIsIdle; /* boolean reflecting idle state */ extern BOOL kernelState; /* mutex to enter kernel state */ #endif /* _WRS_CONFIG_SMP */ /* prototypes */ #ifdef _WRS_CONFIG_SMP extern STATUS kernelCpuEnableInternal (unsigned int cpuToEnable); extern STATUS usrSmpCpuEnableHook (UINT logicalCpuIndex); #endif extern void usrKernelIntStkSizeAdj(unsigned *, unsigned *, unsigned *, unsigned *); /* stack calculation configlette */ extern void kernelIdleTaskActivate (void); /* * Macro for determining whether the kernel is ready for tasking. * For SMP, bootstrap processor is always 0, hence, passing 0 as the * cpuid to get taskIdCurrent. For UP, simply access taskIdCurrent. */ #define _WRS_KERNEL_IS_TASKING() \ (_WRS_KERNEL_CPU_GLOBAL_GET(0, taskIdCurrent) == NULL ? FALSE : TRUE) /* macros for entering and exiting the kernel */ #ifdef _WRS_CONFIG_SMP # define KERNEL_ENTER() (KERNEL_LOCK_TAKE ()) # define KERNEL_EXIT() ( windExit () ) # define KERNEL_LOCK() # define KERNEL_UNLOCK() ( KERNEL_EXIT() ) # define KERNEL_ENTERED_ME() (KERNEL_LOCK_OWNED_BY_ME()) #else /* _WRS_CONFIG_SMP */ # define KERNEL_LOCK() \ do \ { \ VX_CODE_BARRIER(); \ kernelState = TRUE; \ VX_CODE_BARRIER(); \ } while ((0)) # define KERNEL_UNLOCK() windExit () # define KERNEL_ENTER() KERNEL_LOCK() # define KERNEL_EXIT() windExit () # define KERNEL_ENTERED_ME() (kernelState == TRUE) # define KERNEL_ENTERED() (KERNEL_ENTERED_ME()) #endif /* _WRS_CONFIG_SMP */ /* * macros translating queue node pointers to/from TCB pointers. Note that * starting with the 6.7 release these are the same for UP and SMP builds. */ #define PENDQ_NODE_PTR(pTcb) (&pTcb->qNode) #define NODE_PTR_TO_TCB(pNode) \ (WIND_TCB *) ((long) (pNode) - OFFSET (WIND_TCB, qNode)) #define KERNEL_INT_CPU_LOCK() INT_CPU_MICRO_LOCK() #define KERNEL_INT_CPU_UNLOCK(key) INT_CPU_MICRO_UNLOCK(key) #ifdef __cplusplus } #endif #endif /* _ASMLANGUAGE */ #endif /* __INCkernelLibPh */