original files of m241
This commit is contained in:
@@ -0,0 +1,534 @@
|
||||
/* windLibP.h - VxWorks kernel header file */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 2002-2003, 2005-2010, 2012, 2016, 2018
|
||||
* Wind River Systems, Inc.
|
||||
*
|
||||
* The right to copy, distribute, modify, or otherwise make use
|
||||
* of this software may be licensed only pursuant to the terms
|
||||
* of an applicable Wind River license agreement.
|
||||
*/
|
||||
|
||||
/*
|
||||
modification history
|
||||
--------------------
|
||||
03g,18jul18,r_h Add kernel page table isolation support (F10571)
|
||||
03f,04may16,cww Updated EDR_SYSTEM_FATAL_INJECT and moved to edrLib
|
||||
03e,25apr16,jmp Imported V7COR-1264 fix from vxWorks 7 for WB4 debug support:
|
||||
added windClientStop() and windClientCont() private APIs to be
|
||||
able to get rid of the debug agent events generated by taskStop
|
||||
hooks in UP. (V7COR-1264)
|
||||
03d,18apr12,jpb Defect# WIND00309765. Removed duplicate definition for
|
||||
windTaskStateChange.
|
||||
03c,29mar12,zl added windStopClear() to support taskReset() (WIND00117574)
|
||||
03b,27oct10,gls added windStateRequestService() (WIND00204208)
|
||||
03a,01jun10,gls added WIND_STOP client ID support (WIND00210700)
|
||||
02z,13aug10,cww Use dynamically generated offsets in offset macros
|
||||
02y,16jun10,pcs Change the data type of timeout from an int to _Vx_ticks_t
|
||||
02x,26apr10,cww LP64 SMP update
|
||||
02w,30mar10,pad Moved declaration of extern C block for C++ after the
|
||||
inclusion of header files.
|
||||
02v,21oct09,cww Moved _func_windTickAnnounceHook to windLibP.h
|
||||
02t,21sep09,s_s changed INT_CPU_LOCK() and INT_CPU_UNLOCK() to
|
||||
KERNEL_INT_CPU_LOCK() and KERNEL_INT_CPU_UNLOCK()
|
||||
(WIND00181479)
|
||||
02u,01jun09,zl updated windRotate() arguments
|
||||
02t,11feb09,zl removed qLib.h inclusion
|
||||
02s,07jul08,gls added kernel lock free fast path for SMP semaphores
|
||||
02r,24jun08,jpb Added include path for kernel configurations options set in
|
||||
vsb. Renamed _WRS_VX_SMP to _WRS_CONFIG_SMP.
|
||||
02q,11mar08,to include taskLibP.h to use taskIdCurrent for UP
|
||||
02p,22feb08,zl removed unused SMP scheduler prototypes
|
||||
02o,05oct07,gls added _WRS_ASM_EXTERN_KERNEL_GLOBALS (defect #00106175)
|
||||
02n,11sep07,pch CQ101748: add EDR_SYSTEM_FATAL_INJECT temporarily
|
||||
02m,08aug07,zl added windSchedulerRestore().
|
||||
02l,18jul07,lei added windPendQCheckGet() for SMP.
|
||||
02k,06may07,dlk Add my_tkt for kernel ticket lock implementation.
|
||||
02j,30apr07,lei renamed cpu_reschedNeeded to cpu_reschedMode;
|
||||
added _WRS_KERNEL_CPU_GLOBAL_OR/[NORMAL RR]_RESCHEDULE;
|
||||
changed windSchedulerAdd/windCpcNeedReschedule API.
|
||||
02i,26apr07,mmi move tickLib definitions to tickLibP.h
|
||||
02h,18apr07,jmg Moved _IS_INT_CONTEXT() and VX_INT_RESTRICT() to intLibP.h
|
||||
02g,12apr07,jmg Changed intCpuLock()/Unlock to INT_CPU_LOCK/UNLOCK
|
||||
02f,13mar07,lei added windCpcNeedReschedule API and cpu_reschedNeeded;
|
||||
removed unused windCpcReschedule()
|
||||
02e,29jan07,lei added/renamed windScheduler[AddToAll RemoveFromAll Add Remove];
|
||||
removed _WRS_ARCH_HAS_IDLE_TASK.
|
||||
02d,07feb07,jmg Removed vxTicks
|
||||
02c,22jan07,jmg Added Function windRotate() (Req WIND00071010).
|
||||
02b,11jan07,aeg removed windSpawn().
|
||||
02a,12dec06,kk clean up global arrays, now replaced by per-CPU globals,
|
||||
removed references to reschedule stack
|
||||
01z,05dec06,jln embedded WORK_Q_IX structure
|
||||
01y,15nov06,mmi removed old spinlock, update vxKernelVars
|
||||
01x,01nov06,gls renamed windCpcSuspend() to windCpcStateChange()
|
||||
added windHold() and windRelease()
|
||||
01w,31oct06,lei surrounded IS_KERNEL_IDLE with "#ifdef _WRS_ARCH_HAS_IDLE_TASK"
|
||||
01v,17oct06,lei added cpu_idleTaskId; removed coreEnabledTbl/cpu_kernelIsIdle;
|
||||
updated WIND_VAR offset.
|
||||
01u,27sep06,pcs Remove macros IS_KERNEL_STATE and IS_KERNEL_STATE_ME since
|
||||
they are the same as KERNEL_ENTERED and KERNEL_ENTERED_ME
|
||||
01t,27sep06,lei Added coreEnabledTbl
|
||||
01s,15sep06,lei Added _WRS_ARCH_HAS_NEW_KERNEL_LOCK.
|
||||
01r,04sep06,mmi introduce winVars as struct-in-struct for alignment
|
||||
01q,01sep06,gls cleaned up support for vxKernelVars[]
|
||||
01p,01jul06,jln added Macros for windPriNormalSet and windPrioritySet()
|
||||
01o,18aug06,lei Added windCpcSuspend().
|
||||
01n,17Aug06,mmi #if VX_KERNEL_VARS => #ifdef
|
||||
fixed _WRS_KERNEL_CPU_GLOBAL_GET()
|
||||
01m,11Aug06,mmi add SMP workQ, spinLockCnt, VX_KERNEL_VARS
|
||||
01l,08aug06,pch Ensure arch definitions of _WRS_WIND_VARS_ALIGN and
|
||||
_WRS_CPU_INDEX_GET are included ahead of the fallback
|
||||
definitions here.
|
||||
01k,21jul06,lei SMP clean up; added windSchedulerAdd/Remove/Resort API
|
||||
01j,11jul06,zl added per-CPU WIND_VARS structure and the C access macros.
|
||||
01i,02feb06,lei moved the declaration of kernelState
|
||||
01h,14apr05,kk removed prototypes for tick64[SG]et, moved to tickLib.h
|
||||
01g,02jun05,md added SMP support
|
||||
01f,04aug03,elg Add support for new task status: define
|
||||
windStop()/windCont().
|
||||
01e,28may03,rec Power management, add windTickAnnounceN and windTickWaitGet
|
||||
01d,22may02,jgn move vxTicks & vxAbsTicks here - SPR #70255
|
||||
01c,22sep92,rrr added support for c++
|
||||
01b,19jul92,pme added windReadyQPut() and windReadyQRemove().
|
||||
windPendQPut(), windDelete(), windPendQRemove() return STATUS.
|
||||
01a,04jul92,jcf extracted from wind.h.
|
||||
*/
|
||||
|
||||
#ifndef __INCwindLibPh
|
||||
#define __INCwindLibPh
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <vsbConfig.h>
|
||||
#include <vwModNum.h>
|
||||
#include <private/qLibP.h>
|
||||
#include <private/taskLibP.h>
|
||||
#include <taskLib.h>
|
||||
#include <semLib.h>
|
||||
#include <sysLib.h>
|
||||
|
||||
#if defined (_WRS_INLINE_KERNEL_GLOBAL_ACCESS) || \
|
||||
defined (_WRS_CONFIG_KPTI)
|
||||
#include ARCH_HEADER(private/windArchLibP.h)
|
||||
#endif /* _WRS_INLINE_KERNEL_GLOBAL_ACCESS */
|
||||
|
||||
#ifndef _ASMLANGUAGE
|
||||
#include <private/wdLibP.h>
|
||||
#include <private/workQLibP.h>
|
||||
#include <private/kernelLibP.h>
|
||||
|
||||
#ifdef _WRS_CONFIG_SMP
|
||||
#include <private/vxSmpP.h>
|
||||
#include <spinLockLib.h>
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef _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.
|
||||
*/
|
||||
|
||||
/* definitions */
|
||||
|
||||
/* macros */
|
||||
|
||||
# define _WRS_KERNEL_CPU_GLOBAL_OR(cpuid, glob, var) \
|
||||
vxKernelVars[cpuid].vars.cpu_##glob |= var
|
||||
|
||||
# define _WRS_KERNEL_CPU_GLOBAL_SET(cpuid, glob, var) \
|
||||
vxKernelVars[cpuid].vars.cpu_##glob = var
|
||||
|
||||
# define _WRS_KERNEL_CPU_GLOBAL_GET(cpuid, glob) \
|
||||
vxKernelVars[cpuid].vars.cpu_##glob
|
||||
|
||||
# define _WRS_KERNEL_GLOBAL_ACCESS(glob) \
|
||||
vxKernelVars[_WRS_CPU_INDEX_GET()].vars.cpu_##glob
|
||||
|
||||
# define _WRS_KERNEL_LOCKED_GLOBAL_SET(glob, var) \
|
||||
do \
|
||||
{ \
|
||||
int key = KERNEL_INT_CPU_LOCK (); /* prevent task migration */ \
|
||||
vxKernelVars[_WRS_CPU_INDEX_GET()].vars.cpu_##glob = var; \
|
||||
KERNEL_INT_CPU_UNLOCK (key); \
|
||||
} while ((0))
|
||||
|
||||
# define _WRS_KERNEL_LOCKED_GLOBAL_GET(glob, var) \
|
||||
do \
|
||||
{ \
|
||||
int key = KERNEL_INT_CPU_LOCK (); /* prevent task migration */ \
|
||||
var = vxKernelVars[_WRS_CPU_INDEX_GET()].vars.cpu_##glob; \
|
||||
KERNEL_INT_CPU_UNLOCK (key); \
|
||||
} while ((0))
|
||||
|
||||
#define IS_KERNEL_IDLE() kernelIsCpuIdle(_WRS_CPU_INDEX_GET())
|
||||
|
||||
/* type definitions */
|
||||
|
||||
/*
|
||||
* _WRS_WIND_VARS_ALIGN is architecture specific; it should be defined
|
||||
* for the common CPU build variants (e.g. PPC32, MIPS32, XSCALE, etc),
|
||||
* representing the maximum cache line size of the variants of the respective
|
||||
* arch. We default here to a globally acceptable value, but should be
|
||||
* overridden in <arch/xx/archXxx.h>
|
||||
*
|
||||
* Another consideration for _WRS_WIND_VARS_ALIGN is that, from
|
||||
* compiler and assembler optimization point of view, the alignment
|
||||
* should force the size of WIND_WARS structure to be a power of 2 value.
|
||||
* Since the size of data fields in WIND_WARS is at least 0x4c bytes, the
|
||||
* smallest _WRS_WIND_VARS_ALIGN that satisfies that requirement is 128.
|
||||
*/
|
||||
|
||||
#ifndef _WRS_WIND_VARS_ALIGN
|
||||
# define _WRS_WIND_VARS_ALIGN 128
|
||||
#endif
|
||||
|
||||
typedef struct _windVars
|
||||
{
|
||||
WIND_TCB * cpu_taskIdCurrent; /* 0x00/0x00: current task ID */
|
||||
ISR_ID cpu_isrIdCurrent; /* 0x04/0x08: current ISR ID */
|
||||
int cpu_errno; /* 0x08/0x10: */
|
||||
/* errno location (for ISRs) */
|
||||
int cpu_intCnt; /* 0x0c/0x14: interrupt nesting count */
|
||||
char * cpu_vxIntStackBase; /* 0x10/0x18: interrupt stack base */
|
||||
char * cpu_vxIntStackEnd; /* 0x14/0x20: interrupt stack end */
|
||||
WORK_Q_IX cpu_workQIx; /* 0x18/0x28: read, */
|
||||
/* 0x1c/0x2c: bitmask, */
|
||||
/* 0x20/0x30: write */
|
||||
volatile BOOL cpu_workQIsEmpty; /* 0x24/0x34: each workQ status */
|
||||
atomic32_t cpu_spinLockIsrCnt; /* 0x28/0x38: counting help spinlocks */
|
||||
atomic32_t cpu_spinLockTaskCnt; /* 0x2c/0x3c: counting help spinlocks */
|
||||
WIND_TCB * cpu_idleTaskId; /* 0x30/0x40: idle task ID */
|
||||
BOOL cpu_kernelIsIdle; /* 0x34/0x48: kernel idle state */
|
||||
int cpu_reschedMode; /* 0x38/0x4c: call "reschedule()" or */
|
||||
/* not */
|
||||
atomicVal_t cpu_my_tkt; /* 0x3c/0x50: ticket for kernel lock */
|
||||
int cpu_windPwrOffState; /* 0x40/0x58: power management state */
|
||||
#ifdef _WRS_CONFIG_LP64
|
||||
int pad; /* ----/0x5c: 64-bit alignment pad */
|
||||
#endif
|
||||
char * cpu_reserved1; /* 0x44/0x60: Reserved field one */
|
||||
char * cpu_reserved2; /* 0x48/0x68: Reserved field two */
|
||||
#ifdef _WRS_WIND_VARS_ARCH
|
||||
/*
|
||||
* _WRS_WIND_VARS_ARCH macro-definition can be used for specifying
|
||||
* architecture an specific fields for WIND_VARS.
|
||||
*/
|
||||
_WRS_WIND_VARS_ARCH; /* 0x4c/0x70: architecture specific */
|
||||
#endif /* _WRS_WIND_VARS_ARCH */
|
||||
} _WIND_VARS _WRS_DATA_ALIGN_BYTES (_WRS_WIND_VARS_ALIGN);
|
||||
|
||||
/*
|
||||
* Wrapper structure to force the structure alignment when used in
|
||||
* an array.
|
||||
*/
|
||||
|
||||
typedef struct windVars
|
||||
{
|
||||
_WIND_VARS vars;
|
||||
} WIND_VARS;
|
||||
|
||||
#ifndef _WRS_VX_KERNEL_VARS_SECTION_ATTR
|
||||
#define _WRS_VX_KERNEL_VARS_SECTION_ATTR
|
||||
#endif
|
||||
|
||||
|
||||
/* reschedule mode bit mask */
|
||||
|
||||
#define WIND_NO_RESCHEDULE 0x0
|
||||
#define WIND_NORMAL_RESCHEDULE 0x1
|
||||
#define WIND_RR_RESCHEDULE 0x2
|
||||
|
||||
/* variable declaration */
|
||||
|
||||
extern WIND_VARS _WRS_VX_KERNEL_VARS_SECTION_ATTR vxKernelVars[];
|
||||
|
||||
#else /* _WRS_CONFIG_SMP */
|
||||
|
||||
/* cpuid arg is ignored */
|
||||
|
||||
#define _WRS_KERNEL_CPU_GLOBAL_GET(ignored, glob) (glob)
|
||||
#define _WRS_KERNEL_CPU_GLOBAL_SET(ignored, glob, var) (glob = var)
|
||||
#define _WRS_KERNEL_GLOBAL_ACCESS(glob) (glob)
|
||||
#define _WRS_KERNEL_LOCKED_GLOBAL_SET(glob, var) glob = var
|
||||
#define _WRS_KERNEL_LOCKED_GLOBAL_GET(glob, var) var = glob
|
||||
|
||||
#define IS_KERNEL_IDLE() (kernelIsIdle)
|
||||
|
||||
/* variable declaration */
|
||||
|
||||
extern BOOL kernelIsIdle; /* boolean reflecting idle state */
|
||||
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
#ifdef _WRS_CONFIG_KPTI
|
||||
|
||||
/*
|
||||
* RTP per-CPU structure accessible in supervisor mode with the user-mode page
|
||||
* table. The strucure is located in a special region (KERNEL_RTP_SUP_RGN_BASE).
|
||||
* Note: unlike the vxKernelVars, this is used for UP as well.
|
||||
* Fields:
|
||||
* cpu_pUTcbCurrent - used for implementing the fast system call.
|
||||
*/
|
||||
|
||||
|
||||
typedef struct _windRtpVars
|
||||
{
|
||||
struct windUTcb * cpu_pUTcbCurrent; /* 0x00/0x00: current user TCB */
|
||||
ULONG cpu_cpuIndex; /* 0x04/0x08: for future use */
|
||||
ULONG cpu_reserved2; /* 0x08/0x10: for future use */
|
||||
ULONG cpu_reserved1; /* 0x10/0x18: for future use */
|
||||
#ifdef _WRS_WIND_RTP_VARS_ARCH
|
||||
_WRS_WIND_RTP_VARS_ARCH;
|
||||
#endif
|
||||
} _WIND_RTP_VARS _WRS_DATA_ALIGN_BYTES (_WRS_WIND_RTP_VARS_ALIGN);
|
||||
|
||||
typedef struct windRtpVars
|
||||
{
|
||||
_WIND_RTP_VARS vars;
|
||||
} WIND_RTP_VARS;
|
||||
|
||||
extern WIND_RTP_VARS * pWindRtpVars;
|
||||
|
||||
#define _WRS_WIND_RTP_VARS_ACCESS(cpu, var) \
|
||||
((pWindRtpVars) + (cpu))->vars.cpu_##var
|
||||
|
||||
#endif /* _WRS_CONFIG_KPTI */
|
||||
|
||||
extern void (*_func_windTickAnnounceHook)(TASK_ID);
|
||||
|
||||
/*
|
||||
* The following four MACROs are used to lower task's normal priority.
|
||||
* They are used in windPrioNormalSet() and windPrioritySet(), and they
|
||||
* are also used to support user side POSIX thread with SCHED_SPOARDIC policy.
|
||||
*/
|
||||
|
||||
#define WIND_CHECK_LOWER_PRIORITY(pTcb, priority) \
|
||||
((pTcb->priInheritCnt == 0) && (pTcb->priority < priority))
|
||||
|
||||
#define WIND_GET_LOWER_PRIORITY(pTcb, priority) \
|
||||
do \
|
||||
{ \
|
||||
if (pTcb->priNormal != pTcb->priDrop) \
|
||||
priority = pTcb->priDrop; \
|
||||
} while ((0))
|
||||
|
||||
/*
|
||||
* The following macros modify either the priDrop or priNormal fields of
|
||||
* the TCB. For SMP systems these must be atomic operations to allow
|
||||
* a task to view its own values outside of the kernel.
|
||||
*/
|
||||
|
||||
#ifndef _WRS_CONFIG_SMP
|
||||
|
||||
#define WIND_SET_RUNNING_PRIORITY(pTcb, priority) \
|
||||
do \
|
||||
{ \
|
||||
pTcb->priority = priority; \
|
||||
} while ((0))
|
||||
|
||||
#define WIND_SET_NORMAL_PRIORITY(pTcb, priNormal) \
|
||||
do \
|
||||
{ \
|
||||
if ((priNormal < pTcb->priDrop) || \
|
||||
(pTcb->priMutexCnt == pTcb->priInheritCnt)) \
|
||||
{ /* Raise or lower <priDrop> */ \
|
||||
pTcb->priDrop = priNormal; \
|
||||
} \
|
||||
pTcb->priNormal = priNormal; /* Update normal priority */ \
|
||||
} while ((0))
|
||||
#else /* _WRS_CONFIG_SMP */
|
||||
#define WIND_SET_RUNNING_PRIORITY(pTcb, priority) \
|
||||
do \
|
||||
{ \
|
||||
vxAtomic32Set_inline ((atomic32_t *) &pTcb->priority, \
|
||||
(atomic32Val_t) priority); \
|
||||
} while ((0))
|
||||
|
||||
#define WIND_SET_NORMAL_PRIORITY(pTcb, priNormal) \
|
||||
do \
|
||||
{ \
|
||||
if ((priNormal < pTcb->priDrop) || \
|
||||
(pTcb->priMutexCnt == pTcb->priInheritCnt)) \
|
||||
{ /* Raise or lower <priDrop> */ \
|
||||
vxAtomic32Set_inline ((atomic32_t *) &pTcb->priDrop, \
|
||||
(atomic32Val_t) priNormal); \
|
||||
} \
|
||||
/* Update normal priority */ \
|
||||
vxAtomic32Set_inline ((atomic32_t *) &pTcb->priNormal, \
|
||||
(atomic32Val_t) priNormal); \
|
||||
} while ((0))
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
/* function declarations */
|
||||
|
||||
extern STATUS windDelete (WIND_TCB * pTcb);
|
||||
extern void windSuspend (WIND_TCB * pTcb);
|
||||
extern void windResume (WIND_TCB * pTcb);
|
||||
extern void windStop (WIND_TCB * pTcb);
|
||||
extern void windCont (WIND_TCB * pTcb);
|
||||
extern void windStopClear (WIND_TCB * pTcb);
|
||||
extern void windHold (WIND_TCB * pTcb);
|
||||
extern void windRelease (WIND_TCB * pTcb);
|
||||
extern void windPriNormalSet (WIND_TCB * pTcb, UINT priNormal);
|
||||
extern void windPrioritySet (WIND_TCB * pTcb, UINT priority);
|
||||
extern void windSemDelete (SEM_ID semId);
|
||||
extern void windTickAnnounce (void);
|
||||
extern void windTickAnnounceN (_Vx_ticks_t nTicks);
|
||||
extern _Vx_ticks_t windTickWaitGet (void);
|
||||
extern STATUS windDelay (_Vx_ticks_t timeout);
|
||||
extern STATUS windUndelay (WIND_TCB * pTcb);
|
||||
extern STATUS windWdStart (WDOG * wdId, _Vx_ticks_t timeout);
|
||||
extern void windWdCancel (WDOG * wdId);
|
||||
extern void windPendQGet (Q_HEAD * pQHead);
|
||||
extern void windReadyQPut (WIND_TCB * pTcb);
|
||||
extern void windReadyQRemove (Q_HEAD * pQHead, _Vx_ticks_t timeout);
|
||||
extern void windPendQFlush (Q_HEAD * pQHead);
|
||||
extern STATUS windPendQPut (Q_HEAD * pQHead, _Vx_ticks_t timeout);
|
||||
extern STATUS windPendQRemove (WIND_TCB * pTcb);
|
||||
extern STATUS windRotate (void * pArg, int priority);
|
||||
extern void windPendQTerminate (Q_HEAD * pQHead);
|
||||
extern STATUS windExit (void);
|
||||
extern void windIntStackSet (char * pBotStack);
|
||||
extern void * windNullReturn (void);
|
||||
|
||||
extern void vxTaskEntry (void);
|
||||
|
||||
/*
|
||||
* These cannot be declared with a void argument list as the routines vary by
|
||||
* architecture
|
||||
*/
|
||||
|
||||
extern void intEnt ();
|
||||
extern void intExit ();
|
||||
|
||||
extern void windClientStop (WIND_TCB * pTcb, UINT clientId,
|
||||
UINT * pClientCnt);
|
||||
extern void windClientCont (WIND_TCB * pTcb, UINT clientId,
|
||||
UINT * pClientCnt);
|
||||
#ifdef _WRS_CONFIG_SMP
|
||||
extern void windTaskStateChange (WIND_TCB * pTcb, int state);
|
||||
extern STATUS windCpcTaskStateChange (void * pParam, size_t size);
|
||||
extern void windRescheduleNotify (void);
|
||||
extern void windPendQCheckGet (Q_HEAD * pQHead);
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* windStateRequestService - service a requested state change
|
||||
*
|
||||
* Service a task state change request.
|
||||
*
|
||||
* RETURNS: void
|
||||
*
|
||||
* ERRNO: N/A
|
||||
*
|
||||
* \NOMANUAL
|
||||
*/
|
||||
|
||||
_WRS_INLINE void windStateRequestService
|
||||
(
|
||||
FAST WIND_TCB * pTcb
|
||||
)
|
||||
{
|
||||
if (pTcb->windSmpInfo.stateRequest & WIND_SUSPEND)
|
||||
{
|
||||
windSuspend (pTcb);
|
||||
pTcb->windSmpInfo.stateRequest &= ~WIND_SUSPEND;
|
||||
}
|
||||
|
||||
if (pTcb->windSmpInfo.stateRequest & WIND_STOP)
|
||||
{
|
||||
/*
|
||||
* NOTE:
|
||||
*
|
||||
* If stoppage was requested while the caller was locked then
|
||||
* the client ID and count (if specified) was updated by the
|
||||
* CPC handler. Because of this the WIND_STOP_CLIENT_NONE is
|
||||
* specified here.
|
||||
*/
|
||||
|
||||
windClientStop (pTcb, WIND_STOP_CLIENT_NONE, NULL);
|
||||
|
||||
pTcb->windSmpInfo.stateRequest &= ~WIND_STOP;
|
||||
}
|
||||
}
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#else /* _ASMLANGUAGE */
|
||||
|
||||
/* macros for use in assembly files */
|
||||
|
||||
#ifndef _WRS_ASM_EXTERN_KERNEL_GLOBALS
|
||||
|
||||
#ifdef _WRS_CONFIG_SMP
|
||||
#define _WRS_ASM_EXTERN_KERNEL_GLOBALS \
|
||||
.extern vxKernelVars
|
||||
#else
|
||||
#define _WRS_ASM_EXTERN_KERNEL_GLOBALS \
|
||||
.extern taskIdCurrent ; \
|
||||
.extern kernelIsIdle ; \
|
||||
.extern intCnt ; \
|
||||
.extern vxIntStackBase ; \
|
||||
.extern vxIntStackEnd
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
#endif /* _WRS_ASM_EXTERN_KERNEL_GLOBALS */
|
||||
|
||||
/*
|
||||
* assembly offsets - these must be in an ASM section due to a circular
|
||||
* dependency when compiling offsets.c
|
||||
*
|
||||
* WARNING: the old offset macros are provided temporarily only for a
|
||||
* transitionary phase. They will be removed once existing references are
|
||||
* updated to use the dynamically generated offsets.
|
||||
*/
|
||||
|
||||
#ifdef _WRS_CONFIG_SMP
|
||||
|
||||
#include <private/offsetMacrosP.h>
|
||||
|
||||
#define _WRS_WIND_VARS_OFFSET_taskIdCurrent \
|
||||
_WIND_VARS_cpu_taskIdCurrent_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_isrIdCurrent \
|
||||
_WIND_VARS_cpu_isrIdCurrent_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_errno \
|
||||
_WIND_VARS_cpu_errno_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_intCnt \
|
||||
_WIND_VARS_cpu_intCnt_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_vxIntStackBase \
|
||||
_WIND_VARS_cpu_vxIntStackBase_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_vxIntStackEnd \
|
||||
_WIND_VARS_cpu_vxIntStackEnd_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_workQIx \
|
||||
_WIND_VARS_cpu_workQIx_OFFSET
|
||||
|
||||
#define _WRS_WIND_VARS_OFFSET_workQIsEmpty \
|
||||
_WIND_VARS_cpu_workQIsEmpty_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_idleTaskId \
|
||||
_WIND_VARS_cpu_idleTaskId_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_reschedMode \
|
||||
_WIND_VARS_cpu_reschedMode_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_my_tkt \
|
||||
_WIND_VARS_cpu_my_tkt_OFFSET
|
||||
#define _WRS_WIND_VARS_OFFSET_archVars \
|
||||
_WIND_VARS_cpu_archVars_OFFSET
|
||||
|
||||
|
||||
#endif /* _WRS_CONFIG_SMP */
|
||||
|
||||
#endif /* _ASMLANGUAGE */
|
||||
|
||||
#endif /* __INCwindLibPh */
|
||||
Reference in New Issue
Block a user