mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 18:24:02 +00:00
- Fix function definitions to match header changes
- Don't use x86 fiber assembly for amd64, just stub it out completely - Use AMD64 definitions in BasepInitializeContext, and add a broken KGDT_64_R3_TEB svn path=/branches/ros-amd64-bringup/; revision=36990
This commit is contained in:
parent
b58ab412df
commit
1d619ca266
4 changed files with 10 additions and 116 deletions
|
@ -386,11 +386,11 @@ BasepInitializeContext(IN PCONTEXT Context,
|
||||||
/* The other registers are undefined */
|
/* The other registers are undefined */
|
||||||
|
|
||||||
/* Setup the Segments */
|
/* Setup the Segments */
|
||||||
Context->SegFs = KGDT_R3_TEB | RPL_MASK;
|
Context->SegFs = KGDT_64_R3_TEB | RPL_MASK;
|
||||||
Context->SegEs = KGDT_R3_DATA | RPL_MASK;
|
Context->SegEs = KGDT_64_DATA | RPL_MASK;
|
||||||
Context->SegDs = KGDT_R3_DATA | RPL_MASK;
|
Context->SegDs = KGDT_64_DATA | RPL_MASK;
|
||||||
Context->SegCs = KGDT_R3_CODE | RPL_MASK;
|
Context->SegCs = KGDT_64_R3_CODE | RPL_MASK;
|
||||||
Context->SegSs = KGDT_R3_DATA | RPL_MASK;
|
Context->SegSs = KGDT_64_DATA | RPL_MASK;
|
||||||
Context->SegGs = 0;
|
Context->SegGs = 0;
|
||||||
|
|
||||||
/* Set the EFLAGS */
|
/* Set the EFLAGS */
|
||||||
|
|
|
@ -33,8 +33,8 @@ RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle);
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL
|
BOOL STDCALL
|
||||||
GetProcessAffinityMask (HANDLE hProcess,
|
GetProcessAffinityMask (HANDLE hProcess,
|
||||||
LPDWORD lpProcessAffinityMask,
|
PDWORD_PTR lpProcessAffinityMask,
|
||||||
LPDWORD lpSystemAffinityMask)
|
PDWORD_PTR lpSystemAffinityMask)
|
||||||
{
|
{
|
||||||
PROCESS_BASIC_INFORMATION ProcessInfo;
|
PROCESS_BASIC_INFORMATION ProcessInfo;
|
||||||
SYSTEM_BASIC_INFORMATION SystemInfo;
|
SYSTEM_BASIC_INFORMATION SystemInfo;
|
||||||
|
@ -73,7 +73,7 @@ GetProcessAffinityMask (HANDLE hProcess,
|
||||||
*/
|
*/
|
||||||
BOOL STDCALL
|
BOOL STDCALL
|
||||||
SetProcessAffinityMask (HANDLE hProcess,
|
SetProcessAffinityMask (HANDLE hProcess,
|
||||||
DWORD dwProcessAffinityMask)
|
DWORD_PTR dwProcessAffinityMask)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
|
|
@ -9,116 +9,9 @@
|
||||||
|
|
||||||
#include <ndk/asm.h>
|
#include <ndk/asm.h>
|
||||||
|
|
||||||
#define CONTEXT_FULL 0x10007
|
|
||||||
#define CONTEXT_FLOATING_POINT 0xF
|
|
||||||
|
|
||||||
.globl _SwitchToFiber
|
.globl _SwitchToFiber
|
||||||
.intel_syntax noprefix
|
.intel_syntax noprefix
|
||||||
|
|
||||||
_SwitchToFiber:
|
_SwitchToFiber:
|
||||||
/* Get the TEB */
|
/* FIXME: TODO */
|
||||||
mov edx, fs:[KGDT_R3_TEB]
|
|
||||||
|
|
||||||
/* Get the Fiber */
|
|
||||||
mov eax, [edx+TEB_FIBER_DATA]
|
|
||||||
|
|
||||||
/* Save the non-volatile registers */
|
|
||||||
mov [eax+FIBER_CONTEXT_EBX], ebx
|
|
||||||
mov [eax+FIBER_CONTEXT_ESI], esi
|
|
||||||
mov [eax+FIBER_CONTEXT_EDI], edi
|
|
||||||
mov [eax+FIBER_CONTEXT_EBP], ebp
|
|
||||||
|
|
||||||
/* Check if we're to save FPU State */
|
|
||||||
cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL + CONTEXT_FLOATING_POINT
|
|
||||||
jnz NoFpuStateSave
|
|
||||||
|
|
||||||
/* Save the FPU State (Status and Control)*/
|
|
||||||
fstsw [eax+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD]
|
|
||||||
fstcw [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
|
|
||||||
|
|
||||||
/* Check if the CPU supports SIMD MXCSR State Save */
|
|
||||||
cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 0
|
|
||||||
jnz NoFpuStateSave
|
|
||||||
stmxcsr [eax+FIBER_CONTEXT_DR6]
|
|
||||||
|
|
||||||
NoFpuStateSave:
|
|
||||||
|
|
||||||
/* Save stack since we're not touching it anymore */
|
|
||||||
mov [eax+FIBER_CONTEXT_ESP], esp
|
|
||||||
|
|
||||||
/* Transfer some data from the TEB */
|
|
||||||
mov ecx, [edx+TEB_FLS_DATA]
|
|
||||||
mov [eax+FIBER_FLS_DATA], ecx
|
|
||||||
mov ecx, [edx+TEB_ACTIVATION_CONTEXT_STACK_POINTER]
|
|
||||||
mov [eax+FIBER_ACTIVATION_CONTEXT_STACK], ecx
|
|
||||||
|
|
||||||
/* Transfer some data related to the Stack */
|
|
||||||
mov ecx, [edx+TEB_EXCEPTION_LIST]
|
|
||||||
mov [eax+FIBER_EXCEPTION_LIST], ecx
|
|
||||||
mov ecx, [edx+TEB_STACK_LIMIT]
|
|
||||||
mov [eax+FIBER_STACK_LIMIT], ecx
|
|
||||||
mov ecx, [edx+TEB_GUARANTEED_STACK_BYTES]
|
|
||||||
mov [eax+FIBER_GUARANTEED_STACK_BYTES], ecx
|
|
||||||
|
|
||||||
/* Switch to the new fiber */
|
|
||||||
mov ecx, [esp+4]
|
|
||||||
mov [edx+TEB_FIBER_DATA], ecx
|
|
||||||
|
|
||||||
/* Switch Fiber Data */
|
|
||||||
mov esi, [ecx+FIBER_EXCEPTION_LIST]
|
|
||||||
mov [edx+TEB_EXCEPTION_LIST], esi
|
|
||||||
mov esi, [ecx+FIBER_STACK_BASE]
|
|
||||||
mov [edx+TEB_STACK_BASE], esi
|
|
||||||
mov esi, [ecx+FIBER_STACK_LIMIT]
|
|
||||||
mov [edx+TEB_STACK_LIMIT], esi
|
|
||||||
mov esi, [ecx+FIBER_DEALLOCATION_STACK]
|
|
||||||
mov [edx+TEB_DEALLOCATION_STACK], esi
|
|
||||||
mov esi, [ecx+FIBER_GUARANTEED_STACK_BYTES]
|
|
||||||
mov [edx+TEB_GUARANTEED_STACK_BYTES], esi
|
|
||||||
mov esi, [ecx+FIBER_ACTIVATION_CONTEXT_STACK]
|
|
||||||
mov [edx+TEB_ACTIVATION_CONTEXT_STACK_POINTER], esi
|
|
||||||
|
|
||||||
/* Restore FPU State */
|
|
||||||
cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL + CONTEXT_FLOATING_POINT
|
|
||||||
jnz NoFpuStateRestore
|
|
||||||
|
|
||||||
/* Check if the Status Word Changed */
|
|
||||||
mov esi, [eax+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD]
|
|
||||||
cmp si, word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD]
|
|
||||||
jnz StatusWordChanged
|
|
||||||
|
|
||||||
/* Check if the Control Word Changed */
|
|
||||||
mov esi, [eax+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
|
|
||||||
cmp si, word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
|
|
||||||
jz ControlWordEqual
|
|
||||||
|
|
||||||
StatusWordChanged:
|
|
||||||
|
|
||||||
/* Load the new one */
|
|
||||||
mov word ptr [ecx+FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD], 0xFFFF
|
|
||||||
fldenv [ecx+FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD]
|
|
||||||
|
|
||||||
ControlWordEqual:
|
|
||||||
|
|
||||||
/* Load the new one */
|
|
||||||
cmp byte ptr ds:[PROCESSOR_FEATURE_FXSR], 0
|
|
||||||
jnz NoFpuStateRestore
|
|
||||||
ldmxcsr [ecx+FIBER_CONTEXT_DR6]
|
|
||||||
|
|
||||||
NoFpuStateRestore:
|
|
||||||
|
|
||||||
/* Restore non-volatile registers */
|
|
||||||
mov esi, [ecx+FIBER_CONTEXT_ESI]
|
|
||||||
mov edi, [ecx+FIBER_CONTEXT_EDI]
|
|
||||||
mov ebx, [ecx+FIBER_CONTEXT_EBX]
|
|
||||||
mov ebp, [ecx+FIBER_CONTEXT_EBP]
|
|
||||||
mov esp, [ecx+FIBER_CONTEXT_ESP]
|
|
||||||
|
|
||||||
/* Restore FLS Data */
|
|
||||||
mov eax, [ecx+FIBER_FLS_DATA]
|
|
||||||
mov [edx+TEB_FLS_DATA], eax
|
|
||||||
|
|
||||||
/* Return */
|
|
||||||
ret 4
|
ret 4
|
||||||
|
|
||||||
/* EOF */
|
|
||||||
|
|
|
@ -64,6 +64,7 @@ Author:
|
||||||
#define KGDT_64_R3_CODE 0x0030 // 33
|
#define KGDT_64_R3_CODE 0x0030 // 33
|
||||||
#define KGDT_TSS 0x0040
|
#define KGDT_TSS 0x0040
|
||||||
#define KGDT_32_R3_TEB 0x0050 // 53
|
#define KGDT_32_R3_TEB 0x0050 // 53
|
||||||
|
#define KGDT_64_R3_TEB 0x0000 // FIXME
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in a new issue