2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ke/i386/thread.c
5 * PURPOSE: i386 Thread Context Creation
6 * PROGRAMMER: Alex Ionescu (alex@relsoft.net)
9 /* INCLUDES ******************************************************************/
15 typedef struct _KSWITCHFRAME
18 BOOLEAN ApcBypassDisable
;
20 } KSWITCHFRAME
, *PKSWITCHFRAME
;
22 typedef struct _KSTART_FRAME
24 PKSYSTEM_ROUTINE SystemRoutine
;
25 PKSTART_ROUTINE StartRoutine
;
28 } KSTART_FRAME
, *PKSTART_FRAME
;
30 typedef struct _KUINIT_FRAME
32 KSWITCHFRAME CtxSwitchFrame
;
33 KSTART_FRAME StartFrame
;
34 KTRAP_FRAME TrapFrame
;
35 //FX_SAVE_AREA FxSaveArea;
36 } KUINIT_FRAME
, *PKUINIT_FRAME
;
38 typedef struct _KKINIT_FRAME
40 KSWITCHFRAME CtxSwitchFrame
;
41 KSTART_FRAME StartFrame
;
42 //FX_SAVE_AREA FxSaveArea;
43 } KKINIT_FRAME
, *PKKINIT_FRAME
;
45 /* FUNCTIONS *****************************************************************/
49 KiInitializeContextThread(IN PKTHREAD Thread
,
50 IN PKSYSTEM_ROUTINE SystemRoutine
,
51 IN PKSTART_ROUTINE StartRoutine
,
52 IN PVOID StartContext
,
53 IN PCONTEXT ContextPointer
)
55 //PFX_SAVE_AREA FxSaveArea;
56 //PFXSAVE_FORMAT FxSaveFormat;
57 PKSTART_FRAME StartFrame
;
58 PKSWITCHFRAME CtxSwitchFrame
;
59 PKTRAP_FRAME TrapFrame
;
61 PCONTEXT Context
= NULL
;
64 /* Check if this is a With-Context Thread */
67 /* Set up the Initial Frame */
68 PKUINIT_FRAME InitFrame
;
69 InitFrame
= (PKUINIT_FRAME
)((ULONG_PTR
)Thread
->InitialStack
-
70 sizeof(KUINIT_FRAME
));
72 /* Copy over the context we got */
73 RtlCopyMemory(&LocalContext
, ContextPointer
, sizeof(CONTEXT
));
74 Context
= &LocalContext
;
75 ContextFlags
= CONTEXT_CONTROL
;
77 /* Zero out the trap frame and save area */
78 RtlZeroMemory(&InitFrame
->TrapFrame
,
81 /* Setup the Fx Area */
82 //FxSaveArea = &InitFrame->FxSaveArea;
84 // /* Get the FX Save Format Area */
85 // FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters;
87 // /* Set an initial state */
88 // FxSaveFormat->ControlWord = 0x27F;
89 // FxSaveFormat->StatusWord = 0;
90 // FxSaveFormat->TagWord = 0;
91 // FxSaveFormat->ErrorOffset = 0;
92 // FxSaveFormat->ErrorSelector = 0;
93 // FxSaveFormat->DataOffset = 0;
94 // FxSaveFormat->DataSelector = 0;
95 // FxSaveFormat->MXCsr = 0x1F80;
97 /* Set an intial NPX State */
98 //Context->FloatSave.Cr0NpxState = 0;
99 //FxSaveArea->Cr0NpxState = 0;
100 //FxSaveArea->NpxSavedCpu = 0;
102 /* Now set the context flags depending on XMM support */
103 //ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS :
104 // CONTEXT_FLOATING_POINT;
106 /* Set the Thread's NPX State */
107 Thread
->NpxState
= 0xA;
108 Thread
->DispatcherHeader
.NpxIrql
= PASSIVE_LEVEL
;
110 /* Disable any debug regiseters */
111 Context
->ContextFlags
&= ~CONTEXT_DEBUG_REGISTERS
;
113 /* Setup the Trap Frame */
114 TrapFrame
= &InitFrame
->TrapFrame
;
116 /* Set up a trap frame from the context. */
117 KeContextToTrapFrame(Context
,
120 Context
->ContextFlags
| ContextFlags
,
123 /* Set SS, DS, ES's RPL Mask properly */
124 TrapFrame
->SegSs
|= RPL_MASK
;
125 TrapFrame
->SegDs
|= RPL_MASK
;
126 TrapFrame
->SegEs
|= RPL_MASK
;
129 /* Set the previous mode as user */
130 TrapFrame
->PreviousMode
= UserMode
;
132 /* Terminate the Exception Handler List */
133 TrapFrame
->ExceptionFrame
= 0;
135 /* Setup the Stack for KiThreadStartup and Context Switching */
136 StartFrame
= &InitFrame
->StartFrame
;
137 CtxSwitchFrame
= &InitFrame
->CtxSwitchFrame
;
139 /* Tell the thread it will run in User Mode */
140 Thread
->PreviousMode
= UserMode
;
142 /* Tell KiThreadStartup of that too */
143 StartFrame
->UserThread
= TRUE
;
147 /* Set up the Initial Frame for the system thread */
148 PKKINIT_FRAME InitFrame
;
149 InitFrame
= (PKKINIT_FRAME
)((ULONG_PTR
)Thread
->InitialStack
-
150 sizeof(KKINIT_FRAME
));
152 /* Setup the Fx Area */
153 //FxSaveArea = &InitFrame->FxSaveArea;
154 //RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA));
156 /* Check if we have Fxsr support */
157 DPRINT1("FxsrPresent but did nothing\n");
158 // /* Set the stub FX area */
159 // FxSaveArea->U.FxArea.ControlWord = 0x27F;
160 // FxSaveArea->U.FxArea.MXCsr = 0x1F80;
163 Thread
->NpxState
= 0xA;
165 /* Setup the Stack for KiThreadStartup and Context Switching */
166 StartFrame
= &InitFrame
->StartFrame
;
167 CtxSwitchFrame
= &InitFrame
->CtxSwitchFrame
;
169 /* Tell the thread it will run in Kernel Mode */
170 Thread
->PreviousMode
= KernelMode
;
172 /* Tell KiThreadStartup of that too */
173 StartFrame
->UserThread
= FALSE
;
176 /* Now setup the remaining data for KiThreadStartup */
177 StartFrame
->StartContext
= StartContext
;
178 StartFrame
->StartRoutine
= StartRoutine
;
179 StartFrame
->SystemRoutine
= SystemRoutine
;
181 /* And set up the Context Switch Frame */
182 CtxSwitchFrame
->RetAddr
= KiThreadStartup
;
183 CtxSwitchFrame
->ApcBypassDisable
= TRUE
;
184 CtxSwitchFrame
->ExceptionList
= EXCEPTION_CHAIN_END
;;
186 /* Save back the new value of the kernel stack. */
187 Thread
->KernelStack
= (PVOID
)CtxSwitchFrame
;