LegacyandAMD64.mac revision a0b1cef8d9b4f05e3ae266775a3b71d7b9147284
2N/A; available from http://www.virtualbox.org. This file is free software;
2N/A%include "VBox/asmdefs.mac"
2N/A%include "VBox/x86.mac"
2N/A%include "VBox/cpum.mac"
2N/A%include "VBox/stam.mac"
2N/A%include "VBox/vm.mac"
2N/A%include "CPUMInternal.mac"
2N/A%include "VMMSwitcher/VMMSwitcher.mac"
2N/A FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToGC
2N/A FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToHC
2N/A mov eax, dword [edx + CPUMCPU.Guest.dr + 4*8]
2N/A mov dword [edx + CPUMCPU.Guest.dr + 4*8], 1
2N/A mov [edx + CPUMCPU.Host.ebx], ebx
2N/A mov [edx + CPUMCPU.Host.edi], edi
2N/A mov [edx + CPUMCPU.Host.esi], esi
2N/A mov [edx + CPUMCPU.Host.esp], esp
2N/A mov [edx + CPUMCPU.Host.ebp], ebp
2N/A mov [edx + CPUMCPU.Host.ds], ds
2N/A mov [edx + CPUMCPU.Host.es], es
2N/A mov [edx + CPUMCPU.Host.fs], fs
2N/A mov [edx + CPUMCPU.Host.gs], gs
2N/A mov [edx + CPUMCPU.Host.ss], ss
2N/A sldt [edx + CPUMCPU.Host.ldtr]
2N/A sidt [edx + CPUMCPU.Host.idtr]
2N/A sgdt [edx + CPUMCPU.Host.gdtr]
2N/A str [edx + CPUMCPU.Host.tr]
2N/A mov dword [edx + CPUMCPU.Guest.dr + 4*8], 2
2N/A mov [edx + CPUMCPU.Host.cr0], eax
2N/A mov [edx + CPUMCPU.Host.cr3], eax
2N/A mov [edx + CPUMCPU.Host.cr4], eax
2N/A mov [ebx + CPUMCPU.Host.efer], eax
2N/A mov [ebx + CPUMCPU.Host.efer + 4], edx
2N/A mov dword [edx + CPUMCPU.Guest.dr + 4*8], 3
2N/A lgdt [edx + CPUMCPU.Hyper.gdtr]
2N/A mov dword [edx + CPUMCPU.Guest.dr + 4*8], 4
2N/A and eax, ~(MSR_K6_EFER_FFXSR) ; turn off fast fxsave/fxrstor (skipping xmm regs)
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 5
mov eax, [rdx + CPUMCPU.Hyper.esp]
mov [rdx + CPUMCPU.Hyper.lss_esp], eax
lss esp, [rdx + CPUMCPU.Hyper.lss_esp]
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 6
mov r9, [rdx + CPUMCPU.Hyper.eip]
mov esi, [rdx + CPUMCPU.fUseFlags] ; esi == use flags.
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 7
fxrstor [rdx + CPUMCPU.Guest.fpu]
and dword [rdx + CPUMCPU.fUseFlags], ~CPUM_SYNC_FPU_STATE
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 8
mov rax, qword [rdx + CPUMCPU.Guest.dr + 0*8]
mov rax, qword [rdx + CPUMCPU.Guest.dr + 1*8]
mov rax, qword [rdx + CPUMCPU.Guest.dr + 2*8]
mov rax, qword [rdx + CPUMCPU.Guest.dr + 3*8]
mov rax, qword [rdx + CPUMCPU.Guest.dr + 6*8]
and dword [rdx + CPUMCPU.fUseFlags], ~CPUM_SYNC_DEBUG_STATE
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 9
lea rsi, [rdx + CPUMCPU.Guest.fpu]
mov dword [rdx + CPUMCPU.Guest.dr + 4*8], 10
mov dword [rdx + CPUMCPU.u32RetCode], eax
mov esi, [edx + CPUMCPU.Host.cr3]
mov eax, [ebx + CPUMCPU.Host.efer]
mov edx, [ebx + CPUMCPU.Host.efer + 4]
lgdt [edx + CPUMCPU.Host.gdtr]
lidt [edx + CPUMCPU.Host.idtr]
movzx eax, word [edx + CPUMCPU.Host.tr] ; eax <- TR
ltr word [edx + CPUMCPU.Host.tr]
lldt [edx + CPUMCPU.Host.ldtr]
mov eax, [edx + CPUMCPU.Host.ds]
mov eax, [edx + CPUMCPU.Host.es]
mov eax, [edx + CPUMCPU.Host.fs]
mov eax, [edx + CPUMCPU.Host.gs]
lss esp, [edx + CPUMCPU.Host.esp]
mov ecx, [edx + CPUMCPU.Host.cr4]
mov ecx, [edx + CPUMCPU.Host.cr0]
;mov ecx, [edx + CPUMCPU.Host.cr2] ; assumes this is waste of time.
mov edi, [edx + CPUMCPU.Host.edi]
mov esi, [edx + CPUMCPU.Host.esi]
mov ebx, [edx + CPUMCPU.Host.ebx]
mov ebp, [edx + CPUMCPU.Host.ebp]
mov eax, [edx + CPUMCPU.u32RetCode]
at VMMSWITCHERDEF.pvCode, RTCCPTR_DEF NAME(Start)
at VMMSWITCHERDEF.pvFixups, RTCCPTR_DEF NAME(Fixups)
at VMMSWITCHERDEF.pszDesc, RTCCPTR_DEF NAME(Description)
at VMMSWITCHERDEF.pfnRelocate, RTCCPTR_DEF NAME(Relocate)
at VMMSWITCHERDEF.enmType, dd SWITCHER_TYPE
at VMMSWITCHERDEF.cbCode, dd NAME(End) - NAME(Start)
at VMMSWITCHERDEF.offR0HostToGuest, dd NAME(vmmR0HostToGuest) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHost, dd NAME(vmmGCGuestToHost) - NAME(Start)
at VMMSWITCHERDEF.offGCCallTrampoline, dd NAME(vmmGCCallTrampoline) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsm, dd NAME(VMMGCGuestToHostAsm) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsmHyperCtx, dd NAME(VMMGCGuestToHostAsmHyperCtx)- NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsmGuestCtx, dd NAME(VMMGCGuestToHostAsmGuestCtx)- NAME(Start)
at VMMSWITCHERDEF.offHCCode0, dd 0
at VMMSWITCHERDEF.cbHCCode0, dd NAME(IDEnterTarget) - NAME(Start)
at VMMSWITCHERDEF.offHCCode1, dd NAME(ICExitTarget) - NAME(Start)
at VMMSWITCHERDEF.cbHCCode1, dd NAME(End) - NAME(ICExitTarget)
at VMMSWITCHERDEF.offIDCode0, dd NAME(IDEnterTarget) - NAME(Start)
at VMMSWITCHERDEF.cbIDCode0, dd NAME(ICEnterTarget) - NAME(IDEnterTarget)
at VMMSWITCHERDEF.offIDCode1, dd NAME(IDExitTarget) - NAME(Start)
at VMMSWITCHERDEF.cbIDCode1, dd NAME(ICExitTarget) - NAME(Start)
at VMMSWITCHERDEF.offGCCode, dd 0
at VMMSWITCHERDEF.cbGCCode, dd 0