From 813603306472e16e9994d107086a4da5d0a7adc2 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 22 Nov 2005 00:47:58 +0000 Subject: [PATCH] Change some FS:x reading macros for better compatibility with MSVC compiler and move KeGetCurrentKPCR/KeGetCurrentPrcb from DDK into ntoskrnl. svn path=/trunk/; revision=19440 --- reactos/ntoskrnl/ex/sysinfo.c | 2 +- reactos/ntoskrnl/include/internal/debug.h | 4 +- reactos/ntoskrnl/include/internal/i386/ke.h | 32 ++++++++++ reactos/ntoskrnl/ke/kthread.c | 2 +- reactos/w32api/include/ddk/winddk.h | 67 +++++++++------------ reactos/w32api/include/winnt.h | 12 ++++ 6 files changed, 75 insertions(+), 44 deletions(-) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index bd32c1ed448..73a4b7dc1f5 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -78,7 +78,7 @@ ExGetCurrentProcessorCounts ( *ThreadKernelTime = Prcb->KernelTime + Prcb->UserTime; *TotalCpuTime = Prcb->CurrentThread->KernelTime; - *ProcessorNumber = KeGetCurrentKPCR()->Number; + *ProcessorNumber = KeGetCurrentProcessorNumber(); } /* diff --git a/reactos/ntoskrnl/include/internal/debug.h b/reactos/ntoskrnl/include/internal/debug.h index 985059b9150..b050d819bd2 100644 --- a/reactos/ntoskrnl/include/internal/debug.h +++ b/reactos/ntoskrnl/include/internal/debug.h @@ -35,8 +35,8 @@ /* Assert only on "checked" version */ #ifndef NASSERT #ifdef CONFIG_SMP -#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->Number), DbgBreakPoint(); } -#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentKPCR()->Number), DbgBreakPoint(); } +#define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber()), DbgBreakPoint(); } +#define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d for CPU%d\n", __FILE__,__LINE__, KeGetCurrentProcessorNumber()), DbgBreakPoint(); } #else #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); DbgBreakPoint(); } #define ASSERT(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); DbgBreakPoint(); } diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 78d5edba8ac..585388d0332 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -275,6 +275,38 @@ static __forceinline void Ke386SetPageTableDirectory(ULONG X) #error Unknown compiler for inline assembler #endif +static __inline struct _KPCR * KeGetCurrentKPCR( + VOID) +{ + ULONG Value; +#if defined(__GNUC__) + __asm__ __volatile__ ("movl %%fs:0x1C, %0\n\t" + : "=r" (Value) + : /* no inputs */ + ); +#elif defined(_MSC_VER) + __asm mov eax, fs:[1Ch] + __asm mov [Value], eax +#endif + return (struct _KPCR *) Value; +} + +static __inline struct _KPRCB * KeGetCurrentPrcb( + VOID) +{ + ULONG Value; +#if defined(__GNUC__) + __asm__ __volatile__ ("movl %%fs:0x20, %0\n\t" + : "=r" (Value) + : /* no inputs */ + ); +#elif defined(_MSC_VER) + __asm mov eax, fs:[20h] + __asm mov [Value], eax +#endif + return (struct _KPRCB *) Value; +} + #endif #endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H */ diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index 40b997ee112..5cb0e1e3398 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -1355,7 +1355,7 @@ KeSetAffinityThread(PKTHREAD Thread, if (Thread->State == Running) { - ProcessorMask = 1 << KeGetCurrentKPCR()->Number; + ProcessorMask = 1 << KeGetCurrentProcessorNumber(); if (Thread == KeGetCurrentThread()) { if (!(Affinity & ProcessorMask)) { diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 41d626649a6..3f656599d30 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -140,38 +140,6 @@ typedef ULONG LOGICAL; */ #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) -static __inline struct _KPCR * KeGetCurrentKPCR( - VOID) -{ - ULONG Value; -#if defined(__GNUC__) - __asm__ __volatile__ ("movl %%fs:0x1C, %0\n\t" - : "=r" (Value) - : /* no inputs */ - ); -#elif defined(_MSC_VER) - __asm mov eax, fs:[1Ch] - __asm mov [Value], eax -#endif - return (struct _KPCR *) Value; -} - -static __inline struct _KPRCB * KeGetCurrentPrcb( - VOID) -{ - ULONG Value; -#if defined(__GNUC__) - __asm__ __volatile__ ("movl %%fs:0x20, %0\n\t" - : "=r" (Value) - : /* no inputs */ - ); -#elif defined(_MSC_VER) - __asm mov eax, fs:[20h] - __asm mov [Value], eax -#endif - return (struct _KPRCB *) Value; -} - /* ** Simple structures */ @@ -179,7 +147,6 @@ static __inline struct _KPRCB * KeGetCurrentPrcb( typedef LONG KPRIORITY; typedef UCHAR KIRQL, *PKIRQL; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; -typedef ULONG KAFFINITY, *PKAFFINITY; typedef UCHAR KPROCESSOR_MODE; typedef enum _MODE { @@ -4976,13 +4943,29 @@ DDKAPI KeGetCurrentIrql( VOID); -/* - * ULONG - * KeGetCurrentProcessorNumber( - * VOID) - */ -#define KeGetCurrentProcessorNumber() \ - ((ULONG)KeGetCurrentKPCR()->Number) +static __inline +ULONG +DDKAPI +KeGetCurrentProcessorNumber(VOID) +{ +#if defined(__GNUC__) + ULONG ret; + __asm__ __volatile__ ( + "movl %%fs:%c1, %0\n" + : "=r" (ret) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return ret; +#elif defined(_MSC_VER) +#if _MSC_FULL_VER >= 13012035 + return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); +#else + __asm { movzx eax, _PCR KPCR.Number } +#endif +#else +#error Unknown compiler +#endif +} #if !defined(__INTERLOCKED_DECLARED) #define __INTERLOCKED_DECLARED @@ -8419,6 +8402,8 @@ DDKAPI KeLeaveCriticalRegion( VOID); +#ifdef _X86_ + static __inline VOID KeMemoryBarrier( @@ -8432,6 +8417,8 @@ KeMemoryBarrier( #endif } +#endif + NTOSAPI LONG DDKAPI diff --git a/reactos/w32api/include/winnt.h b/reactos/w32api/include/winnt.h index c780ec7e0cc..36432ef9547 100644 --- a/reactos/w32api/include/winnt.h +++ b/reactos/w32api/include/winnt.h @@ -3609,6 +3609,16 @@ extern struct _TEB * NtCurrentTeb(void); #elif defined(_MSC_VER) +#if (_MSC_FULL_VER >= 13012035) + +DWORD __readfsdword(DWORD); +#pragma intrinsic(__readfsdword) + +__inline PVOID GetCurrentFiber(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x10); } +__inline struct _TEB * NtCurrentTeb(void) { return (PVOID)(ULONG_PTR)__readfsdword(0x18); } + +#else + static __inline PVOID GetCurrentFiber(void) { PVOID p; @@ -3625,6 +3635,8 @@ static __inline struct _TEB * NtCurrentTeb(void) return p; } +#endif /* _MSC_FULL_VER */ + #endif /* __GNUC__/__WATCOMC__/_MSC_VER */ static __inline PVOID GetFiberData(void) -- 2.17.1