update for HEAD-2003091401
[reactos.git] / ntoskrnl / include / internal / ps.h
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 2000 David Welch <welch@cwcom.net>
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  */
19 /* $Id$
20  *
21  * FILE:            ntoskrnl/ke/kthread.c
22  * PURPOSE:         Process manager definitions
23  * PROGRAMMER:      David Welch (welch@cwcom.net)
24  * UPDATE HISTORY:
25  *                  Created 22/05/98
26  */
27
28 #ifndef __INCLUDE_INTERNAL_PS_H
29 #define __INCLUDE_INTERNAL_PS_H
30
31 #ifndef __ASM__
32
33 /* Forward declarations. */
34 struct _KTHREAD;
35 struct _KTRAPFRAME;
36
37 #endif /* __ASM__ */
38
39 #include <internal/arch/ps.h>
40
41 #ifndef __ASM__
42
43 #include <internal/mm.h>
44 #include <napi/teb.h>
45
46 #ifndef __USE_W32API
47 #define KeGetCurrentProcessorNumber() (KeGetCurrentKPCR()->ProcessorNumber)
48 #endif
49
50 extern HANDLE SystemProcessHandle;
51
52 extern LCID PsDefaultThreadLocaleId;
53 extern LCID PsDefaultSystemLocaleId;
54
55 #ifndef __USE_W32API
56
57 typedef struct _KAPC_STATE
58 {
59    LIST_ENTRY ApcListHead[2];
60    struct _KPROCESS* Process;
61    UCHAR KernelApcInProgress;
62    UCHAR KernelApcPending;
63    USHORT UserApcPending;
64 } __attribute__((packed)) KAPC_STATE, *PKAPC_STATE;
65
66 #endif /* __USE_W32API */
67
68 typedef struct _KTHREAD
69 {
70    /* For waiting on thread exit */
71    DISPATCHER_HEADER DispatcherHeader;    /* 00 */
72    
73    /* List of mutants owned by the thread */
74    LIST_ENTRY        MutantListHead;      /* 10 */
75    PVOID             InitialStack;        /* 18 */
76    ULONG             StackLimit;          /* 1C */
77    
78    /* Pointer to the thread's environment block in user memory */
79    PTEB              Teb;                 /* 20 */
80    
81    /* Pointer to the thread's TLS array */
82    PVOID             TlsArray;            /* 24 */
83    PVOID             KernelStack;         /* 28 */
84    UCHAR             DebugActive;         /* 2C */
85    
86    /* Thread state (one of THREAD_STATE_xxx constants below) */
87    UCHAR             State;               /* 2D */
88    UCHAR             Alerted[2];          /* 2E */
89    UCHAR             Iopl;                /* 30 */
90    UCHAR             NpxState;            /* 31 */
91    UCHAR             Saturation;          /* 32 */
92    CHAR              Priority;            /* 33 */
93    KAPC_STATE        ApcState;            /* 34 */
94    ULONG             ContextSwitches;     /* 4C */
95    ULONG             WaitStatus;          /* 50 */
96    KIRQL             WaitIrql;            /* 54 */
97    UCHAR             WaitMode;            /* 55 */
98    UCHAR             WaitNext;            /* 56 */
99    UCHAR             WaitReason;          /* 57 */
100    PKWAIT_BLOCK      WaitBlockList;       /* 58 */
101    LIST_ENTRY        WaitListEntry;       /* 5C */
102    ULONG             WaitTime;            /* 64 */
103    CHAR              BasePriority;        /* 68 */
104    UCHAR             DecrementCount;      /* 69 */
105    UCHAR             PriorityDecrement;   /* 6A */
106    UCHAR             Quantum;             /* 6B */
107    KWAIT_BLOCK       WaitBlock[4];        /* 6C */
108    PVOID             LegoData;            /* CC */
109    LONG              KernelApcDisable;    /* D0 */
110    KAFFINITY         UserAffinity;        /* D4 */
111    UCHAR             SystemAffinityActive;/* D8 */
112    UCHAR             PowerState;          /* D9 */
113    UCHAR             NpxIrql;             /* DA */
114    UCHAR             Pad;                 /* DB */
115    SSDT_ENTRY        *ServiceTable;       /* DC */
116    PKQUEUE           Queue;               /* E0 */
117    KSPIN_LOCK        ApcQueueLock;        /* E4 */
118    KTIMER            Timer;               /* E8 */
119    LIST_ENTRY        QueueListEntry;      /* 110 */
120    KAFFINITY         Affinity;            /* 118 */
121    UCHAR             Preempted;           /* 11C */
122    UCHAR             ProcessReadyQueue;   /* 11D */
123    UCHAR             KernelStackResident; /* 11E */
124    UCHAR             NextProcessor;       /* 11F */
125    PVOID             CallbackStack;       /* 120 */
126    BOOL              Win32Thread;         /* 124 */
127    struct _KTRAP_FRAME*      TrapFrame;   /* 128 */
128    PVOID             ApcStatePointer[2];  /* 12C */
129    UCHAR             EnableStackSwap;     /* 134 */
130    UCHAR             LargeStack;          /* 135 */
131    UCHAR             ResourceIndex;       /* 136 */
132    UCHAR             PreviousMode;        /* 137 */
133    ULONG             KernelTime;          /* 138 */
134    ULONG             UserTime;            /* 13C */
135    KAPC_STATE        SavedApcState;       /* 140 */
136    UCHAR             Alertable;           /* 158 */
137    UCHAR             ApcStateIndex;       /* 159 */
138    UCHAR             ApcQueueable;        /* 15A */
139    UCHAR             AutoAlignment;       /* 15B */
140    PVOID             StackBase;           /* 15C */
141    KAPC              SuspendApc;          /* 160 */
142    KSEMAPHORE        SuspendSemaphore;    /* 190 */
143    LIST_ENTRY        ThreadListEntry;     /* 1A4 */
144    CHAR              FreezeCount;         /* 1AC */
145    UCHAR             SuspendCount;        /* 1AD */
146    UCHAR             IdealProcessor;      /* 1AE */
147    UCHAR             DisableBoost;        /* 1AF */
148    
149    /*
150     * Below here are thread structure members that are specific to ReactOS
151     */
152    
153    /* Added by Phillip Susi for list of threads in a process */
154    LIST_ENTRY        ProcessThreadListEntry;         /* 1B0 */
155 } __attribute__((packed)) KTHREAD;
156
157 /* Top level irp definitions. */
158 #define         FSRTL_FSP_TOP_LEVEL_IRP                 (0x01)
159 #define         FSRTL_CACHE_TOP_LEVEL_IRP               (0x02)
160 #define         FSRTL_MOD_WRITE_TOP_LEVEL_IRP           (0x03)
161 #define         FSRTL_FAST_IO_TOP_LEVEL_IRP             (0x04)
162 #define         FSRTL_MAX_TOP_LEVEL_IRP_FLAG            (0x04)
163
164 typedef struct _TOP_LEVEL_IRP
165 {
166         PIRP TopLevelIrp;
167         ULONG TopLevelIrpConst;
168 } TOP_LEVEL_IRP;
169
170 typedef struct
171 {
172    PACCESS_TOKEN Token;                              // 0x0
173    UCHAR Unknown1;                                   // 0x4
174    UCHAR Unknown2;                                   // 0x5
175    UCHAR Pad[2];                                     // 0x6
176    SECURITY_IMPERSONATION_LEVEL Level;               // 0x8
177 } PS_IMPERSONATION_INFO, *PPS_IMPERSONATION_INFO;
178
179 typedef struct _ETHREAD
180 {
181   KTHREAD Tcb;                                      /* 000 */
182   TIME CreateTime;                                  /* 1B0/1B8 */
183   union
184   {
185     TIME ExitTime;                                  /* 1B8/1E4 */
186     LIST_ENTRY LpcReplyChain;                       /* 1B8/1E4 */
187   } u1;
188   NTSTATUS ExitStatus;                              /* 1C0/1EC */
189   LIST_ENTRY PostBlockList;                         /* 1C4/1F0 */
190   LIST_ENTRY TerminationPortList;                   /* 1CC/1F8 */
191   KSPIN_LOCK ActiveTimerListLock;                   /* 1D4/200 */
192   LIST_ENTRY ActiveTimerListHead;                   /* 1D8/204 */
193   CLIENT_ID Cid;                                    /* 1E0/20C */
194   KSEMAPHORE LpcReplySemaphore;                     /* 1E8/214 */
195   PVOID LpcReplyMessage;                            /* 1FC/228 */
196   PLARGE_INTEGER LpcReplyMessageId;                 /* 200/22C */
197   ULONG PerformanceCounterLow;                      /* 204/230 */
198   PPS_IMPERSONATION_INFO ImpersonationInfo;         /* 208/234 */
199   LIST_ENTRY IrpList;                               /* 20C/238 */
200   TOP_LEVEL_IRP* TopLevelIrp;                       /* 214/240 */
201   PDEVICE_OBJECT DeviceToVerify;                    /* 218/244 */
202   ULONG ReadClusterSize;                            /* 21C/248 */
203   UCHAR ForwardClusterOnly;                         /* 220/24C */
204   UCHAR DisablePageFaultClustering;                 /* 221/24D */
205   UCHAR DeadThread;                                 /* 222/24E */
206   UCHAR HasTerminated;                              /* 223/24F */
207   PVOID EventPair;                                  /* 224/250 */
208   ACCESS_MASK GrantedAccess;                        /* 228/254 */
209   struct _EPROCESS* ThreadsProcess;                 /* 22C/258 */
210   PKSTART_ROUTINE StartAddress;                     /* 230/25C */
211   union
212   {
213     LPTHREAD_START_ROUTINE Win32StartAddress;       /* 234/260 */
214     ULONG LpcReceiveMessageId;                      /* 234/260 */
215   } u2;
216   UCHAR LpcExitThreadCalled;                        /* 238/264 */
217   UCHAR HardErrorsAreDisabled;                      /* 239/265 */
218   UCHAR LpcReceivedMsgIdValid;                      /* 23A/266 */
219   UCHAR ActiveImpersonationInfo;                    /* 23B/267 */
220   ULONG PerformanceCountHigh;                       /* 23C/268 */
221
222   /*
223    * Added by David Welch (welch@cwcom.net)
224    */
225   struct _EPROCESS* OldProcess;                     /* 240/26C */
226
227   struct _W32THREAD* Win32Thread;
228   
229 } __attribute__((packed)) ETHREAD;
230
231 #ifndef __USE_W32API
232
233 typedef struct _ETHREAD *PETHREAD;
234
235 #endif /* __USE_W32API */
236
237
238 typedef struct _KPROCESS 
239 {
240   /* So it's possible to wait for the process to terminate */
241   DISPATCHER_HEADER     DispatcherHeader;             /* 000 */
242   /* 
243    * Presumably a list of profile objects associated with this process,
244    * currently unused.
245    */
246   LIST_ENTRY            ProfileListHead;              /* 010 */
247   /*
248    * We use the first member of this array to hold the physical address of
249    * the page directory for this process.
250    */
251   PHYSICAL_ADDRESS      DirectoryTableBase;           /* 018 */
252   /*
253    * Presumably a descriptor for the process's LDT, currently unused.
254    */
255   ULONG                 LdtDescriptor[2];             /* 020 */
256   /*
257    * Virtual Dos Machine flag.
258    */
259   ULONG                 NtVdmFlag;                    /* 028 */
260   ULONG                 VdmUnused;                    /* 02C */
261   /* Is the i/o permission map enabled for the process. */
262   USHORT                IopmOffset;                   /* 030 */
263   /* 
264    * Presumably I/O privilege level to be used for this process, currently
265    * unused.
266    */
267   UCHAR                 Iopl;                         /* 032 */
268   /* Set if this process is a virtual dos machine? */
269   UCHAR                 VdmFlag;                      /* 033 */
270   /* Bitmask of the processors being used by this process's threads? */
271   ULONG                 ActiveProcessors;             /* 034 */
272   /* Aggregate of the time this process's threads have spent in kernel mode? */
273   ULONG                 KernelTime;                   /* 038 */
274   /* Aggregate of the time this process's threads have spent in user mode? */
275   ULONG                 UserTime;                     /* 03C */
276   /* List of this process's threads that are ready for execution? */
277   LIST_ENTRY            ReadyListHead;                /* 040 */
278   /* List of this process's threads that have their stacks swapped out? */
279   LIST_ENTRY            SwapListEntry;                /* 048 */
280   /* List of this process's threads? */
281   LIST_ENTRY            ThreadListHead;               /* 050 */
282   /* Maybe a lock for this data structure, the type is assumed. */
283   KSPIN_LOCK            ProcessLock;                  /* 058 */
284   /* Default affinity mask for this process's threads? */
285   ULONG                 Affinity;                     /* 05C */
286   /* Count of the stacks allocated for this process's threads? */
287   USHORT                StackCount;                   /* 060 */
288   /* Base priority for this process's threads? */
289   KPRIORITY             BasePriority;                 /* 062 */
290   /* Default quantum for this process's threads */
291   UCHAR                 ThreadQuantum;                /* 063 */
292   /* Unknown. */
293   UCHAR                 AutoAlignment;                /* 064 */
294   /* Process execution state, currently either active or terminated. */
295   UCHAR                 State;                        /* 065 */
296   /* Seed for generating thread ids for this process's threads? */
297   UCHAR                 ThreadSeed;                   /* 066 */
298   /* Disable priority boosts? */
299   UCHAR                 DisableBoost;                 /* 067 */
300 } KPROCESS;
301
302 #ifndef __USE_W32API
303
304 typedef struct _KPROCESS *PKPROCESS;
305
306 #endif /* __USE_W32API */
307
308 struct _EPROCESS
309 {
310   /* Microkernel specific process state. */
311   KPROCESS              Pcb;                          /* 000 */
312   /* Exit status of the process. */
313   NTSTATUS              ExitStatus;                   /* 068 */
314   /* Unknown. */
315   KEVENT                LockEvent;                    /* 06C */
316   /* Unknown. */
317   ULONG                 LockCount;                    /* 07C */
318
319   /* Time of process creation. */
320 #ifdef __USE_W32API
321   LARGE_INTEGER                  CreateTime;                   /* 080 */
322 #else
323   TIME                  CreateTime;                   /* 080 */
324 #endif
325
326   /* Time of process exit. */
327   TIME                  ExitTime;                     /* 088 */
328   /* Unknown. */
329   PVOID                 LockOwner;                    /* 090 */
330   /* Process id. */
331   ULONG                 UniqueProcessId;              /* 094 */
332   /* Unknown. */
333   LIST_ENTRY            ActiveProcessLinks;           /* 098 */
334   /* Unknown. */
335   ULONG                 QuotaPeakPoolUsage[2];        /* 0A0 */
336   /* Unknown. */
337   ULONG                 QuotaPoolUsage[2];            /* 0A8 */
338   /* Unknown. */
339   ULONG                 PagefileUsage;                /* 0B0 */
340   /* Unknown. */
341   ULONG                 CommitCharge;                 /* 0B4 */
342   /* Unknown. */
343   ULONG                 PeakPagefileUsage;            /* 0B8 */
344   /* Unknown. */
345   ULONG                 PeakVirtualSize;              /* 0BC */
346   /* Unknown. */
347   LARGE_INTEGER         VirtualSize;                  /* 0C0 */
348   struct
349   {
350     ULONG               LastTrimTime;
351     ULONG               LastTrimFaultCount;
352     ULONG               PageFaultCount;
353     ULONG               PeakWorkingSetSize;
354     ULONG               WorkingSetSize;
355     ULONG               MinimumWorkingSetSize;
356     ULONG               MaximumWorkingSetSize;
357     ULONG               VmWorkingSetList;
358     LIST_ENTRY          WorkingSetExpansionList;
359     UCHAR               AllowWorkingSetAdjustment;
360     UCHAR               AddressSpaceBeingDeleted;
361     UCHAR               ForegroundPrioritySwitch;
362     UCHAR               MemoryPriority;
363   } Vm;
364   PVOID                 LastProtoPteFault;
365   struct _EPORT*        DebugPort;
366   struct _EPORT*        ExceptionPort;
367   PVOID                 ObjectTable;
368   PVOID                 Token;
369   /*  FAST_MUTEX            WorkingSetLock; */
370   KMUTEX                WorkingSetLock;
371   PVOID                 WorkingSetPage;
372   UCHAR                 ProcessOutswapEnabled;
373   UCHAR                 ProcessOutswapped;
374   UCHAR                 AddressSpaceInitialized;
375   UCHAR                 AddressSpaceDeleted;
376   FAST_MUTEX            AddressCreationLock;
377   KSPIN_LOCK            HyperSpaceLock;
378   PETHREAD              ForkInProgress;
379   USHORT                VmOperation;
380   UCHAR                 ForkWasSuccessful;
381   UCHAR                 MmAgressiveWsTrimMask;
382   PKEVENT               VmOperationEvent;
383   PVOID                 PageDirectoryPte;
384   ULONG                 LastFaultCount;
385   PVOID                 VadRoot;
386   PVOID                 VadHint;
387   PVOID                 CloneRoot;
388   ULONG                 NumberOfPrivatePages;
389   ULONG                 NumberOfLockedPages;
390   USHORT                NextProcessColour;
391   UCHAR                 ExitProcessCalled;
392   UCHAR                 CreateProcessReported;
393   HANDLE                SectionHandle;
394   PPEB                  Peb;
395   PVOID                 SectionBaseAddress;
396   PVOID                 QuotaBlock;
397   NTSTATUS              LastThreadExitStatus;
398   PVOID                 WorkingSetWatch;
399   HANDLE                InheritedFromUniqueProcessId;
400   ACCESS_MASK           GrantedAccess;
401   ULONG                 DefaultHardErrorProcessing;
402   PVOID                 LdtInformation;
403   ULONG                 VadFreeHint;
404   PVOID                 VdmObjects;
405   KMUTANT               ProcessMutant;
406   CHAR                  ImageFileName[16];
407   ULONG                 VmTrimFaultValue;
408   UCHAR                 SetTimerResolution;
409   UCHAR                 PriorityClass;
410   UCHAR                 SubSystemMinorVersion;
411   UCHAR                 SubSystemMajorVersion;
412   USHORT                SubSystemVersion;
413   struct _W32PROCESS*   Win32Process;
414   HANDLE                Win32WindowStation;
415    
416    /*
417     * Added by David Welch (welch@mcmail.com)
418     */
419   HANDLE                Win32Desktop;
420   MADDRESS_SPACE        AddressSpace;
421   HANDLE_TABLE          HandleTable;
422   LIST_ENTRY            ProcessListEntry;
423    
424    /*
425     * Added by Philip Susi for list of threads in process
426     */
427   LIST_ENTRY           ThreadListHead;
428 };
429
430 #define PROCESS_STATE_TERMINATED (1)
431 #define PROCESS_STATE_ACTIVE     (2)
432
433 VOID PiInitDefaultLocale(VOID);
434 VOID PiInitProcessManager(VOID);
435 VOID PiShutdownProcessManager(VOID);
436 VOID PsInitThreadManagment(VOID);
437 VOID PsInitProcessManagment(VOID);
438 VOID PsInitIdleThread(VOID);
439 VOID PsDispatchThreadNoLock(ULONG NewThreadStatus);
440 VOID PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus);
441 VOID PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus);
442 VOID PsReleaseThread(PETHREAD Thread);
443 VOID PsBeginThread(PKSTART_ROUTINE StartRoutine, PVOID StartContext);
444 VOID PsBeginThreadWithContextInternal(VOID);
445 VOID PiKillMostProcesses(VOID);
446 NTSTATUS STDCALL PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus);
447 VOID PiInitApcManagement(VOID);
448 VOID STDCALL PiDeleteThread(PVOID ObjectBody);
449 VOID PsReapThreads(VOID);
450 NTSTATUS 
451 PsInitializeThread(HANDLE ProcessHandle,
452                    PETHREAD* ThreadPtr,
453                    PHANDLE ThreadHandle,
454                    ACCESS_MASK DesiredAccess,
455                    POBJECT_ATTRIBUTES ObjectAttributes,
456                    BOOLEAN First);
457
458 PACCESS_TOKEN PsReferenceEffectiveToken(PETHREAD Thread,
459                                         PTOKEN_TYPE TokenType,
460                                         PUCHAR b,
461                                         PSECURITY_IMPERSONATION_LEVEL Level);
462
463 NTSTATUS PsOpenTokenOfProcess(HANDLE ProcessHandle,
464                               PACCESS_TOKEN* Token);
465
466 NTSTATUS PsSuspendThread(PETHREAD Thread, PULONG PreviousCount);
467 NTSTATUS PsResumeThread(PETHREAD Thread, PULONG PreviousCount);
468
469
470 #define THREAD_STATE_INITIALIZED  (0)
471 #define THREAD_STATE_READY        (1)
472 #define THREAD_STATE_RUNNING      (2)
473 #define THREAD_STATE_SUSPENDED    (3)
474 #define THREAD_STATE_FROZEN       (4)
475 #define THREAD_STATE_TERMINATED_1 (5)
476 #define THREAD_STATE_TERMINATED_2 (6)
477 #define THREAD_STATE_BLOCKED      (7)
478 #define THREAD_STATE_MAX          (8)
479
480
481 /*
482  * Internal thread priorities, added by Phillip Susi
483  * TODO: rebalence these to make use of all priorities... the ones above 16 
484  * can not all be used right now
485  */
486 #define PROCESS_PRIO_IDLE                       3
487 #define PROCESS_PRIO_NORMAL                     8
488 #define PROCESS_PRIO_HIGH                       13
489 #define PROCESS_PRIO_RT                         18
490
491
492 VOID 
493 KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First);
494 NTSTATUS KeReleaseThread(PETHREAD Thread);
495 VOID STDCALL PiDeleteProcess(PVOID ObjectBody);
496 VOID PsReapThreads(VOID);
497 VOID PsUnfreezeOtherThread(PETHREAD Thread);
498 VOID PsFreezeOtherThread(PETHREAD Thread);
499 VOID PsFreezeProcessThreads(PEPROCESS Process);
500 VOID PsUnfreezeProcessThreads(PEPROCESS Process);
501 PEPROCESS PsGetNextProcess(PEPROCESS OldProcess);
502 VOID
503 PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, 
504               BOOLEAN DispatcherLock, KIRQL WaitIrql, UCHAR WaitReason);
505 VOID
506 PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus);
507 VOID
508 PsApplicationProcessorInit(VOID);
509 VOID
510 PsPrepareForApplicationProcessorInit(ULONG Id);
511 NTSTATUS STDCALL
512 PsIdleThreadMain(PVOID Context);
513
514 VOID STDCALL
515 PiSuspendThreadRundownRoutine(PKAPC Apc);
516 VOID STDCALL
517 PiSuspendThreadKernelRoutine(PKAPC Apc,
518                              PKNORMAL_ROUTINE* NormalRoutine,
519                              PVOID* NormalContext,
520                              PVOID* SystemArgument1,
521                              PVOID* SystemArguemnt2);
522 VOID STDCALL
523 PiSuspendThreadNormalRoutine(PVOID NormalContext,
524                              PVOID SystemArgument1,
525                              PVOID SystemArgument2);
526 VOID STDCALL
527 PsDispatchThread(ULONG NewThreadStatus);
528 VOID
529 PsInitialiseSuspendImplementation(VOID);
530
531 extern ULONG PiNrThreadsAwaitingReaping;
532
533
534 NTSTATUS
535 PsInitWin32Thread (PETHREAD Thread);
536
537 VOID
538 PsTerminateWin32Process (PEPROCESS Process);
539
540 VOID
541 PsTerminateWin32Thread (PETHREAD Thread);
542
543 VOID
544 PsInitialiseW32Call(VOID);
545
546 #endif /* ASSEMBLER */
547
548 #endif /* __INCLUDE_INTERNAL_PS_H */