[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / include / internal / i386 / ke.h
index bc5f293..8363477 100644 (file)
@@ -3,7 +3,6 @@
 #ifndef __ASM__
 
 #include "intrin_i.h"
-#include "v86m.h"
 
 //
 // Thread Dispatcher Header DebugActive Mask
@@ -11,8 +10,6 @@
 #define DR_MASK(x)                              (1 << (x))
 #define DR_REG_MASK                             0x4F
 
-#define IMAGE_FILE_MACHINE_ARCHITECTURE IMAGE_FILE_MACHINE_I386
-
 //
 // INT3 is 1 byte long
 //
@@ -34,7 +31,7 @@
 
 #define KiGetLinkedTrapFrame(x) \
     (PKTRAP_FRAME)((x)->Edx)
-    
+
 #define KeGetContextReturnRegister(Context) \
     ((Context)->Eax)
 
@@ -78,7 +75,7 @@
 #define KTE_SKIP_PM_BIT  (((KTRAP_EXIT_SKIP_BITS) { { .SkipPreviousMode = TRUE } }).Bits)
 #define KTE_SKIP_SEG_BIT (((KTRAP_EXIT_SKIP_BITS) { { .SkipSegments  = TRUE } }).Bits)
 #define KTE_SKIP_VOL_BIT (((KTRAP_EXIT_SKIP_BITS) { { .SkipVolatiles = TRUE } }).Bits)
+
 typedef union _KTRAP_EXIT_SKIP_BITS
 {
     struct
@@ -166,7 +163,32 @@ typedef struct _KV8086_STACK_FRAME
     FX_SAVE_AREA NpxArea;
     KV86_FRAME V86Frame;
 } KV8086_STACK_FRAME, *PKV8086_STACK_FRAME;
-              
+
+/* Diable interrupts and return whether they were enabled before */
+FORCEINLINE
+BOOLEAN
+KeDisableInterrupts(VOID)
+{
+    ULONG Flags;
+    BOOLEAN Return;
+
+    /* Get EFLAGS and check if the interrupt bit is set */
+    Flags = __readeflags();
+    Return = (Flags & EFLAGS_INTERRUPT_MASK) ? TRUE: FALSE;
+
+    /* Disable interrupts */
+    _disable();
+    return Return;
+}
+
+/* Restore previous interrupt state */
+FORCEINLINE
+VOID
+KeRestoreInterrupts(BOOLEAN WereEnabled)
+{
+    if (WereEnabled) _enable();
+}
+
 //
 // Registers an interrupt handler with an IDT vector
 //
@@ -174,7 +196,7 @@ FORCEINLINE
 VOID
 KeRegisterInterruptHandler(IN ULONG Vector,
                            IN PVOID Handler)
-{                           
+{
     UCHAR Entry;
     ULONG_PTR Address;
     PKIPCR Pcr = (PKIPCR)KeGetPcr();
@@ -389,7 +411,7 @@ NTAPI
 VdmDispatchBop(
     IN PKTRAP_FRAME TrapFrame
 );
+
 BOOLEAN
 FASTCALL
 KiVdmOpcodePrefix(
@@ -442,7 +464,7 @@ extern PVOID Ki386IopmSaveArea;
 extern ULONG KeI386EFlagsAndMaskV86;
 extern ULONG KeI386EFlagsOrMaskV86;
 extern BOOLEAN KeI386VirtualIntExtensions;
-extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR];
+extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR+1];
 extern KDESCRIPTOR KiIdtDescriptor;
 extern BOOLEAN KiI386PentiumLockErrataPresent;
 extern ULONG KeI386NpxPresent;
@@ -455,11 +477,12 @@ extern ULONG Ke386CacheAlignment;
 extern ULONG KiFastSystemCallDisable;
 extern UCHAR KiDebugRegisterTrapOffsets[9];
 extern UCHAR KiDebugRegisterContextOffsets[9];
-extern VOID __cdecl KiTrap02(VOID);
+extern DECLSPEC_NORETURN VOID __cdecl KiTrap02(VOID);
 extern VOID __cdecl KiTrap08(VOID);
 extern VOID __cdecl KiTrap13(VOID);
 extern VOID __cdecl KiFastCallEntry(VOID);
 extern VOID NTAPI ExpInterlockedPopEntrySListFault(VOID);
+extern VOID NTAPI ExpInterlockedPopEntrySListResume(VOID);
 extern VOID __cdecl CopyParams(VOID);
 extern VOID __cdecl ReadBatch(VOID);
 extern VOID __cdecl FrRestore(VOID);
@@ -470,7 +493,7 @@ extern CHAR KiSystemCallExit2[];
 //
 // Trap Macros
 //
-#include "../trap_x.h"
+#include "trap_x.h"
 
 //
 // Returns a thread's FPU save area
@@ -516,28 +539,6 @@ Ke386SanitizeFlags(IN ULONG Eflags,
             (EFLAGS_INTERRUPT_MASK | (Eflags & EFLAGS_USER_SANITIZE)));
 }
 
-//
-// Gets a DR register from a CONTEXT structure
-//
-FORCEINLINE
-PVOID
-KiDrFromContext(IN ULONG Dr,
-                IN PCONTEXT Context)
-{
-    return *(PVOID*)((ULONG_PTR)Context + KiDebugRegisterContextOffsets[Dr]);
-}
-
-//
-// Gets a DR register from a KTRAP_FRAME structure
-//
-FORCEINLINE
-PVOID*
-KiDrFromTrapFrame(IN ULONG Dr,
-                  IN PKTRAP_FRAME TrapFrame)
-{
-    return (PVOID*)((ULONG_PTR)TrapFrame + KiDebugRegisterTrapOffsets[Dr]);
-}
-
 //
 // Sanitizes a Debug Register
 //
@@ -603,14 +604,7 @@ KiDispatchException2Args(IN NTSTATUS Code,
 //
 // Performs a system call
 //
-NTSTATUS
-FORCEINLINE
-KiSystemCallTrampoline(IN PVOID Handler,
-                       IN PVOID Arguments,
-                       IN ULONG StackBytes)
-{
-    NTSTATUS Result;
-    
+
     /*
      * This sequence does a RtlCopyMemory(Stack - StackBytes, Arguments, StackBytes)
      * and then calls the function associated with the system call.
@@ -627,6 +621,14 @@ KiSystemCallTrampoline(IN PVOID Handler,
      *
      */
 #ifdef __GNUC__
+NTSTATUS
+FORCEINLINE
+KiSystemCallTrampoline(IN PVOID Handler,
+                       IN PVOID Arguments,
+                       IN ULONG StackBytes)
+{
+    NTSTATUS Result;
+
     __asm__ __volatile__
     (
         "subl %1, %%esp\n"
@@ -642,25 +644,32 @@ KiSystemCallTrampoline(IN PVOID Handler,
           "r"(Handler)
         : "%esp", "%esi", "%edi"
     );
+    return Result;
+}
 #elif defined(_MSC_VER)
+NTSTATUS
+FORCEINLINE
+KiSystemCallTrampoline(IN PVOID Handler,
+                       IN PVOID Arguments,
+                       IN ULONG StackBytes)
+{
     __asm
     {
         mov ecx, StackBytes
-        mov edx, Arguments
+        mov esi, Arguments
+        mov eax, Handler
         sub esp, ecx
         mov edi, esp
-        mov esi, edx
         shr ecx, 2
         rep movsd
-        call Handler
-        mov Result, eax
+        call eax
     }
+    /* Return with result in EAX */
+}
 #else
 #error Unknown Compiler
 #endif
 
-    return Result;
-}
 
 //
 // Checks for pending APCs
@@ -702,11 +711,12 @@ KiCheckForApcDelivery(IN PKTRAP_FRAME TrapFrame)
 //
 // Converts a base thread to a GUI thread
 //
+#ifdef __GNUC__
 NTSTATUS
 FORCEINLINE
 KiConvertToGuiThread(VOID)
 {
-    NTSTATUS Result;  
+    NTSTATUS Result;
     PVOID StackFrame;
 
     /*
@@ -725,35 +735,26 @@ KiConvertToGuiThread(VOID)
      * on its merry way.
      *
      */
-#ifdef __GNUC__
     __asm__ __volatile__
     (
-        "movl %%ebp, %1\n"
-        "subl %%esp, %1\n"
-        "call _PsConvertToGuiThread@0\n"
-        "addl %%esp, %1\n"
-        "movl %1, %%ebp\n"
-        "movl %%eax, %0\n"
-        : "=r"(Result), "=r"(StackFrame)
+        "movl %%ebp, %1\n\t"
+        "subl %%esp, %1\n\t"
+        "call _PsConvertToGuiThread@0\n\t"
+        "addl %%esp, %1\n\t"
+        "movl %1, %%ebp"
+        : "=a"(Result), "=r"(StackFrame)
         :
         : "%esp", "%ecx", "%edx", "memory"
     );
+    return Result;
+}
 #elif defined(_MSC_VER)
-    NTSTATUS NTAPI PsConvertToGuiThread(VOID);
-    __asm
-    {
-        mov StackFrame, ebp
-        sub StackFrame, esp
-        call PsConvertToGuiThread
-        add StackFrame, esp
-        mov ebp, StackFrame
-        mov Result, eax
-    }
+NTSTATUS
+NTAPI
+KiConvertToGuiThread(VOID);
 #else
 #error Unknown Compiler
 #endif
-    return Result;
-}
 
 //
 // Switches from boot loader to initial kernel stack
@@ -770,7 +771,7 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack)
         "subl %1, %%esp\n"
         "pushl %2\n"
         "jmp _KiSystemStartupBootStack@0\n"
-        : 
+        :
         : "c"(InitialStack),
           "i"(NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH),
           "i"(CR0_EM | CR0_TS | CR0_MP)
@@ -806,7 +807,7 @@ KiIret(VOID)
 #elif defined(_MSC_VER)
     __asm
     {
-        iret
+        iretd
     }
 #else
 #error Unsupported compiler
@@ -826,7 +827,7 @@ KiEndInterrupt(IN KIRQL Irql,
     /* Disable interrupts and end the interrupt */
     _disable();
     HalEndSystemInterrupt(Irql, TrapFrame);
-    
+
     /* Exit the interrupt */
     KiEoiHelper(TrapFrame);
 }
@@ -840,11 +841,18 @@ Ki386PerfEnd(VOID)
 {
     extern ULONGLONG BootCyclesEnd, BootCycles;
     BootCyclesEnd = __rdtsc();
-    DbgPrint("Boot took %I64d cycles!\n", BootCyclesEnd - BootCycles);
-    DbgPrint("Interrupts: %d System Calls: %d Context Switches: %d\n",
+    DbgPrint("Boot took %I64u cycles!\n", BootCyclesEnd - BootCycles);
+    DbgPrint("Interrupts: %u System Calls: %u Context Switches: %u\n",
              KeGetCurrentPrcb()->InterruptCount,
              KeGetCurrentPrcb()->KeSystemCalls,
              KeGetContextSwitches(KeGetCurrentPrcb()));
 }
 
+FORCEINLINE
+PULONG
+KiGetUserModeStackAddress(void)
+{
+    return &(KeGetCurrentThread()->TrapFrame->HardwareEsp);
+}
+
 #endif