* PURPOSE: Thread Context Switching
*
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
+ * Gregor Anich (FPU Code)
*/
/* INCLUDES ******************************************************************/
#include <roscfg.h>
-#include <internal/i386/segment.h>
#include <internal/i386/ke.h>
-#include <internal/i386/fpu.h>
-#include <internal/ps.h>
-#include <ntos/tss.h>
-#include <internal/ntoskrnl.h>
+#include <ndk/asm.h>
.intel_syntax noprefix
#define Running 2
* expect any static data (like some badly coded usermode/win9x apps do)
*/
xor ebx, ebx
- xor esi, edi
+ xor esi, esi
xor edi, edi
xor ebp, ebp
.globl @KiSwapContextInternal@0
@KiSwapContextInternal@0:
#ifdef KDBG
- jmp SaveTrapFrameForKDB
+ //jmp SaveTrapFrameForKDB
SaveTrapFrameForKDB_Return:
#endif
/* Switching, disable interrupts now */
cli
+ /* Save the initial stack in EAX */
+ mov eax, [edi+KTHREAD_INITIAL_STACK]
+
#ifdef CONFIG_SMP
/* Save FPU state if the thread has used it. */
mov dword ptr [ebx+KPCR_NPX_THREAD], 0
test byte ptr [edi+KTHREAD_NPX_STATE], NPX_STATE_DIRTY
jz 3f
- mov eax, [edi+KTHREAD_INITIAL_STACK]
cmp dword ptr _FxsrSupport, 0
je 1f
fxsave [eax-SIZEOF_FX_SAVE_AREA]
/* Save the stack pointer in this processors TSS */
mov ebp, [ebx+KPCR_TSS]
+
+ /* Check if this isn't V86 Mode, so we can bias the Esp0 */
+ test dword ptr [eax - KTRAP_FRAME_SIZE + KTRAP_FRAME_EFLAGS], X86_EFLAGS_VM
+ jnz NoAdjust
+
+ /* Bias esp */
+ //sub dword ptr ss:[ebp+KTSS_ESP0], KTRAP_FRAME_V86_GS - KTRAP_FRAME_SS
+
+NoAdjust:
+ /* Push ESP0 Value */
push ss:[ebp+KTSS_ESP0]
-
+
/* Check if address space switch is needed */
mov eax, [esi+KTHREAD_APCSTATE_PROCESS]
cmp eax, [edi+KTHREAD_APCSTATE_PROCESS]
/* Write the LDT Selector */
mov ebp, [ebx+KPCR_GDT]
mov eax, [edi+KPROCESS_LDT_DESCRIPTOR0]
- mov [ebp+LDT_SELECTOR], eax
+ mov [ebp+KGDT_LDT], eax
mov eax, [edi+KPROCESS_LDT_DESCRIPTOR1]
- mov [ebp+LDT_SELECTOR+4], eax
+ mov [ebp+KGDT_LDT+4], eax
/* Save LDT Selector */
- mov eax, LDT_SELECTOR
+ mov eax, KGDT_LDT
NoLdt: