[NTOS][RTL] Initialize MxCsr where missing

This commit is contained in:
Timo Kreuzer 2022-07-23 13:31:27 +02:00
parent a82e46e521
commit 39f11249ff
5 changed files with 19 additions and 7 deletions

View file

@ -600,6 +600,9 @@ BaseInitializeContext(IN PCONTEXT Context,
/* Set the EFLAGS */ /* Set the EFLAGS */
Context->EFlags = 0x3000 | EFLAGS_INTERRUPT_MASK; /* IOPL 3 */ Context->EFlags = 0x3000 | EFLAGS_INTERRUPT_MASK; /* IOPL 3 */
/* Set MXCSR */
Context->MxCsr = INITIAL_MXCSR;
if (ContextType == 1) /* For Threads */ if (ContextType == 1) /* For Threads */
{ {
Context->Rip = (ULONG_PTR)BaseThreadStartup; Context->Rip = (ULONG_PTR)BaseThreadStartup;

View file

@ -56,7 +56,7 @@ KeContextToTrapFrame(IN PCONTEXT Context,
} }
/* Handle floating point registers */ /* Handle floating point registers */
if ((ContextFlags & CONTEXT_FLOATING_POINT)) if (ContextFlags & CONTEXT_FLOATING_POINT)
{ {
TrapFrame->MxCsr = Context->MxCsr; TrapFrame->MxCsr = Context->MxCsr;
TrapFrame->Xmm0 = Context->Xmm0; TrapFrame->Xmm0 = Context->Xmm0;
@ -207,9 +207,9 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame,
} }
/* Handle floating point registers */ /* Handle floating point registers */
if ((ContextFlags & CONTEXT_FLOATING_POINT) && if (ContextFlags & CONTEXT_FLOATING_POINT)
((TrapFrame->SegCs & MODE_MASK) != KernelMode))
{ {
Context->MxCsr = TrapFrame->MxCsr;
Context->Xmm0 = TrapFrame->Xmm0; Context->Xmm0 = TrapFrame->Xmm0;
Context->Xmm1 = TrapFrame->Xmm1; Context->Xmm1 = TrapFrame->Xmm1;
Context->Xmm2 = TrapFrame->Xmm2; Context->Xmm2 = TrapFrame->Xmm2;

View file

@ -375,7 +375,7 @@ KiRestoreProcessorControlState(PKPROCESSOR_STATE ProcessorState)
// __ltr(&ProcessorState->SpecialRegisters.Tr); // __ltr(&ProcessorState->SpecialRegisters.Tr);
__lidt(&ProcessorState->SpecialRegisters.Idtr.Limit); __lidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
// __ldmxcsr(&ProcessorState->SpecialRegisters.MxCsr); // FIXME _mm_setcsr(ProcessorState->SpecialRegisters.MxCsr);
// ProcessorState->SpecialRegisters.DebugControl // ProcessorState->SpecialRegisters.DebugControl
// ProcessorState->SpecialRegisters.LastBranchToRip // ProcessorState->SpecialRegisters.LastBranchToRip
// ProcessorState->SpecialRegisters.LastBranchFromRip // ProcessorState->SpecialRegisters.LastBranchFromRip
@ -417,7 +417,7 @@ KiSaveProcessorControlState(OUT PKPROCESSOR_STATE ProcessorState)
__str(&ProcessorState->SpecialRegisters.Tr); __str(&ProcessorState->SpecialRegisters.Tr);
__sidt(&ProcessorState->SpecialRegisters.Idtr.Limit); __sidt(&ProcessorState->SpecialRegisters.Idtr.Limit);
// __stmxcsr(&ProcessorState->SpecialRegisters.MxCsr); ProcessorState->SpecialRegisters.MxCsr = _mm_getcsr();
// ProcessorState->SpecialRegisters.DebugControl = // ProcessorState->SpecialRegisters.DebugControl =
// ProcessorState->SpecialRegisters.LastBranchToRip = // ProcessorState->SpecialRegisters.LastBranchToRip =
// ProcessorState->SpecialRegisters.LastBranchFromRip = // ProcessorState->SpecialRegisters.LastBranchFromRip =

View file

@ -152,6 +152,9 @@ KiInitializePcr(IN PKIPCR Pcr,
Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0; Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0;
Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr7 = 0; Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr7 = 0;
/* Initialize MXCSR (all exceptions masked) */
Pcr->Prcb.MxCsr = INITIAL_MXCSR;
/* Set the Current Thread */ /* Set the Current Thread */
Pcr->Prcb.CurrentThread = IdleThread; Pcr->Prcb.CurrentThread = IdleThread;
@ -231,6 +234,9 @@ KiInitializeCpu(PKIPCR Pcr)
Pat = (PAT_WB << 0) | (PAT_WC << 8) | (PAT_UCM << 16) | (PAT_UC << 24) | Pat = (PAT_WB << 0) | (PAT_WC << 8) | (PAT_UCM << 16) | (PAT_UC << 24) |
(PAT_WB << 32) | (PAT_WC << 40) | (PAT_UCM << 48) | (PAT_UC << 56); (PAT_WB << 32) | (PAT_WC << 40) | (PAT_UCM << 48) | (PAT_UC << 56);
__writemsr(MSR_PAT, Pat); __writemsr(MSR_PAT, Pat);
/* Initialize MXCSR */
_mm_setcsr(INITIAL_MXCSR);
} }
VOID VOID

View file

@ -23,7 +23,7 @@ NTAPI
RtlInitializeContext( RtlInitializeContext(
_Reserved_ HANDLE ProcessHandle, _Reserved_ HANDLE ProcessHandle,
_Out_ PCONTEXT ThreadContext, _Out_ PCONTEXT ThreadContext,
_In_ PVOID ThreadStartParam OPTIONAL, _In_opt_ PVOID ThreadStartParam,
_In_ PTHREAD_START_ROUTINE ThreadStartAddress, _In_ PTHREAD_START_ROUTINE ThreadStartAddress,
_In_ PINITIAL_TEB StackBase) _In_ PINITIAL_TEB StackBase)
{ {
@ -66,10 +66,13 @@ RtlInitializeContext(
ThreadContext->SegSs = KGDT64_R3_DATA | RPL_MASK; ThreadContext->SegSs = KGDT64_R3_DATA | RPL_MASK;
} }
ThreadContext->MxCsr = INITIAL_MXCSR;
/* Only the basic Context is initialized */ /* Only the basic Context is initialized */
ThreadContext->ContextFlags = CONTEXT_CONTROL | ThreadContext->ContextFlags = CONTEXT_CONTROL |
CONTEXT_INTEGER | CONTEXT_INTEGER |
CONTEXT_SEGMENTS; CONTEXT_SEGMENTS |
CONTEXT_FLOATING_POINT;
return; return;
} }