Change some FS:x reading macros for better compatibility with MSVC
compiler and move KeGetCurrentKPCR/KeGetCurrentPrcb from DDK into
ntoskrnl.
Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
Modified: trunk/reactos/ntoskrnl/include/internal/debug.h
Modified: trunk/reactos/ntoskrnl/include/internal/i386/ke.h
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
Modified: trunk/reactos/w32api/include/ddk/winddk.h
Modified: trunk/reactos/w32api/include/winnt.h
_____
Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
--- trunk/reactos/ntoskrnl/ex/sysinfo.c 2005-11-22 00:38:45 UTC (rev
19439)
+++ trunk/reactos/ntoskrnl/ex/sysinfo.c 2005-11-22 00:47:58 UTC (rev
19440)
@@ -78,7 +78,7 @@
*ThreadKernelTime = Prcb->KernelTime + Prcb->UserTime;
*TotalCpuTime = Prcb->CurrentThread->KernelTime;
- *ProcessorNumber = KeGetCurrentKPCR()->Number;
+ *ProcessorNumber = KeGetCurrentProcessorNumber();
}
/*
_____
Modified: trunk/reactos/ntoskrnl/include/internal/debug.h
--- trunk/reactos/ntoskrnl/include/internal/debug.h 2005-11-22
00:38:45 UTC (rev 19439)
+++ trunk/reactos/ntoskrnl/include/internal/debug.h 2005-11-22
00:47:58 UTC (rev 19440)
@@ -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(); }
_____
Modified: trunk/reactos/ntoskrnl/include/internal/i386/ke.h
--- trunk/reactos/ntoskrnl/include/internal/i386/ke.h 2005-11-22
00:38:45 UTC (rev 19439)
+++ trunk/reactos/ntoskrnl/include/internal/i386/ke.h 2005-11-22
00:47:58 UTC (rev 19440)
@@ -275,7 +275,39 @@
#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 */
/* EOF */
_____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
--- trunk/reactos/ntoskrnl/ke/kthread.c 2005-11-22 00:38:45 UTC (rev
19439)
+++ trunk/reactos/ntoskrnl/ke/kthread.c 2005-11-22 00:47:58 UTC (rev
19440)
@@ -1355,7 +1355,7 @@
if (Thread->State == Running) {
- ProcessorMask = 1 << KeGetCurrentKPCR()->Number;
+ ProcessorMask = 1 << KeGetCurrentProcessorNumber();
if (Thread == KeGetCurrentThread()) {
if (!(Affinity & ProcessorMask)) {
_____
Modified: trunk/reactos/w32api/include/ddk/winddk.h
--- trunk/reactos/w32api/include/ddk/winddk.h 2005-11-22 00:38:45 UTC
(rev 19439)
+++ trunk/reactos/w32api/include/ddk/winddk.h 2005-11-22 00:47:58 UTC
(rev 19440)
@@ -140,38 +140,6 @@
*/
#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 @@
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 @@
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 @@
KeLeaveCriticalRegion(
VOID);
+#ifdef _X86_
+
static __inline
VOID
KeMemoryBarrier(
@@ -8432,6 +8417,8 @@
#endif
}
+#endif
+
NTOSAPI
LONG
DDKAPI
_____
Modified: trunk/reactos/w32api/include/winnt.h
--- trunk/reactos/w32api/include/winnt.h 2005-11-22 00:38:45 UTC
(rev 19439)
+++ trunk/reactos/w32api/include/winnt.h 2005-11-22 00:47:58 UTC
(rev 19440)
@@ -3609,6 +3609,16 @@
#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 @@
return p;
}
+#endif /* _MSC_FULL_VER */
+
#endif /* __GNUC__/__WATCOMC__/_MSC_VER */
static __inline PVOID GetFiberData(void)