Fixes in i686 version of KepInitializeThreadContext()
This commit is contained in:
parent
07998cafd4
commit
641b34b119
@ -169,8 +169,12 @@
|
||||
#define SIZE_OF_80387_REGISTERS 80
|
||||
#define SIZE_OF_FX_REGISTERS 128
|
||||
|
||||
/* NPX state definitions */
|
||||
#define NPX_STATE_LOADED 0x0
|
||||
#define NPX_STATE_UNLOADED 0xA
|
||||
|
||||
/* Floating point state storing structure */
|
||||
typedef struct _FLOATING_SAVE_AREA
|
||||
typedef struct _FN_SAVE_FORMAT
|
||||
{
|
||||
ULONG ControlWord;
|
||||
ULONG StatusWord;
|
||||
@ -181,10 +185,10 @@ typedef struct _FLOATING_SAVE_AREA
|
||||
ULONG DataSelector;
|
||||
UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
|
||||
ULONG Cr0NpxState;
|
||||
} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
|
||||
} FN_SAVE_FORMAT, *PFN_SAVE_FORMAT;
|
||||
|
||||
/* Data for FXSAVE/FXRSTOR instructions structure definition */
|
||||
typedef struct _SIMD_SAVE_AREA
|
||||
typedef struct _FX_SAVE_FORMAT
|
||||
{
|
||||
USHORT ControlWord;
|
||||
USHORT StatusWord;
|
||||
@ -200,15 +204,15 @@ typedef struct _SIMD_SAVE_AREA
|
||||
UCHAR Reserved3[SIZE_OF_FX_REGISTERS];
|
||||
UCHAR Reserved4[224];
|
||||
UCHAR Align16Byte[8];
|
||||
} SIMD_SAVE_AREA, *PSIMD_SAVE_AREA;
|
||||
} FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
|
||||
|
||||
/* Floating save area structure definition */
|
||||
typedef struct _FX_SAVE_AREA
|
||||
{
|
||||
union
|
||||
{
|
||||
FLOATING_SAVE_AREA FnArea;
|
||||
SIMD_SAVE_AREA FxArea;
|
||||
FN_SAVE_FORMAT FnArea;
|
||||
FX_SAVE_FORMAT FxArea;
|
||||
};
|
||||
ULONG NpxSavedCpu;
|
||||
ULONG Cr0NpxState;
|
||||
@ -224,7 +228,7 @@ typedef struct _CONTEXT
|
||||
ULONG Dr3;
|
||||
ULONG Dr6;
|
||||
ULONG Dr7;
|
||||
FLOATING_SAVE_AREA FloatSave;
|
||||
FN_SAVE_FORMAT FloatSave;
|
||||
ULONG SegGs;
|
||||
ULONG SegFs;
|
||||
ULONG SegEs;
|
||||
@ -357,7 +361,7 @@ typedef struct _KSTART_FRAME
|
||||
typedef struct _KSWITCH_FRAME
|
||||
{
|
||||
PVOID ExceptionList;
|
||||
PVOID Reserved;
|
||||
BOOLEAN ApcBypassDisabled;
|
||||
PVOID Return;
|
||||
} KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||
|
||||
@ -366,8 +370,8 @@ typedef struct _KTRAP_FRAME
|
||||
{
|
||||
ULONG DbgEbp;
|
||||
ULONG DbgEip;
|
||||
ULONG DbgArgMark;
|
||||
ULONG DbgArgPointer;
|
||||
ULONG DbgMark;
|
||||
ULONG DbgPointer;
|
||||
ULONG TempSegCs;
|
||||
ULONG TempEsp;
|
||||
ULONG Dr0;
|
||||
|
@ -22,8 +22,9 @@ typedef struct _CONTEXT CONTEXT, *PCONTEXT;
|
||||
typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
|
||||
typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS;
|
||||
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE;
|
||||
typedef struct _FLOATING_SAVE_AREA FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
|
||||
typedef struct _FN_SAVE_FORMAT FN_SAVE_FORMAT, *PFN_SAVE_FORMAT;
|
||||
typedef struct _FX_SAVE_AREA FX_SAVE_AREA, *PFX_SAVE_AREA;
|
||||
typedef struct _FX_SAVE_FORMAT FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
|
||||
typedef struct _HARDWARE_PTE HARDWARE_PTE, *PHARDWARE_PTE;
|
||||
typedef struct _HARDWARE_PTE_PAE HARDWARE_PTE_PAE, *PHARDWARE_PTE_PAE;
|
||||
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR;
|
||||
@ -40,7 +41,6 @@ typedef struct _KSWITCH_FRAME KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||
typedef struct _KTHREAD_INIT_FRAME KTHREAD_INIT_FRAME, *PKTHREAD_INIT_FRAME;
|
||||
typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME;
|
||||
typedef struct _KTSS KTSS, *PKTSS;
|
||||
typedef struct _SIMD_SAVE_AREA SIMD_SAVE_AREA, *PSIMD_SAVE_AREA;
|
||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||
|
||||
#endif /* __XTDK_I686_XTSTRUCT_H */
|
||||
|
@ -40,13 +40,13 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
||||
IN PCONTEXT ContextRecord)
|
||||
{
|
||||
PKTHREAD_INIT_FRAME ThreadFrame;
|
||||
PSIMD_SAVE_AREA SimdSaveArea;
|
||||
PFX_SAVE_FORMAT FxSaveFormat;
|
||||
|
||||
/* Set initial thread frame */
|
||||
ThreadFrame = (PKTHREAD_INIT_FRAME)Thread->InitialStack - sizeof(KTHREAD_INIT_FRAME);
|
||||
ThreadFrame = ((PKTHREAD_INIT_FRAME)Thread->InitialStack) - sizeof(KTHREAD_INIT_FRAME);
|
||||
|
||||
/* Fill floating point save area with zeroes */
|
||||
RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FLOATING_SAVE_AREA));
|
||||
RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FX_SAVE_AREA));
|
||||
|
||||
/* Check if context provided for this thread */
|
||||
if(ContextRecord)
|
||||
@ -58,19 +58,20 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
||||
ContextRecord->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL;
|
||||
|
||||
/* This is user mode thread */
|
||||
ThreadFrame->StartFrame.UserMode = TRUE;
|
||||
Thread->PreviousMode = UserMode;
|
||||
|
||||
/* Disable coprocessor floating point state */
|
||||
Thread->NpxState = CR0_TS | CR0_MP;
|
||||
Thread->NpxState = NPX_STATE_UNLOADED;
|
||||
Thread->Header.NpxIrql = PASSIVE_LEVEL;
|
||||
|
||||
/* Set initial floating point state */
|
||||
FxSaveFormat = (PFX_SAVE_FORMAT)ContextRecord->ExtendedRegisters;
|
||||
FxSaveFormat->ControlWord = 0x27F;
|
||||
FxSaveFormat->MxCsr = 0x1F80;
|
||||
ContextRecord->FloatSave.Cr0NpxState = 0;
|
||||
ThreadFrame->NpxFrame.Cr0NpxState = 0;
|
||||
ThreadFrame->NpxFrame.NpxSavedCpu = 0;
|
||||
SimdSaveArea = (PSIMD_SAVE_AREA)ContextRecord->ExtendedRegisters;
|
||||
SimdSaveArea->ControlWord = 0x27F;
|
||||
SimdSaveArea->MxCsr = 0x1F80;
|
||||
ContextRecord->FloatSave.Cr0NpxState = 0;
|
||||
|
||||
/* Clear DR6 and DR7 registers */
|
||||
ThreadFrame->TrapFrame.Dr6 = 0;
|
||||
@ -84,23 +85,24 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
||||
ThreadFrame->TrapFrame.SegEs |= RPL_MASK;
|
||||
ThreadFrame->TrapFrame.HardwareSegSs |= RPL_MASK;
|
||||
|
||||
/* Set kernel mode thread in the trap frame */
|
||||
/* Set debug mark in the trap frame */
|
||||
ThreadFrame->TrapFrame.DbgMark = 0x8BADF00D;
|
||||
|
||||
/* Set user mode thread in the trap frame */
|
||||
ThreadFrame->TrapFrame.PreviousMode = UserMode;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is kernel mode thread */
|
||||
ThreadFrame->StartFrame.UserMode = FALSE;
|
||||
Thread->PreviousMode = KernelMode;
|
||||
|
||||
/* Disable coprocessor floating point state */
|
||||
Thread->NpxState = CR0_TS | CR0_MP;
|
||||
Thread->NpxState = NPX_STATE_UNLOADED;
|
||||
|
||||
/* Set initial floating point state */
|
||||
ThreadFrame->NpxFrame.FxArea.ControlWord = 0x27F;
|
||||
ThreadFrame->NpxFrame.FxArea.MxCsr = 0x1F80;
|
||||
|
||||
/* Mark as kernel mode thread in the start frame */
|
||||
ThreadFrame->StartFrame.UserMode = FALSE;
|
||||
}
|
||||
|
||||
/* Initialize thread startup information */
|
||||
@ -109,6 +111,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
||||
ThreadFrame->StartFrame.SystemRoutine = SystemRoutine;
|
||||
|
||||
/* Initialize switch frame */
|
||||
ThreadFrame->SwitchFrame.ApcBypassDisabled = TRUE;
|
||||
ThreadFrame->SwitchFrame.ExceptionList = (PEXCEPTION_REGISTRATION_RECORD) - 1;
|
||||
|
||||
/* Set thread stack */
|
||||
|
Loading…
Reference in New Issue
Block a user