Corrected KPCR structure, removed IKPCR, set up CurrentThread in proper structure (implemented KPRCB), added some types needed by KPRCB.

svn path=/trunk/; revision=11162
This commit is contained in:
Alex Ionescu 2004-10-03 03:03:54 +00:00
parent b26683b0b3
commit 4d9e3a1cae
8 changed files with 263 additions and 51 deletions

View file

@ -1,4 +1,4 @@
/* $Id: extypes.h,v 1.23 2004/08/09 01:26:10 ion Exp $ */ /* $Id: extypes.h,v 1.24 2004/10/03 03:03:53 ion Exp $ */
#ifndef __INCLUDE_DDK_EXTYPES_H #ifndef __INCLUDE_DDK_EXTYPES_H
#define __INCLUDE_DDK_EXTYPES_H #define __INCLUDE_DDK_EXTYPES_H
@ -150,6 +150,11 @@ typedef struct _PAGED_LOOKASIDE_LIST
FAST_MUTEX Obsoleted; FAST_MUTEX Obsoleted;
} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
typedef struct _PP_LOOKASIDE_LIST {
struct _GENERAL_LOOKASIDE *P;
struct _GENERAL_LOOKASIDE *L;
} PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST;
typedef enum _EX_POOL_PRIORITY { typedef enum _EX_POOL_PRIORITY {
LowPoolPriority, LowPoolPriority,
LowPoolPrioritySpecialPoolOverrun = 8, LowPoolPrioritySpecialPoolOverrun = 8,

View file

@ -209,6 +209,12 @@ typedef struct _KDPC
#include <poppack.h> #include <poppack.h>
typedef struct _KDPC_DATA {
LIST_ENTRY DpcListHead;
ULONG DpcLock;
ULONG DpcQueueDepth;
ULONG DpcCount;
} KDPC_DATA, *PKDPC_DATA;
typedef struct _KDEVICE_QUEUE_ENTRY typedef struct _KDEVICE_QUEUE_ENTRY
{ {

View file

@ -98,4 +98,71 @@ typedef enum {
DeviceTextLocationInformation = 1 DeviceTextLocationInformation = 1
} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
typedef struct _PROCESSOR_IDLE_TIMES {
ULONGLONG StartTime;
ULONGLONG EndTime;
ULONG IdleHandlerReserved[4];
} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES;
typedef struct _PROCESSOR_PERF_STATE {
UCHAR PercentFrequency;
UCHAR MinCapacity;
USHORT Power;
UCHAR IncreaseLevel;
UCHAR DecreaseLevel;
USHORT Flags;
ULONG IncreaseTime;
ULONG DecreaseTime;
ULONG IncreaseCount;
ULONG DecreaseCount;
ULONGLONG PerformanceTime;
} PROCESSOR_PERF_STATE, *PPROCESSOR_PERF_STATE;
typedef struct _PROCESSOR_POWER_STATE {
PVOID IdleFunction;
ULONG Idle0KernelTimeLimit;
ULONG Idle0LastTime;
PVOID IdleHandlers;
PVOID IdleState;
ULONG IdleHandlersCount;
ULONGLONG LastCheck;
PROCESSOR_IDLE_TIMES IdleTimes;
ULONG IdleTime1;
ULONG PromotionCheck;
ULONG IdleTime2;
UCHAR CurrentThrottle;
UCHAR ThermalThrottleLimit;
UCHAR CurrentThrottleIndex;
UCHAR ThermalThrottleIndex;
ULONG LastKernelUserTime;
ULONG PerfIdleTime;
ULONG DebugDelta;
ULONG DebugCount;
ULONG LastSysTime;
ULONG TotalIdleStateTime[3];
ULONG TotalIdleTransitions[3];
ULONGLONG PreviousC3StateTime;
UCHAR KneeThrottleIndex;
UCHAR ThrottleLimitIndex;
UCHAR PerfStatesCount;
UCHAR ProcessorMinThrottle;
UCHAR ProcessorMaxThrottle;
UCHAR LastBusyPercentage;
UCHAR LastC3Percentage;
UCHAR LastAdjustedBusyPercentage;
ULONG PromotionCount;
ULONG DemotionCount;
ULONG ErrorCount;
ULONG RetryCount;
ULONG Flags;
LARGE_INTEGER PerfCounterFrequency;
ULONG PerfTickCount;
KTIMER PerfTimer;
KDPC PerfDpc;
PROCESSOR_PERF_STATE *PerfStates;
PVOID PerfSetThrottle;
ULONG LastC3KernelUserTime;
ULONG Spare1[1];
} PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
#endif /* __INCLUDE_DDK_POTYPES_H */ #endif /* __INCLUDE_DDK_POTYPES_H */

View file

@ -47,10 +47,156 @@
#ifndef __ASM__ #ifndef __ASM__
#pragma pack(push,4)
// Fixme: Use correct types?
typedef struct _KPROCESSOR_STATE {
PCONTEXT ContextFrame;
PVOID SpecialRegisters;
} KPROCESSOR_STATE;
// Fixme: Use correct union for Fn/Fx Save Area?
typedef struct _FX_SAVE_AREA {
UCHAR FnFxSaveArea[0x208];
ULONG NpxSavedCpu;
ULONG Cr0NpxState;
} FX_SAVE_AREA, *PFX_SAVE_AREA;
/* ProcessoR Control Block */
typedef struct _KPRCB {
USHORT MinorVersion;
USHORT MajorVersion;
struct _KTHREAD *CurrentThread;
struct _KTHREAD *NextThread;
struct _KTHREAD *IdleThread;
UCHAR Number;
UCHAR Reserved;
USHORT BuildType;
ULONG SetMember;
UCHAR CpuType;
UCHAR CpuID;
USHORT CpuStep;
KPROCESSOR_STATE ProcessorState;
ULONG KernelReserved[16];
ULONG HalReserved[16];
UCHAR PrcbPad0[92];
PVOID LockQueue[33]; // Used for Queued Spinlocks
struct _KTHREAD *NpxThread;
ULONG InterruptCount;
ULONG KernelTime;
ULONG UserTime;
ULONG DpcTime;
ULONG DebugDpcTime;
ULONG InterruptTime;
ULONG AdjustDpcThreshold;
ULONG PageColor;
UCHAR SkipTick;
UCHAR DebuggerSavedIRQL;
UCHAR Spare1[6];
struct _KNODE *ParentNode;
ULONG MultiThreadProcessorSet;
struct _KPRCB *MultiThreadSetMaster;
ULONG ThreadStartCount[2];
ULONG CcFastReadNoWait;
ULONG CcFastReadWait;
ULONG CcFastReadNotPossible;
ULONG CcCopyReadNoWait;
ULONG CcCopyReadWait;
ULONG CcCopyReadNoWaitMiss;
ULONG KeAlignmentFixupCount;
ULONG SpareCounter0;
ULONG KeDcacheFlushCount;
ULONG KeExceptionDispatchCount;
ULONG KeFirstLevelTbFills;
ULONG KeFloatingEmulationCount;
ULONG KeIcacheFlushCount;
ULONG KeSecondLevelTbFills;
ULONG KeSystemCalls;
ULONG IoReadOperationCount;
ULONG IoWriteOperationCount;
ULONG IoOtherOperationCount;
LARGE_INTEGER IoReadTransferCount;
LARGE_INTEGER IoWriteTransferCount;
LARGE_INTEGER IoOtherTransferCount;
ULONG SpareCounter1[8];
PP_LOOKASIDE_LIST PPLookasideList[16];
PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
PP_LOOKASIDE_LIST PPPagedLookasideList[32];
ULONG PacketBarrier;
ULONG ReverseStall;
PVOID IpiFrame;
UCHAR PrcbPad2[52];
PVOID CurrentPacket[3];
ULONG TargetSet;
ULONG_PTR WorkerRoutine;
ULONG IpiFrozen;
UCHAR PrcbPad3[40];
ULONG RequestSummary;
struct _KPRCB *SignalDone;
UCHAR PrcbPad4[56];
struct _KDPC_DATA DpcData[2];
PVOID DpcStack;
ULONG MaximumDpcQueueDepth;
ULONG DpcRequestRate;
ULONG MinimumDpcRate;
UCHAR DpcInterruptRequested;
UCHAR DpcThreadRequested;
UCHAR DpcRoutineActive;
UCHAR DpcThreadActive;
ULONG PrcbLock;
ULONG DpcLastCount;
ULONG TimerHand;
ULONG TimerRequest;
PVOID DpcThread;
struct _KEVENT *DpcEvent;
UCHAR ThreadDpcEnable;
UCHAR QuantumEnd;
UCHAR PrcbPad50;
UCHAR IdleSchedule;
ULONG DpcSetEventRequest;
UCHAR PrcbPad5[18];
LONG TickOffset;
struct _KDPC* CallDpc;
ULONG PrcbPad7[8];
LIST_ENTRY WaitListHead;
ULONG ReadySummary;
ULONG SelectNextLast;
LIST_ENTRY DispatcherReadyListHead[32];
SINGLE_LIST_ENTRY DeferredReadyListHead;
ULONG PrcbPad72[11];
PVOID ChainedInterruptList;
LONG LookasideIrpFloat;
LONG MmPageFaultCount;
LONG MmCopyOnWriteCount;
LONG MmTransitionCount;
LONG MmCacheTransitionCount;
LONG MmDemandZeroCount;
LONG MmPageReadCount;
LONG MmPageReadIoCount;
LONG MmCacheReadCount;
LONG MmCacheIoCount;
LONG MmDirtyPagesWriteCount;
LONG MmDirtyWriteIoCount;
LONG MmMappedPagesWriteCount;
LONG MmMappedWriteIoCount;
ULONG SpareFields0[1];
UCHAR VendorString[13];
UCHAR InitialApicId;
UCHAR LogicalProcessorsPerPhysicalProcessor;
ULONG MHz;
ULONG FeatureBits;
LARGE_INTEGER UpdateSignature;
LARGE_INTEGER IsrTime;
LARGE_INTEGER SpareField1;
FX_SAVE_AREA NpxSaveArea;
PROCESSOR_POWER_STATE PowerState;
} KPRCB, *PKRCB;
#pragma pack(pop)
#ifndef __USE_W32API #ifndef __USE_W32API
#pragma pack(push,4) #pragma pack(push,4)
/* /*
* Processor Control Region Thread Information Block * Processor Control Region Thread Information Block
*/ */
@ -66,6 +212,9 @@ typedef struct _KPCR_TIB {
PVOID ArbitraryUserPointer; /* 14 */ PVOID ArbitraryUserPointer; /* 14 */
} KPCR_TIB, *PKPCR_TIB; /* 18 */ } KPCR_TIB, *PKPCR_TIB; /* 18 */
/*
* Processor Control Region
*/
typedef struct _KPCR { typedef struct _KPCR {
KPCR_TIB Tib; /* 00 */ KPCR_TIB Tib; /* 00 */
struct _KPCR *Self; /* 18 */ struct _KPCR *Self; /* 18 */
@ -84,45 +233,20 @@ typedef struct _KPCR {
ULONG StallScaleFactor; /* 48 */ ULONG StallScaleFactor; /* 48 */
UCHAR DebugActive; /* 4C */ UCHAR DebugActive; /* 4C */
UCHAR ProcessorNumber; /* 4D */ UCHAR ProcessorNumber; /* 4D */
UCHAR Reserved[2]; /* 4E */ UCHAR Reserved; /* 4E */
} KPCR; UCHAR L2CacheAssociativity; /* 4F */
ULONG VdmAlert; /* 50 */
ULONG KernelReserved[14]; /* 54 */
ULONG L2CacheSize; /* 8C */
ULONG HalReserved[16]; /* 90 */
ULONG InterruptMode; /* D0 */
UCHAR KernelReserved2[0x4C]; /* D4 */
KPRCB PrcbData; /* 120 */
} KPCR, *PKPCR;
#pragma pack(pop) #pragma pack(pop)
typedef struct _KPCR *PKPCR;
#endif /* __USE_W32API */ #endif /* __USE_W32API */
#pragma pack(push,4)
/*
* Processor Control Region
* The first part of this structure must match the KPCR structure in w32api
*/
typedef struct _IKPCR {
KPCR_TIB Tib; /* 00 */
struct _KPCR *Self; /* 18 */
struct _KPRCB *PCRCB; /* 1C */
KIRQL Irql; /* 20 */
ULONG IRR; /* 24 */
ULONG IrrActive; /* 28 */
ULONG IDR; /* 2C */
PVOID KdVersionBlock; /* 30 */
PUSHORT IDT; /* 34 */
PUSHORT GDT; /* 38 */
struct _KTSS *TSS; /* 3C */
USHORT MajorVersion; /* 40 */
USHORT MinorVersion; /* 42 */
KAFFINITY SetMember; /* 44 */
ULONG StallScaleFactor; /* 48 */
UCHAR DebugActive; /* 4C */
UCHAR ProcessorNumber; /* 4D */
UCHAR Reserved[2]; /* 4E */
UCHAR Reserved2[0xD4]; /* 50 */
struct _KTHREAD* CurrentThread; /* 124 */
} IKPCR, *PIKPCR;
#pragma pack(pop)
#ifndef __USE_W32API #ifndef __USE_W32API

View file

@ -193,6 +193,18 @@ typedef struct _MADDRESS_SPACE
ULONG PageTableRefCountTableSize; ULONG PageTableRefCountTableSize;
} MADDRESS_SPACE, *PMADDRESS_SPACE; } MADDRESS_SPACE, *PMADDRESS_SPACE;
typedef struct _KNODE {
ULONG ProcessorMask;
ULONG Color;
ULONG MmShiftedColor;
ULONG FreeCount[2];
SLIST_HEADER DeadStackList;
SLIST_HEADER PfnDereferenceSListHead;
struct _SINGLE_LIST_ENTRY *PfnDeferredList;
UCHAR Seed;
UCHAR NodeNumber;
ULONG Flags;
} KNODE, *PKNODE;
#ifndef __USE_W32API #ifndef __USE_W32API
/* VARIABLES */ /* VARIABLES */

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: main.c,v 1.197 2004/09/26 15:07:43 hbirr Exp $ /* $Id: main.c,v 1.198 2004/10/03 03:03:54 ion Exp $
* *
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/main.c * FILE: ntoskrnl/ke/main.c
@ -303,9 +303,7 @@ ExpInitializeExecutive(VOID)
assert(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); assert(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST);
assert(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); assert(FIELD_OFFSET(KPCR, Self) == KPCR_SELF);
assert(FIELD_OFFSET(IKPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); assert(FIELD_OFFSET(KPCR, PrcbData) + FIELD_OFFSET(KPRCB, CurrentThread) == KPCR_CURRENT_THREAD);
assert(FIELD_OFFSET(IKPCR, Self) == KPCR_SELF);
assert(FIELD_OFFSET(IKPCR, CurrentThread) == KPCR_CURRENT_THREAD);
LdrInit1(); LdrInit1();

View file

@ -1,4 +1,4 @@
/* $Id: thread.c,v 1.134 2004/09/28 15:02:29 weiden Exp $ /* $Id: thread.c,v 1.135 2004/10/03 03:03:54 ion Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -57,7 +57,7 @@ static GENERIC_MAPPING PiThreadMapping = {THREAD_READ,
*/ */
PKTHREAD STDCALL KeGetCurrentThread(VOID) PKTHREAD STDCALL KeGetCurrentThread(VOID)
{ {
return(((PIKPCR) KeGetCurrentKPCR())->CurrentThread); return(KeGetCurrentKPCR()->PrcbData.CurrentThread);
} }
/* /*
@ -372,7 +372,7 @@ VOID PsDispatchThreadNoLock (ULONG NewThreadStatus)
KPRIORITY CurrentPriority; KPRIORITY CurrentPriority;
PETHREAD Candidate; PETHREAD Candidate;
ULONG Affinity; ULONG Affinity;
PKTHREAD KCurrentThread = ((PIKPCR) KeGetCurrentKPCR())->CurrentThread; PKTHREAD KCurrentThread = KeGetCurrentThread();
PETHREAD CurrentThread = CONTAINING_RECORD(KCurrentThread, ETHREAD, Tcb); PETHREAD CurrentThread = CONTAINING_RECORD(KCurrentThread, ETHREAD, Tcb);
DPRINT("PsDispatchThread() %d/%d/%d/%d\n", KeGetCurrentProcessorNumber(), DPRINT("PsDispatchThread() %d/%d/%d/%d\n", KeGetCurrentProcessorNumber(),
@ -437,7 +437,7 @@ PsDispatchThread(ULONG NewThreadStatus)
/* /*
* Save wait IRQL * Save wait IRQL
*/ */
((PIKPCR) KeGetCurrentKPCR())->CurrentThread->WaitIrql = oldIrql; KeGetCurrentThread()->WaitIrql = oldIrql;
PsDispatchThreadNoLock(NewThreadStatus); PsDispatchThreadNoLock(NewThreadStatus);
KeLowerIrql(oldIrql); KeLowerIrql(oldIrql);
} }
@ -483,7 +483,7 @@ PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode,
KeAcquireSpinLock(&PiThreadLock, &oldIrql); KeAcquireSpinLock(&PiThreadLock, &oldIrql);
KThread = ((PIKPCR) KeGetCurrentKPCR())->CurrentThread; KThread = KeGetCurrentThread();
Thread = CONTAINING_RECORD (KThread, ETHREAD, Tcb); Thread = CONTAINING_RECORD (KThread, ETHREAD, Tcb);
if (KThread->ApcState.KernelApcPending) if (KThread->ApcState.KernelApcPending)
{ {
@ -630,7 +630,7 @@ PsSetThreadWin32Thread(
VOID VOID
PsApplicationProcessorInit(VOID) PsApplicationProcessorInit(VOID)
{ {
((PIKPCR) KeGetCurrentKPCR())->CurrentThread = KeGetCurrentKPCR()->PrcbData.CurrentThread =
(PVOID)IdleThreads[KeGetCurrentProcessorNumber()]; (PVOID)IdleThreads[KeGetCurrentProcessorNumber()];
} }
@ -704,7 +704,7 @@ PsInitThreadManagment(VOID)
THREAD_ALL_ACCESS,NULL, TRUE); THREAD_ALL_ACCESS,NULL, TRUE);
FirstThread->Tcb.State = THREAD_STATE_RUNNING; FirstThread->Tcb.State = THREAD_STATE_RUNNING;
FirstThread->Tcb.FreezeCount = 0; FirstThread->Tcb.FreezeCount = 0;
((PIKPCR) KeGetCurrentKPCR())->CurrentThread = (PVOID)FirstThread; KeGetCurrentKPCR()->PrcbData.CurrentThread = (PVOID)FirstThread;
NtClose(FirstThreadHandle); NtClose(FirstThreadHandle);
DPRINT("FirstThread %x\n",FirstThread); DPRINT("FirstThread %x\n",FirstThread);
@ -793,7 +793,7 @@ KeSetPriorityThread (PKTHREAD Thread, KPRIORITY Priority)
{ {
PsRemoveFromThreadList((PETHREAD)Thread); PsRemoveFromThreadList((PETHREAD)Thread);
PsInsertIntoThreadList(Priority, (PETHREAD)Thread); PsInsertIntoThreadList(Priority, (PETHREAD)Thread);
CurrentThread = ((PIKPCR) KeGetCurrentKPCR())->CurrentThread; CurrentThread = KeGetCurrentThread();
if (CurrentThread->Priority < Priority) if (CurrentThread->Priority < Priority)
{ {
PsDispatchThreadNoLock(THREAD_STATE_READY); PsDispatchThreadNoLock(THREAD_STATE_READY);

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: error.c,v 1.7 2004/03/14 11:25:33 gvg Exp $ /* $Id: error.c,v 1.8 2004/10/03 03:03:54 ion Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -27,6 +27,7 @@
* 06-06-2001 CSH Created * 06-06-2001 CSH Created
*/ */
#include <ddk/ntddk.h> #include <ddk/ntddk.h>
#include <ddk/ntpoapi.h>
#include <internal/ps.h> #include <internal/ps.h>
#include <include/error.h> #include <include/error.h>
@ -51,7 +52,6 @@ SetLastWin32Error(DWORD Status)
NTSTATUS FASTCALL NTSTATUS FASTCALL
GetLastNtError() GetLastNtError()
{ {
// FIXME - not 100% sure this is correct
PTEB Teb = PsGetCurrentThread()->Tcb.Teb; PTEB Teb = PsGetCurrentThread()->Tcb.Teb;
if ( NULL != Teb ) if ( NULL != Teb )