- Don't use the stack in FASTCALL_PROLOG. It messes up NPX checks (this is a bug, it shouldn't happen... related to DPC stack bug.)

- Zero out the trap/npx frame for new user-mode threads.
- Use KeI386FxsrPresent and not KEI386XMMIPresent when setting up the context for a new thread.

svn path=/trunk/; revision=26141
This commit is contained in:
Alex Ionescu 2007-03-19 19:43:50 +00:00
parent 71e781df12
commit 5037bca4df
3 changed files with 12 additions and 4 deletions

View file

@ -700,8 +700,10 @@ Dr_&EndLabel:
// //
.macro FASTCALL_PROLOG Label EndLabel .macro FASTCALL_PROLOG Label EndLabel
/* Set FS to PCR */ /* Set FS to PCR */
push KGDT_R0_PCR //push KGDT_R0_PCR
pop fs //pop fs
mov ecx, KGDT_R0_PCR
mov fs, cx
/* Set user selector */ /* Set user selector */
mov ecx, KGDT_R3_DATA | RPL_MASK mov ecx, KGDT_R3_DATA | RPL_MASK

View file

@ -364,11 +364,13 @@ GetSwapLock:
jnz WmiTrace jnz WmiTrace
AfterTrace: AfterTrace:
#ifdef CONFIG_SMP
#ifdef DBG #ifdef DBG
/* Assert that we're on the right CPU */ /* Assert that we're on the right CPU */
mov cl, [esi+KTHREAD_NEXT_PROCESSOR] mov cl, [esi+KTHREAD_NEXT_PROCESSOR]
cmp cl, [ebx+KPCR_PROCESSOR_NUMBER] cmp cl, [ebx+KPCR_PROCESSOR_NUMBER]
jnz WrongCpu jnz WrongCpu
#endif
#endif #endif
/* Get CR0 and save it */ /* Get CR0 and save it */

View file

@ -74,6 +74,10 @@ Ke386InitThreadWithContext(IN PKTHREAD Thread,
Context = &LocalContext; Context = &LocalContext;
ContextFlags = CONTEXT_CONTROL; ContextFlags = CONTEXT_CONTROL;
/* Zero out the trap frame and save area */
RtlZeroMemory(&InitFrame->TrapFrame,
KTRAP_FRAME_LENGTH + sizeof(FX_SAVE_AREA));
/* Setup the Fx Area */ /* Setup the Fx Area */
FxSaveArea = &InitFrame->FxSaveArea; FxSaveArea = &InitFrame->FxSaveArea;
@ -114,7 +118,7 @@ Ke386InitThreadWithContext(IN PKTHREAD Thread,
FxSaveArea->NpxSavedCpu = 0; FxSaveArea->NpxSavedCpu = 0;
/* Now set the context flags depending on XMM support */ /* Now set the context flags depending on XMM support */
ContextFlags |= (KeI386XMMIPresent) ? CONTEXT_EXTENDED_REGISTERS : ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS :
CONTEXT_FLOATING_POINT; CONTEXT_FLOATING_POINT;
/* Set the Thread's NPX State */ /* Set the Thread's NPX State */
@ -154,7 +158,7 @@ Ke386InitThreadWithContext(IN PKTHREAD Thread,
TrapFrame->PreviousPreviousMode = UserMode; TrapFrame->PreviousPreviousMode = UserMode;
/* Terminate the Exception Handler List */ /* Terminate the Exception Handler List */
TrapFrame->ExceptionList = (PVOID)0xFFFFFFFF; TrapFrame->ExceptionList = EXCEPTION_CHAIN_END;
/* Setup the Stack for KiThreadStartup and Context Switching */ /* Setup the Stack for KiThreadStartup and Context Switching */
StartFrame = &InitFrame->StartFrame; StartFrame = &InitFrame->StartFrame;