- move CONTEXT stuff from wdm.h to winddk.h / armddk.h
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 6 Dec 2008 18:31:33 +0000 (18:31 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 6 Dec 2008 18:31:33 +0000 (18:31 +0000)
- inlcude intrin.h in wdm.h
- avoid redefining PCONTEXT
- use intrinsics for BitScanForward/Reverse

svn path=/trunk/; revision=37902

reactos/include/ddk/wdm.h
reactos/include/ddk/winddk.h
reactos/include/psdk/winnt.h
reactos/include/reactos/arm/armddk.h

index 9daef60..72e901e 100644 (file)
@@ -9,7 +9,11 @@
 #include <ntdef.h>\r
 #include <ntstatus.h>\r
 \r
+#ifdef __GNUC__\r
+#include "intrin.h"\r
+#endif\r
 \r
+typedef struct _CONTEXT *PCONTEXT;\r
 \r
 //\r
 // Resource list definitions\r
@@ -582,131 +586,6 @@ typedef struct _SE_IMPERSONATION_STATE {
 #define SERVICE_DEMAND_START           0x00000003\r
 #define SERVICE_DISABLED               0x00000004\r
 \r
-\r
-\r
-//\r
-// Architecture Defined Contexts\r
-//\r
-#if defined(_M_IX86)\r
-#define SIZE_OF_80387_REGISTERS        80\r
-#define CONTEXT_i386   0x10000\r
-#define CONTEXT_i486   0x10000\r
-#define CONTEXT_CONTROL        (CONTEXT_i386|0x00000001L)\r
-#define CONTEXT_INTEGER        (CONTEXT_i386|0x00000002L)\r
-#define CONTEXT_SEGMENTS       (CONTEXT_i386|0x00000004L)\r
-#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)\r
-#define CONTEXT_DEBUG_REGISTERS        (CONTEXT_i386|0x00000010L)\r
-#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)\r
-#define CONTEXT_FULL   (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)\r
-#define MAXIMUM_SUPPORTED_EXTENSION  512\r
-\r
-#define EXCEPTION_READ_FAULT    0\r
-#define EXCEPTION_WRITE_FAULT   1\r
-#define EXCEPTION_EXECUTE_FAULT 8\r
-\r
-typedef struct _FLOATING_SAVE_AREA {\r
-    ULONG ControlWord;\r
-    ULONG StatusWord;\r
-    ULONG TagWord;\r
-    ULONG ErrorOffset;\r
-    ULONG ErrorSelector;\r
-    ULONG DataOffset;\r
-    ULONG DataSelector;\r
-    UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];\r
-    ULONG Cr0NpxState;\r
-} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;\r
-\r
-typedef struct _CONTEXT {\r
-    ULONG ContextFlags;\r
-    ULONG Dr0;\r
-    ULONG Dr1;\r
-    ULONG Dr2;\r
-    ULONG Dr3;\r
-    ULONG Dr6;\r
-    ULONG Dr7;\r
-    FLOATING_SAVE_AREA FloatSave;\r
-    ULONG SegGs;\r
-    ULONG SegFs;\r
-    ULONG SegEs;\r
-    ULONG SegDs;\r
-    ULONG Edi;\r
-    ULONG Esi;\r
-    ULONG Ebx;\r
-    ULONG Edx;\r
-    ULONG Ecx;\r
-    ULONG Eax;\r
-    ULONG Ebp;\r
-    ULONG Eip;\r
-    ULONG SegCs;\r
-    ULONG EFlags;\r
-    ULONG Esp;\r
-    ULONG SegSs;\r
-    UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];\r
-} CONTEXT, *PCONTEXT;\r
-\r
-#elif defined(_M_AMD64)\r
-#error FIXME-TODO: 64-bit\r
-#elif defined(_M_ARM)\r
-\r
-//\r
-// FIXME: Move to armddk.h?\r
-//\r
-\r
-/* The following flags control the contents of the CONTEXT structure. */\r
-\r
-#define CONTEXT_ARM    0x0000040\r
-#define CONTEXT_CONTROL         (CONTEXT_ARM | 0x00000001L)\r
-#define CONTEXT_INTEGER         (CONTEXT_ARM | 0x00000002L)\r
-\r
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)\r
-\r
-typedef struct _CONTEXT {\r
-       /* The flags values within this flag control the contents of\r
-          a CONTEXT record.\r
-\r
-          If the context record is used as an input parameter, then\r
-          for each portion of the context record controlled by a flag\r
-          whose value is set, it is assumed that that portion of the\r
-          context record contains valid context. If the context record\r
-          is being used to modify a thread's context, then only that\r
-          portion of the threads context will be modified.\r
-\r
-          If the context record is used as an IN OUT parameter to capture\r
-          the context of a thread, then only those portions of the thread's\r
-          context corresponding to set flags will be returned.\r
-\r
-          The context record is never used as an OUT only parameter. */\r
-\r
-       ULONG ContextFlags;\r
-\r
-       /* This section is specified/returned if the ContextFlags word contains\r
-          the flag CONTEXT_INTEGER. */\r
-       ULONG R0;\r
-       ULONG R1;\r
-       ULONG R2;\r
-       ULONG R3;\r
-       ULONG R4;\r
-       ULONG R5;\r
-       ULONG R6;\r
-       ULONG R7;\r
-       ULONG R8;\r
-       ULONG R9;\r
-       ULONG R10;\r
-       ULONG R11;\r
-       ULONG R12;\r
-\r
-       ULONG Sp;\r
-       ULONG Lr;\r
-       ULONG Pc;\r
-       ULONG Psr;\r
-} CONTEXT, *PCONTEXT;\r
-\r
-#else\r
-#error "Undefined processor architecture"\r
-#endif\r
-\r
-\r
-\r
 //\r
 // Exception Records\r
 //\r
