#ifndef __ASM__
#include "intrin_i.h"
-#include "v86m.h"
//
// Thread Dispatcher Header DebugActive Mask
#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
//
#define KiGetLinkedTrapFrame(x) \
(PKTRAP_FRAME)((x)->Edx)
-
+
#define KeGetContextReturnRegister(Context) \
((Context)->Eax)
#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
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
//
VOID
KeRegisterInterruptHandler(IN ULONG Vector,
IN PVOID Handler)
-{
+{
UCHAR Entry;
ULONG_PTR Address;
PKIPCR Pcr = (PKIPCR)KeGetPcr();
VdmDispatchBop(
IN PKTRAP_FRAME TrapFrame
);
-
+
BOOLEAN
FASTCALL
KiVdmOpcodePrefix(
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;
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);
//
// Trap Macros
//
-#include "../trap_x.h"
+#include "trap_x.h"
//
// Returns a thread's FPU save area
(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
//
//
// 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.
*
*/
#ifdef __GNUC__
+NTSTATUS
+FORCEINLINE
+KiSystemCallTrampoline(IN PVOID Handler,
+ IN PVOID Arguments,
+ IN ULONG StackBytes)
+{
+ NTSTATUS Result;
+
__asm__ __volatile__
(
"subl %1, %%esp\n"
"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
//
// Converts a base thread to a GUI thread
//
+#ifdef __GNUC__
NTSTATUS
FORCEINLINE
KiConvertToGuiThread(VOID)
{
- NTSTATUS Result;
+ NTSTATUS Result;
PVOID StackFrame;
/*
* 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
"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)
#elif defined(_MSC_VER)
__asm
{
- iret
+ iretd
}
#else
#error Unsupported compiler
/* Disable interrupts and end the interrupt */
_disable();
HalEndSystemInterrupt(Irql, TrapFrame);
-
+
/* Exit the interrupt */
KiEoiHelper(TrapFrame);
}
{
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