From 32014b63b85cad675fe7e07d932ecd80d31307ae Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 17 Dec 2009 20:58:58 +0000 Subject: [PATCH] [NTOSKRNL] "Fix things": Add architecture specific macros KeGetTrapFrame, KeGetExceptionFrame and KeGetContextSwitches. Should fix kernel build on arm. Patch by Alex, modified by me. svn path=/trunk/; revision=44640 --- reactos/ntoskrnl/ex/sysinfo.c | 8 +------- reactos/ntoskrnl/include/internal/arm/ke.h | 18 ++++++++++++++++++ reactos/ntoskrnl/include/internal/i386/ke.h | 18 ++++++++++++++++++ reactos/ntoskrnl/ps/i386/psctx.c | 8 +++----- reactos/ntoskrnl/ps/thread.c | 6 ++---- reactos/ntoskrnl/rtl/libsupp.c | 12 +++++------- 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 94ab5b8ba3d..c04886dae41 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1238,7 +1238,6 @@ QSI_DEF(SystemPoolTagInformation) QSI_DEF(SystemInterruptInformation) { PKPRCB Prcb; - PKPCR Pcr; LONG i; ULONG ti; PSYSTEM_INTERRUPT_INFORMATION sii = (PSYSTEM_INTERRUPT_INFORMATION)Buffer; @@ -1253,12 +1252,7 @@ QSI_DEF(SystemInterruptInformation) for (i = 0; i < KeNumberProcessors; i++) { Prcb = KiProcessorBlock[i]; - Pcr = (PKPCR)CONTAINING_RECORD(Prcb, KIPCR, PrcbData); -#ifdef _M_ARM // This code should probably be done differently - sii->ContextSwitches = Pcr->ContextSwitches; -#else - sii->ContextSwitches = ((PKIPCR)Pcr)->ContextSwitches; -#endif + sii->ContextSwitches = KeGetContextSwitches(Prcb); sii->DpcCount = Prcb->DpcData[0].DpcCount; sii->DpcRate = Prcb->DpcRequestRate; sii->TimeIncrement = ti; diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index 67b8befa048..8dace742c0d 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -36,6 +36,24 @@ #define KeSetContextReturnRegister(Context, ReturnValue) \ ((Context)->R0 = (ReturnValue)) +// +// Macro to get trap and exception frame from a thread stack +// +#define KeGetTrapFrame(Thread) \ + (PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \ + sizeof(KTRAP_FRAME)) + +#define KeGetExceptionFrame(Thread) \ + (PKEXCEPTION_FRAME)((ULONG_PTR)KeGetTrapFrame(Thread) - \ + sizeof(KEXCEPTION_FRAME)) + +// +// Macro to get context switches from the PRCB +// All architectures but x86 have it in the PRCB's KeContextSwitches +// +#define KeGetContextSwitches(Prcb) \ + Prcb->KeContextSwitches + // // Returns the Interrupt State from a Trap Frame. // ON = TRUE, OFF = FALSE diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index ea2f8bc286f..753ebbcc912 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -41,6 +41,24 @@ extern ULONG Ke386CacheAlignment; #define KeSetContextReturnRegister(Context, ReturnValue) \ ((Context)->Eax = (ReturnValue)) +// +// Macro to get trap and exception frame from a thread stack +// +#define KeGetTrapFrame(Thread) \ + (PKTRAP_FRAME)((ULONG_PTR)((Thread)->InitialStack) - \ + sizeof(KTRAP_FRAME) - \ + sizeof(FX_SAVE_AREA)) + +#define KeGetExceptionFrame(Thread) \ + NULL + +// +// Macro to get context switches from the PRCB +// All architectures but x86 have it in the PRCB's KeContextSwitches +// +#define KeGetContextSwitches(Prcb) \ + CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches + // // Returns the Interrupt State from a Trap Frame. // ON = TRUE, OFF = FALSE diff --git a/reactos/ntoskrnl/ps/i386/psctx.c b/reactos/ntoskrnl/ps/i386/psctx.c index b1dd1e5b1cd..207334e5f43 100644 --- a/reactos/ntoskrnl/ps/i386/psctx.c +++ b/reactos/ntoskrnl/ps/i386/psctx.c @@ -50,7 +50,7 @@ PspGetOrSetContextKernelRoutine(IN PKAPC Apc, PGET_SET_CTX_CONTEXT GetSetContext; PKEVENT Event; PCONTEXT Context; - PKTHREAD Thread; + PETHREAD Thread; KPROCESSOR_MODE Mode; PKTRAP_FRAME TrapFrame = NULL; PAGED_CODE(); @@ -63,15 +63,13 @@ PspGetOrSetContextKernelRoutine(IN PKAPC Apc, Thread = Apc->SystemArgument2; /* If this is a kernel-mode request, grab the saved trap frame */ - if (Mode == KernelMode) TrapFrame = Thread->TrapFrame; + if (Mode == KernelMode) TrapFrame = Thread->Tcb.TrapFrame; /* If we don't have one, grab it from the stack */ if (!TrapFrame) { /* Trap frame is right under our initial stack */ - TrapFrame = (PKTRAP_FRAME)((ULONG_PTR)Thread->InitialStack - - ROUND_UP(sizeof(KTRAP_FRAME), KTRAP_FRAME_ALIGN) - - sizeof(FX_SAVE_AREA)); + TrapFrame = KeGetTrapFrame(&Thread->Tcb); } /* Check if it's a set or get */ diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index e0ea695bb35..d05fc8570a8 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -72,10 +72,8 @@ PspUserThreadStartup(IN PKSTART_ROUTINE StartRoutine, KeRaiseIrql(APC_LEVEL, &OldIrql); /* Queue the User APC */ - KiInitializeUserApc(NULL, - (PVOID)((ULONG_PTR)Thread->Tcb.InitialStack - - sizeof(KTRAP_FRAME) - - SIZEOF_FX_SAVE_AREA), + KiInitializeUserApc(KeGetExceptionFrame(&Thread->Tcb), + KeGetTrapFrame(&Thread->Tcb), PspSystemDllEntryPoint, NULL, PspSystemDllBase, diff --git a/reactos/ntoskrnl/rtl/libsupp.c b/reactos/ntoskrnl/rtl/libsupp.c index 792b763000d..ae87fc53d32 100644 --- a/reactos/ntoskrnl/rtl/libsupp.c +++ b/reactos/ntoskrnl/rtl/libsupp.c @@ -285,7 +285,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, ULONG Eip; BOOLEAN Result, StopSearch = FALSE; ULONG i = 0; - PKTHREAD Thread = KeGetCurrentThread(); + PETHREAD Thread = PsGetCurrentThread(); PTEB Teb; PKTRAP_FRAME TrapFrame; @@ -326,14 +326,12 @@ RtlWalkFrameChain(OUT PVOID *Callers, if (Flags == 1) { /* Get the trap frame and TEB */ - TrapFrame = Thread->TrapFrame; - Teb = Thread->Teb; + TrapFrame = KeGetTrapFrame(&Thread->Tcb); + Teb = Thread->Tcb.Teb; /* Make sure we can trust the TEB and trap frame */ if (!(Teb) || - !((PVOID)((ULONG_PTR)TrapFrame & 0x80000000)) || - ((PVOID)TrapFrame <= (PVOID)Thread->StackLimit) || - ((PVOID)TrapFrame >= (PVOID)Thread->StackBase) || + !(Thread->SystemThread) || (KeIsAttachedProcess()) || (KeGetCurrentIrql() >= DISPATCH_LEVEL)) { @@ -390,7 +388,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, if ((StackBegin < Eip) && (Eip < StackEnd)) break; /* Check if we reached a user-mode address */ - if (!(Flags) && !(Eip & 0x80000000)) break; + if (!(Flags) && !(Eip & 0x80000000)) break; // FIXME: 3GB breakage /* Save this frame */ Callers[i] = (PVOID)Eip; -- 2.17.1