index d663f2f..c9ebed2 100644 (file)
@@ -215,6 +215,10 @@ struct _COMPRESSED_DATA_INFO;
 #define KERNEL_LARGE_STACK_SIZE             61440
 #define KERNEL_LARGE_STACK_COMMIT           12288
 
+#define EXCEPTION_READ_FAULT    0
+#define EXCEPTION_WRITE_FAULT   1
+#define EXCEPTION_EXECUTE_FAULT 8
+
 #define DPFLTR_ERROR_LEVEL                  0
 #define DPFLTR_WARNING_LEVEL                1
 #define DPFLTR_TRACE_LEVEL                  2
@@ -5448,6 +5452,58 @@ typedef VOID
 
 #ifdef _X86_
 
+#define SIZE_OF_80387_REGISTERS        80
+#define CONTEXT_i386   0x10000
+#define CONTEXT_i486   0x10000
+#define CONTEXT_CONTROL        (CONTEXT_i386|0x00000001L)
+#define CONTEXT_INTEGER        (CONTEXT_i386|0x00000002L)
+#define CONTEXT_SEGMENTS       (CONTEXT_i386|0x00000004L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
+#define CONTEXT_DEBUG_REGISTERS        (CONTEXT_i386|0x00000010L)
+#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
+#define CONTEXT_FULL   (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
+#define MAXIMUM_SUPPORTED_EXTENSION  512
+
+typedef struct _FLOATING_SAVE_AREA {
+    ULONG ControlWord;
+    ULONG StatusWord;
+    ULONG TagWord;
+    ULONG ErrorOffset;
+    ULONG ErrorSelector;
+    ULONG DataOffset;
+    ULONG DataSelector;
+    UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
+    ULONG Cr0NpxState;
+} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+
+typedef struct _CONTEXT {
+    ULONG ContextFlags;
+    ULONG Dr0;
+    ULONG Dr1;
+    ULONG Dr2;
+    ULONG Dr3;
+    ULONG Dr6;
+    ULONG Dr7;
+    FLOATING_SAVE_AREA FloatSave;
+    ULONG SegGs;
+    ULONG SegFs;
+    ULONG SegEs;
+    ULONG SegDs;
+    ULONG Edi;
+    ULONG Esi;
+    ULONG Ebx;
+    ULONG Edx;
+    ULONG Ecx;
+    ULONG Eax;
+    ULONG Ebp;
+    ULONG Eip;
+    ULONG SegCs;
+    ULONG EFlags;
+    ULONG Esp;
+    ULONG SegSs;
+    UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
+} CONTEXT;
+
 //
 // Types to use to contain PFNs and their counts.
 //
