Fixes in AMD64 version of KepInitializeThreadContext() to get rid of PageFault exception
This commit is contained in:
parent
91ce0f9947
commit
362eefc2b3
@ -139,6 +139,11 @@
|
|||||||
/* Size of legacy 387 registers */
|
/* Size of legacy 387 registers */
|
||||||
#define SIZE_OF_80387_REGISTERS 80
|
#define SIZE_OF_80387_REGISTERS 80
|
||||||
|
|
||||||
|
/* NPX state definitions */
|
||||||
|
#define NPX_STATE_UNUSED 0x0
|
||||||
|
#define NPX_STATE_SCRUB 0x1
|
||||||
|
#define NPX_STATE_SWITCH 0x2
|
||||||
|
|
||||||
/* Floating point state storing structure */
|
/* Floating point state storing structure */
|
||||||
typedef struct _FLOATING_SAVE_AREA
|
typedef struct _FLOATING_SAVE_AREA
|
||||||
{
|
{
|
||||||
@ -352,7 +357,8 @@ typedef struct _KSWITCH_FRAME
|
|||||||
ULONG64 P4Home;
|
ULONG64 P4Home;
|
||||||
ULONG64 P5Home;
|
ULONG64 P5Home;
|
||||||
ULONG MxCsr;
|
ULONG MxCsr;
|
||||||
UCHAR Reserved[4];
|
KIRQL ApcBypass;
|
||||||
|
UCHAR Reserved[3];
|
||||||
ULONG64 Rbp;
|
ULONG64 Rbp;
|
||||||
ULONG64 Return;
|
ULONG64 Return;
|
||||||
} KSWITCH_FRAME, *PKSWITCH_FRAME;
|
} KSWITCH_FRAME, *PKSWITCH_FRAME;
|
||||||
|
@ -42,7 +42,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
PKTHREAD_INIT_FRAME ThreadFrame;
|
PKTHREAD_INIT_FRAME ThreadFrame;
|
||||||
|
|
||||||
/* Set initial thread frame */
|
/* Set initial thread frame */
|
||||||
ThreadFrame = (PKTHREAD_INIT_FRAME)Thread->InitialStack - sizeof(KTHREAD_INIT_FRAME);
|
ThreadFrame = ((PKTHREAD_INIT_FRAME)Thread->InitialStack) - 1;
|
||||||
|
|
||||||
/* Fill floating point save area with zeroes */
|
/* Fill floating point save area with zeroes */
|
||||||
RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FLOATING_SAVE_AREA));
|
RtlZeroMemory(&ThreadFrame->NpxFrame, sizeof(FLOATING_SAVE_AREA));
|
||||||
@ -68,7 +68,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
Thread->PreviousMode = UserMode;
|
Thread->PreviousMode = UserMode;
|
||||||
|
|
||||||
/* Enable floating point state */
|
/* Enable floating point state */
|
||||||
Thread->NpxState = 1;
|
Thread->NpxState = NPX_STATE_SCRUB;
|
||||||
|
|
||||||
/* Set initial floating point state */
|
/* Set initial floating point state */
|
||||||
ThreadFrame->NpxFrame.ControlWord = 0x27F;
|
ThreadFrame->NpxFrame.ControlWord = 0x27F;
|
||||||
@ -93,9 +93,9 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
Thread->PreviousMode = KernelMode;
|
Thread->PreviousMode = KernelMode;
|
||||||
|
|
||||||
/* Disable floating point state */
|
/* Disable floating point state */
|
||||||
Thread->NpxState = 0;
|
Thread->NpxState = NPX_STATE_UNUSED;
|
||||||
|
|
||||||
/* Set thread startup frame return information */
|
/* Set thread start address */
|
||||||
ThreadFrame->StartFrame.Return = (ULONG64)NULL;
|
ThreadFrame->StartFrame.Return = (ULONG64)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,10 +106,10 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
|
|||||||
ThreadFrame->StartFrame.P4Home = (ULONG64)SystemRoutine;
|
ThreadFrame->StartFrame.P4Home = (ULONG64)SystemRoutine;
|
||||||
|
|
||||||
/* Initialize switch frame */
|
/* Initialize switch frame */
|
||||||
ThreadFrame->SwitchFrame.Rbp = (ULONG64)&ThreadFrame->TrapFrame + 128;
|
ThreadFrame->SwitchFrame.ApcBypass = APC_LEVEL;
|
||||||
ThreadFrame->SwitchFrame.MxCsr = INITIAL_MXCSR;
|
ThreadFrame->SwitchFrame.MxCsr = INITIAL_MXCSR;
|
||||||
|
ThreadFrame->SwitchFrame.Rbp = (ULONG64)&ThreadFrame->TrapFrame;
|
||||||
|
|
||||||
/* Set thread stack */
|
/* Set thread stack */
|
||||||
Thread->InitialStack = &ThreadFrame->NpxFrame;
|
|
||||||
Thread->KernelStack = &ThreadFrame->SwitchFrame;
|
Thread->KernelStack = &ThreadFrame->SwitchFrame;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user