Change some FS:x reading macros for better compatibility with MSVC compiler and move...
authorFilip Navara <filip.navara@gmail.com>
Tue, 22 Nov 2005 00:47:58 +0000 (00:47 +0000)
committerFilip Navara <filip.navara@gmail.com>
Tue, 22 Nov 2005 00:47:58 +0000 (00:47 +0000)
svn path=/trunk/; revision=19440

reactos/ntoskrnl/ex/sysinfo.c
reactos/ntoskrnl/include/internal/debug.h
reactos/ntoskrnl/include/internal/i386/ke.h
reactos/ntoskrnl/ke/kthread.c
reactos/w32api/include/ddk/winddk.h
reactos/w32api/include/winnt.h

index bd32c1e..73a4b7d 100644 (file)
@@ -78,7 +78,7 @@ ExGetCurrentProcessorCounts (
 
        *ThreadKernelTime = Prcb->KernelTime + Prcb->UserTime;
        *TotalCpuTime = Prcb->CurrentThread->KernelTime;
-       *ProcessorNumber = KeGetCurrentKPCR()->Number;
+       *ProcessorNumber = KeGetCurrentProcessorNumber();
 }
 
 /*
index 985059b..b050d81 100644 (file)
@@ -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(); }
index 78d5edb..585388d 100644 (file)
@@ -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 */
 
index 40b997e..5cb0e1e 100644 (file)
@@ -1355,7 +1355,7 @@ KeSetAffinityThread(PKTHREAD Thread,
 
         if (Thread->State == Running) {
 
-            ProcessorMask = 1 << KeGetCurrentKPCR()->Number;
+            ProcessorMask = 1 << KeGetCurrentProcessorNumber();
             if (Thread == KeGetCurrentThread()) {
 
                 if (!(Affinity & ProcessorMask)) {
index 41d6266..3f65659 100644 (file)
@@ -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
index c780ec7..36432ef 100644 (file)
@@ -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)