index 0cd1d7a..ca7f90a 100644 (file)
@@ -2229,7 +2229,7 @@ typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
     DWORD64 LastBranchFromRip;
     DWORD64 LastExceptionToRip;
     DWORD64 LastExceptionFromRip;
-} CONTEXT, *PCONTEXT;
+} CONTEXT;
 
 
 typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
@@ -2299,7 +2299,7 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
 NTSYSAPI
 VOID
 __cdecl
-RtlRestoreContext(PCONTEXT ContextRecord,
+RtlRestoreContext(struct _CONTEXT *ContextRecord,
                   struct _EXCEPTION_RECORD *ExceptionRecord);
 
 NTSYSAPI
@@ -4796,29 +4796,8 @@ InterlockedBitTestAndReset(IN LONG volatile *Base,
 #endif
 }
 
-static __inline__ BOOLEAN
-BitScanReverse(OUT ULONG *Index,
-               IN ULONG Mask)
-{
-       BOOLEAN BitPosition = 0;
-#if defined(_M_IX86)
-       __asm__ __volatile__("bsrl %2,%0\n\t"
-                            "setnz %1\n\t"
-                            :"=&r" (*Index), "=q" (BitPosition)
-                            :"rm" (Mask)
-                            :"memory");
-       return BitPosition;
-#else
-       /* Slow implementation for now */
-       for( *Index = 31; *Index; (*Index)-- ) {
-               if( (1<<*Index) & Mask ) {
-                       return TRUE;
-               }
-       }
-
-       return FALSE;
-#endif
-}
+#define BitScanForward _BitScanForward
+#define BitScanReverse _BitScanReverse
 
 #endif
 
index d62a7f8..3f07112 100644 (file)
@@ -58,6 +58,53 @@ typedef struct _KFLOATING_SAVE
     ULONG Reserved;
 } KFLOATING_SAVE, *PKFLOATING_SAVE;
 
+/* The following flags control the contents of the CONTEXT structure. */
+#define CONTEXT_ARM    0x0000040
+#define CONTEXT_CONTROL         (CONTEXT_ARM | 0x00000001L)
+#define CONTEXT_INTEGER         (CONTEXT_ARM | 0x00000002L)
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
+
+typedef struct _CONTEXT {
+       /* The flags values within this flag control the contents of
+          a CONTEXT record.
+
+          If the context record is used as an input parameter, then
+          for each portion of the context record controlled by a flag
+          whose value is set, it is assumed that that portion of the
+          context record contains valid context. If the context record
+          is being used to modify a thread's context, then only that
+          portion of the threads context will be modified.
+
+          If the context record is used as an IN OUT parameter to capture
+          the context of a thread, then only those portions of the thread's
+          context corresponding to set flags will be returned.
+
+          The context record is never used as an OUT only parameter. */
+
+       ULONG ContextFlags;
+
+       /* This section is specified/returned if the ContextFlags word contains
+          the flag CONTEXT_INTEGER. */
+       ULONG R0;
+       ULONG R1;
+       ULONG R2;
+       ULONG R3;
+       ULONG R4;
+       ULONG R5;
+       ULONG R6;
+       ULONG R7;
+       ULONG R8;
+       ULONG R9;
+       ULONG R10;
+       ULONG R11;
+       ULONG R12;
+
+       ULONG Sp;
+       ULONG Lr;
+       ULONG Pc;
+       ULONG Psr;
+} CONTEXT;
+
 //
 // Processor Control Region
 // On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA