Fixes in i686 version of KepInitializeThreadContext()
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 28s
Builds / ExectOS (i686) (push) Successful in 27s

This commit is contained in:
Rafal Kupiec 2023-11-08 16:06:01 +01:00
parent 07998cafd4
commit 641b34b119
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
3 changed files with 32 additions and 25 deletions

View File

@ -169,8 +169,12 @@
#define SIZE_OF_80387_REGISTERS 80 #define SIZE_OF_80387_REGISTERS 80
#define SIZE_OF_FX_REGISTERS 128 #define SIZE_OF_FX_REGISTERS 128
/* NPX state definitions */
#define NPX_STATE_LOADED 0x0
#define NPX_STATE_UNLOADED 0xA
/* Floating point state storing structure */ /* Floating point state storing structure */
typedef struct _FLOATING_SAVE_AREA typedef struct _FN_SAVE_FORMAT
{ {
ULONG ControlWord; ULONG ControlWord;
ULONG StatusWord; ULONG StatusWord;
@ -181,10 +185,10 @@ typedef struct _FLOATING_SAVE_AREA
ULONG DataSelector; ULONG DataSelector;
UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
ULONG Cr0NpxState; ULONG Cr0NpxState;
} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; } FN_SAVE_FORMAT, *PFN_SAVE_FORMAT;
/* Data for FXSAVE/FXRSTOR instructions structure definition */ /* Data for FXSAVE/FXRSTOR instructions structure definition */
typedef struct _SIMD_SAVE_AREA typedef struct _FX_SAVE_FORMAT
{ {
USHORT ControlWord; USHORT ControlWord;
USHORT StatusWord; USHORT StatusWord;
@ -200,15 +204,15 @@ typedef struct _SIMD_SAVE_AREA
UCHAR Reserved3[SIZE_OF_FX_REGISTERS]; UCHAR Reserved3[SIZE_OF_FX_REGISTERS];
UCHAR Reserved4[224]; UCHAR Reserved4[224];
UCHAR Align16Byte[8]; UCHAR Align16Byte[8];
} SIMD_SAVE_AREA, *PSIMD_SAVE_AREA; } FX_SAVE_FORMAT, *PFX_SAVE_FORMAT;
/* Floating save area structure definition */ /* Floating save area structure definition */
typedef struct _FX_SAVE_AREA typedef struct _FX_SAVE_AREA
{ {
union union
{ {
FLOATING_SAVE_AREA FnArea; FN_SAVE_FORMAT FnArea;
SIMD_SAVE_AREA FxArea; FX_SAVE_FORMAT FxArea;
}; };
ULONG NpxSavedCpu; ULONG NpxSavedCpu;
ULONG Cr0NpxState; ULONG Cr0NpxState;
@ -224,7 +228,7 @@ typedef struct _CONTEXT
ULONG Dr3; ULONG Dr3;
ULONG Dr6; ULONG Dr6;
ULONG Dr7; ULONG Dr7;
FLOATING_SAVE_AREA FloatSave; FN_SAVE_FORMAT FloatSave;
ULONG SegGs; ULONG SegGs;
ULONG SegFs; ULONG SegFs;
ULONG SegEs; ULONG SegEs;
@ -357,7 +361,7 @@ typedef struct _KSTART_FRAME
typedef struct _KSWITCH_FRAME typedef struct _KSWITCH_FRAME
{ {
PVOID ExceptionList; PVOID ExceptionList;
PVOID Reserved; BOOLEAN ApcBypassDisabled;
PVOID Return; PVOID Return;
} KSWITCH_FRAME, *PKSWITCH_FRAME; } KSWITCH_FRAME, *PKSWITCH_FRAME;
@ -366,8 +370,8 @@ typedef struct _KTRAP_FRAME
{ {
ULONG DbgEbp; ULONG DbgEbp;
ULONG DbgEip; ULONG DbgEip;
ULONG DbgArgMark; ULONG DbgMark;
ULONG DbgArgPointer; ULONG DbgPointer;
ULONG TempSegCs; ULONG TempSegCs;
ULONG TempEsp; ULONG TempEsp;
ULONG Dr0; ULONG Dr0;

View File

@ -22,8 +22,9 @@ typedef struct _CONTEXT CONTEXT, *PCONTEXT;
typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION; typedef struct _CPU_IDENTIFICATION CPU_IDENTIFICATION, *PCPU_IDENTIFICATION;
typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS; typedef struct _CPUID_REGISTERS CPUID_REGISTERS, *PCPUID_REGISTERS;
typedef struct _CPUID_SIGNATURE CPUID_SIGNATURE, *PCPUID_SIGNATURE; 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_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 HARDWARE_PTE, *PHARDWARE_PTE;
typedef struct _HARDWARE_PTE_PAE HARDWARE_PTE_PAE, *PHARDWARE_PTE_PAE; typedef struct _HARDWARE_PTE_PAE HARDWARE_PTE_PAE, *PHARDWARE_PTE_PAE;
typedef struct _KDESCRIPTOR KDESCRIPTOR, *PKDESCRIPTOR; 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 _KTHREAD_INIT_FRAME KTHREAD_INIT_FRAME, *PKTHREAD_INIT_FRAME;
typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME; typedef struct _KTRAP_FRAME KTRAP_FRAME, *PKTRAP_FRAME;
typedef struct _KTSS KTSS, *PKTSS; 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; typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
#endif /* __XTDK_I686_XTSTRUCT_H */ #endif /* __XTDK_I686_XTSTRUCT_H */

View File

@ -40,13 +40,13 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
IN PCONTEXT ContextRecord) IN PCONTEXT ContextRecord)
{ {
PKTHREAD_INIT_FRAME ThreadFrame; PKTHREAD_INIT_FRAME ThreadFrame;
PSIMD_SAVE_AREA SimdSaveArea; PFX_SAVE_FORMAT FxSaveFormat;
/* Set initial thread frame */ /* 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 */ /* 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 */ /* Check if context provided for this thread */
if(ContextRecord) if(ContextRecord)
@ -58,19 +58,20 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
ContextRecord->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL; ContextRecord->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS | CONTEXT_CONTROL;
/* This is user mode thread */ /* This is user mode thread */
ThreadFrame->StartFrame.UserMode = TRUE;
Thread->PreviousMode = UserMode; Thread->PreviousMode = UserMode;
/* Disable coprocessor floating point state */ /* Disable coprocessor floating point state */
Thread->NpxState = CR0_TS | CR0_MP; Thread->NpxState = NPX_STATE_UNLOADED;
Thread->Header.NpxIrql = PASSIVE_LEVEL; Thread->Header.NpxIrql = PASSIVE_LEVEL;
/* Set initial floating point state */ /* 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.Cr0NpxState = 0;
ThreadFrame->NpxFrame.NpxSavedCpu = 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 */ /* Clear DR6 and DR7 registers */
ThreadFrame->TrapFrame.Dr6 = 0; ThreadFrame->TrapFrame.Dr6 = 0;
@ -84,23 +85,24 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
ThreadFrame->TrapFrame.SegEs |= RPL_MASK; ThreadFrame->TrapFrame.SegEs |= RPL_MASK;
ThreadFrame->TrapFrame.HardwareSegSs |= 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; ThreadFrame->TrapFrame.PreviousMode = UserMode;
} }
else else
{ {
/* This is kernel mode thread */ /* This is kernel mode thread */
ThreadFrame->StartFrame.UserMode = FALSE;
Thread->PreviousMode = KernelMode; Thread->PreviousMode = KernelMode;
/* Disable coprocessor floating point state */ /* Disable coprocessor floating point state */
Thread->NpxState = CR0_TS | CR0_MP; Thread->NpxState = NPX_STATE_UNLOADED;
/* Set initial floating point state */ /* Set initial floating point state */
ThreadFrame->NpxFrame.FxArea.ControlWord = 0x27F; ThreadFrame->NpxFrame.FxArea.ControlWord = 0x27F;
ThreadFrame->NpxFrame.FxArea.MxCsr = 0x1F80; ThreadFrame->NpxFrame.FxArea.MxCsr = 0x1F80;
/* Mark as kernel mode thread in the start frame */
ThreadFrame->StartFrame.UserMode = FALSE;
} }
/* Initialize thread startup information */ /* Initialize thread startup information */
@ -109,6 +111,7 @@ KepInitializeThreadContext(IN PKTHREAD Thread,
ThreadFrame->StartFrame.SystemRoutine = SystemRoutine; ThreadFrame->StartFrame.SystemRoutine = SystemRoutine;
/* Initialize switch frame */ /* Initialize switch frame */
ThreadFrame->SwitchFrame.ApcBypassDisabled = TRUE;
ThreadFrame->SwitchFrame.ExceptionList = (PEXCEPTION_REGISTRATION_RECORD) - 1; ThreadFrame->SwitchFrame.ExceptionList = (PEXCEPTION_REGISTRATION_RECORD) - 1;
/* Set thread stack */ /* Set thread stack */