AMD64andLegacy.mac revision 4a64ab8cc32b5b6d329a51b36b23fa50c6ada410
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; $Id$
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;; @file
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMM - World Switchers, template for AMD64 to PAE and 32-bit.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c626bd8465f241db74519c3c8dbe59ea620a9e34vboxsync; Copyright (C) 2006-2007 Oracle Corporation
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; available from http://www.virtualbox.org. This file is free software;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; you can redistribute it and/or modify it under the terms of the GNU
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; General Public License (GPL) as published by the Free Software
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;%define DEBUG_STUFF 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;%define STRICT_IF 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;*******************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;* Header Files *
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;*******************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%include "VBox/asmdefs.mac"
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync%include "VBox/apic.mac"
2d97f8baccdd684bc0a8a15eb86bbe9ff2b85374vboxsync%include "iprt/x86.mac"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync%include "VBox/vmm/cpum.mac"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync%include "VBox/vmm/stam.mac"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync%include "VBox/vmm/vm.mac"
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%include "CPUMInternal.mac"
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%include "VMMSwitcher.mac"
0c437bb10c61b229407a7517efde04dfe3b1e4a1vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Start the fixup records
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; We collect the fixups in the .data section as we go along
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; It is therefore VITAL that no-one is using the .data section
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; for anything else between 'Start' and 'End'.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINDATA
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME Fixups
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINCODE
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME Start
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifndef VBOX_WITH_HYBRID_32BIT_KERNEL
274fa6f604b8c189c2872bf928f5557680e4a887vboxsyncBITS 64
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The C interface.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param pVM GCC: rdi MSC:rcx The VM handle.
1b68cc0f95e7b0033b20dfc4fdbc260b7a2cef68vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmR0HostToGuest
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM64_S_NEWLINE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM64_S_CHAR '^'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; The ordinary version of the code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef STRICT_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pushf
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop rax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test eax, X86_EFL_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz .if_clear_in
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0c0ffee00h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ret
c64777b77514bdc924249d2f9900be25079b0d84vboxsync.if_clear_in:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; make r9 = pVM and rdx = pCpum.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; rax, rcx and r8 are scratch here after.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef RT_OS_WINDOWS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov r9, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %else
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov r9, rdi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lea rdx, [r9 + VM.cpum]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Switcher stats.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lea r8, [r9 + VM.StatSwitcherToGC]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM64_PROFILE_ADV_START r8
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Call worker (far return).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, cs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push rax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync call NAME(vmmR0HostToGuestAsm)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Unblock Local APIC NMI vectors
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Do this here to ensure the host CS is already restored
9b828870d7acf28326746e3850098e579c590a44vboxsync mov ecx, [rdx + CPUM.fApicDisVectors]
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov r8, [rdx + CPUM.pvApicBase]
6cac05f856d982151579a9d445a109960c2c07d2vboxsync shr ecx, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jnc gth64_nolint0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync and dword [r8 + APIC_REG_LVT_LINT0], ~APIC_REG_LVT_MASKED
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncgth64_nolint0:
6cac05f856d982151579a9d445a109960c2c07d2vboxsync shr ecx, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jnc gth64_nolint1
c7cb9c421f9eb85ddbb0ff0ffc7c1402bfff4b4fvboxsync and dword [r8 + APIC_REG_LVT_LINT1], ~APIC_REG_LVT_MASKED
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncgth64_nolint1:
9b828870d7acf28326746e3850098e579c590a44vboxsync shr ecx, 1
9b828870d7acf28326746e3850098e579c590a44vboxsync jnc gth64_nopc
9b828870d7acf28326746e3850098e579c590a44vboxsync and dword [r8 + APIC_REG_LVT_PC], ~APIC_REG_LVT_MASKED
9b828870d7acf28326746e3850098e579c590a44vboxsyncgth64_nopc:
9b828870d7acf28326746e3850098e579c590a44vboxsync shr ecx, 1
9b828870d7acf28326746e3850098e579c590a44vboxsync jnc gth64_notherm
9b828870d7acf28326746e3850098e579c590a44vboxsync and dword [r8 + APIC_REG_LVT_THMR], ~APIC_REG_LVT_MASKED
9b828870d7acf28326746e3850098e579c590a44vboxsyncgth64_notherm:
9b828870d7acf28326746e3850098e579c590a44vboxsync %endif
9b828870d7acf28326746e3850098e579c590a44vboxsync
9b828870d7acf28326746e3850098e579c590a44vboxsync %ifdef VBOX_WITH_STATISTICS
9b828870d7acf28326746e3850098e579c590a44vboxsync ;
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Switcher stats.
9b828870d7acf28326746e3850098e579c590a44vboxsync ;
9b828870d7acf28326746e3850098e579c590a44vboxsync lea r8, [r9 + VM.StatSwitcherToGC]
9b828870d7acf28326746e3850098e579c590a44vboxsync STAM64_PROFILE_ADV_STOP r8
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync %endif
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync ret
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsyncENDPROC vmmR0HostToGuest
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync%else ; VBOX_WITH_HYBRID_32BIT_KERNEL
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsyncBITS 32
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync;;
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync; The C interface.
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync;
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsyncBEGINPROC vmmR0HostToGuest
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync %ifdef DEBUG_STUFF
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync COM32_S_NEWLINE
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync COM32_S_CHAR '^'
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync %endif
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync %ifdef VBOX_WITH_STATISTICS
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; Switcher stats.
c7cb9c421f9eb85ddbb0ff0ffc7c1402bfff4b4fvboxsync ;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToGC
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync STAM_PROFILE_ADV_START edx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync %endif
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; Thunk to/from 64 bit when invoking the worker routine.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.cpum
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push cs
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_32BIT, 1, .vmmR0HostToGuestReturn - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_64BIT_CS, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_32BIT, 1, NAME(vmmR0HostToGuestAsm) - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync retf
6cac05f856d982151579a9d445a109960c2c07d2vboxsync.vmmR0HostToGuestReturn:
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; This selector reloading is probably not necessary, but we do it anyway to be quite sure
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; the CPU has the right idea about the selectors.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, ds
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ds, edx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ecx, es
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov es, ecx
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov edx, ss
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov ss, edx
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync %ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync Missing implementation!
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync %endif
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync %ifdef VBOX_WITH_STATISTICS
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Switcher stats.
9b828870d7acf28326746e3850098e579c590a44vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToHC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM_PROFILE_ADV_STOP edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ret
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmR0HostToGuest
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBITS 64
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%endif ;!VBOX_WITH_HYBRID_32BIT_KERNEL
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
274fa6f604b8c189c2872bf928f5557680e4a887vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; *****************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Phase one of the switch from host to guest context (host MMU context)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; INPUT:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - edx virtual address of CPUM structure (valid in host context)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync;
9b828870d7acf28326746e3850098e579c590a44vboxsync; USES/DESTROYS:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - eax, ecx, edx, r8
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
9b828870d7acf28326746e3850098e579c590a44vboxsync; ASSUMPTION:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - current CS and DS selectors are wide open
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; *****************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Store the offset from CPUM to CPUMCPU in r8
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov r8d, [rdx + CPUM.offCPUMCPU0]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Save CPU host context
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Skip eax, edx and ecx as these are not preserved over calls.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; general registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mov [rdx + r8 + CPUMCPU.Host.rax], rax - scratch
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.rbx], rbx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mov [rdx + r8 + CPUMCPU.Host.rcx], rcx - scratch
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mov [rdx + r8 + CPUMCPU.Host.rdx], rdx - scratch
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.rdi], rdi
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [rdx + r8 + CPUMCPU.Host.rsi], rsi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.rsp], rsp
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.rbp], rbp
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mov [rdx + r8 + CPUMCPU.Host.r8 ], r8 - scratch
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mov [rdx + r8 + CPUMCPU.Host.r9 ], r9 - scratch
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [rdx + r8 + CPUMCPU.Host.r10], r10
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.r11], r11
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.r12], r12
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [rdx + r8 + CPUMCPU.Host.r13], r13
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.r14], r14
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.r15], r15
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; selectors.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.ds], ds
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.es], es
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.fs], fs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.gs], gs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + r8 + CPUMCPU.Host.ss], ss
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; MSRs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, rdx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K8_FS_BASE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rdmsr
9b828870d7acf28326746e3850098e579c590a44vboxsync mov [rbx + r8 + CPUMCPU.Host.FSbase], eax
9b828870d7acf28326746e3850098e579c590a44vboxsync mov [rbx + r8 + CPUMCPU.Host.FSbase + 4], edx
9b828870d7acf28326746e3850098e579c590a44vboxsync mov ecx, MSR_K8_GS_BASE
9b828870d7acf28326746e3850098e579c590a44vboxsync rdmsr
9b828870d7acf28326746e3850098e579c590a44vboxsync mov [rbx + r8 + CPUMCPU.Host.GSbase], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.GSbase + 4], edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rdmsr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.efer], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.efer + 4], edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, rbx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; special registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync sldt [rdx + r8 + CPUMCPU.Host.ldtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync sidt [rdx + r8 + CPUMCPU.Host.idtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync sgdt [rdx + r8 + CPUMCPU.Host.gdtr]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync str [rdx + r8 + CPUMCPU.Host.tr] ; yasm BUG, generates sldt. YASMCHECK!
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; flags
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pushf
274fa6f604b8c189c2872bf928f5557680e4a887vboxsync pop qword [rdx + r8 + CPUMCPU.Host.rflags]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Block Local APIC NMI vectors
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, [rdx + CPUM.pvApicBase]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync or rbx, rbx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz htg_noapic
c64777b77514bdc924249d2f9900be25079b0d84vboxsync xor edi, edi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_LINT0]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cmp ecx, APIC_REG_LVT_MODE_NMI
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jne htg_nolint0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or edi, 0x01
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or eax, APIC_REG_LVT_MASKED
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + APIC_REG_LVT_LINT0], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_LINT0] ; write completion
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_nolint0:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_LINT1]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync and ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cmp ecx, APIC_REG_LVT_MODE_NMI
ccd08a3ae2b154ad27cd2bb21a9360bc33aeb552vboxsync jne htg_nolint1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or edi, 0x02
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or eax, APIC_REG_LVT_MASKED
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + APIC_REG_LVT_LINT1], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_LINT1] ; write completion
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_nolint1:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_PC]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cmp ecx, APIC_REG_LVT_MODE_NMI
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jne htg_nopc
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or edi, 0x04
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or eax, APIC_REG_LVT_MASKED
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + APIC_REG_LVT_PC], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_PC] ; write completion
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_nopc:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_VERSION]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync shr eax, 16
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cmp al, 5
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jb htg_notherm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_THMR]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cmp ecx, APIC_REG_LVT_MODE_NMI
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jne htg_notherm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or edi, 0x08
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or eax, APIC_REG_LVT_MASKED
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + APIC_REG_LVT_THMR], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_LVT_THMR] ; write completion
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_notherm:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rdx + CPUM.fApicDisVectors], edi
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_noapic:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; save MSR_IA32_SYSENTER_CS register.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, rdx ; save edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_IA32_SYSENTER_CS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rdmsr ; edx:eax <- MSR[ecx]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.SysEnter.cs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.SysEnter.cs + 4], edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync xor eax, eax ; load 0:0 to cause #GP upon sysenter
c64777b77514bdc924249d2f9900be25079b0d84vboxsync xor edx, edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync wrmsr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, rbx ; restore edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp short htg_no_sysenter
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_no_sysenter:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; handle use flags.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, [rdx + r8 + CPUMCPU.fUseFlags] ; esi == use flags.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and esi, ~CPUM_USED_FPU ; Clear CPUM_USED_* flags. ;;@todo FPU check can be optimized to use cr0 flags!
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov [rdx + r8 + CPUMCPU.fUseFlags], esi
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; debug registers.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync test esi, CPUM_USE_DEBUG_REGS | CPUM_USE_DEBUG_REGS_HOST
c7cb9c421f9eb85ddbb0ff0ffc7c1402bfff4b4fvboxsync jz htg_debug_regs_no
31250b8efa089fa62e6f4613ae71de0b3957d739vboxsync jmp htg_debug_regs_save
31250b8efa089fa62e6f4613ae71de0b3957d739vboxsynchtg_debug_regs_no:
31250b8efa089fa62e6f4613ae71de0b3957d739vboxsync DEBUG_CHAR('a') ; trashes esi
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; control registers.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rax, cr0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.cr0], rax
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;mov rax, cr2 ; assume host os don't stuff things in cr2. (safe)
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;mov [rdx + r8 + CPUMCPU.Host.cr2], rax
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov rax, cr3
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov [rdx + r8 + CPUMCPU.Host.cr3], rax
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov rax, cr4
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov [rdx + r8 + CPUMCPU.Host.cr4], rax
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;; Start switching to VMM context.
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; Change CR0 and CR4 so we can correctly emulate FPU/MMX/SSE[23] exceptions
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; Also disable WP. (eax==cr4 now)
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; Note! X86_CR4_PSE and X86_CR4_PAE are important if the host thinks so :-)
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync and rax, X86_CR4_MCE | X86_CR4_PSE | X86_CR4_PAE
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov ecx, [rdx + r8 + CPUMCPU.Guest.cr4]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync DEBUG_CHAR('b') ; trashes esi
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;; @todo Switcher cleanup: Determine base CR4 during CPUMR0Init / VMMR3SelectSwitcher putting it
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; in CPUMCPU.Hyper.cr4 (which isn't currently being used). That should
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; simplify this operation a bit (and improve locality of the data).
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; CR4.AndMask and CR4.OrMask are set in CPUMR3Init based on the presence of
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; FXSAVE support on the host CPU
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync and ecx, [rdx + CPUM.CR4.AndMask]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync or eax, ecx
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync or eax, [rdx + CPUM.CR4.OrMask]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov cr4, rax
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync DEBUG_CHAR('c') ; trashes esi
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov eax, [rdx + r8 + CPUMCPU.Guest.cr0]
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync and eax, X86_CR0_EM
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync or eax, X86_CR0_PE | X86_CR0_PG | X86_CR0_TS | X86_CR0_ET | X86_CR0_NE | X86_CR0_MP
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov cr0, rax
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync DEBUG_CHAR('0') ; trashes esi
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync ; Load new gdt so we can do far jump to guest code after cr3 reload.
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync lgdt [rdx + r8 + CPUMCPU.Hyper.gdtr]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync DEBUG_CHAR('1') ; trashes esi
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; Store the hypervisor cr3 for later loading
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov ebp, [rdx + r8 + CPUMCPU.Hyper.cr3]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;; Load Intermediate memory context.
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync FIXUP FIX_INTER_AMD64_CR3, 1
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync mov eax, 0ffffffffh
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync mov cr3, rax
48eb91b3fb1dfa50f67016efe43472c3f7058bc2vboxsync DEBUG_CHAR('2') ; trashes esi
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync ;;
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync ;; 1. Switch to compatibility mode, placing ourselves in identity mapped code.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync ;;
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync jmp far [NAME(fpIDEnterTarget) wrt rip]
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync; 16:32 Pointer to IDEnterTarget.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsyncNAME(fpIDEnterTarget):
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync FIXUP FIX_ID_32BIT, 0, NAME(IDEnterTarget) - NAME(Start)
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsyncdd 0
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync FIXUP FIX_HYPER_CS, 0
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsyncdd 0
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync;;
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync; Detour for saving the host DR7 and DR6.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync; esi and rdx must be preserved.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsynchtg_debug_regs_save:
e153d6933f9a73d7071afc4b501b4c1489243818vboxsyncDEBUG_S_CHAR('s');
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync mov rax, dr7 ; not sure, but if I read the docs right this will trap if GD is set. FIXME!!!
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync mov [rdx + r8 + CPUMCPU.Host.dr7], rax
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync xor eax, eax ; clear everything. (bit 12? is read as 1...)
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync mov dr7, rax
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rax, dr6 ; just in case we save the state register too.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.dr6], rax
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; save host DR0-3?
c7cb9c421f9eb85ddbb0ff0ffc7c1402bfff4b4fvboxsync test esi, CPUM_USE_DEBUG_REGS
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jz near htg_debug_regs_no
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncDEBUG_S_CHAR('S');
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rax, dr0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.dr0], rax
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rbx, dr1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.dr1], rbx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rcx, dr2
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.dr2], rcx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov rax, dr3
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov [rdx + r8 + CPUMCPU.Host.dr3], rax
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jmp htg_debug_regs_no
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; We're now on an identity mapped pages! in 32-bit compatibility mode.
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncBITS 32
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncALIGNCODE(16)
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncGLOBALNAME IDEnterTarget
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('3')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; 2. Deactivate long mode by turning off paging.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ebx, cr0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync and ebx, ~X86_CR0_PG
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov cr0, ebx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('4')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; 3. Load intermediate page table.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP SWITCHER_FIX_INTER_CR3_GC, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov cr3, edx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; 4. Disable long mode.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; We also use the chance to disable syscall/sysret and fast fxsave/fxrstor.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ecx, MSR_K6_EFER
6cac05f856d982151579a9d445a109960c2c07d2vboxsync rdmsr
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('5')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync and eax, ~(MSR_K6_EFER_LME | MSR_K6_EFER_SCE | MSR_K6_EFER_FFXSR)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync wrmsr
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('6')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync%ifndef SWITCHER_TO_PAE
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync ; 4b. Disable PAE.
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov eax, cr4
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync and eax, ~X86_CR4_PAE
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov cr4, eax
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync%else
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync%endif
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync ; 5. Enable paging.
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync or ebx, X86_CR0_PG
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov cr0, ebx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jmp short just_a_jump
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncjust_a_jump:
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('7')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;; 6. Jump to guest code mapping of the code and load the Hypervisor CS.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_ID_2_GC_NEAR_REL, 1, NAME(JmpGCTarget) - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jmp near NAME(JmpGCTarget)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;;
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;; When we arrive at this label we're at the
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;; guest code mapping of the switching code.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ;;
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME JmpGCTarget
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('-')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;mov eax, 0ffff0000h
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync;.delay_loop:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;nop
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync;dec eax
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync;nop
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync;jnz .delay_loop
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync ; load final cr3 and do far jump to load cs.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, ebp ; ebp set above
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('0')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; We're in VMM MMU context and VMM CS is loaded.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Setup the rest of the VMM state.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load selectors
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('1')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_HYPER_DS, 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0ffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ds, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov es, eax
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync xor eax, eax
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov gs, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov fs, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load pCpum into EDX
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Activate guest IDT
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('2')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lidt [edx + CPUMCPU.Hyper.idtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Setup stack; use the lss_esp, ss pair for lss
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('3')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [edx + CPUMCPU.Hyper.esp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.lss_esp], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lss esp, [edx + CPUMCPU.Hyper.lss_esp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Restore TSS selector; must mark it as not busy before using ltr (!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('4')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_TSS_GDTE_DW2, 2
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and dword [0ffffffffh], ~0200h ; clear busy flag (2nd type2 bit)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('5')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ltr word [edx + CPUMCPU.Hyper.tr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('6')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Activate the ldt (now we can safely crash).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lldt [edx + CPUMCPU.Hyper.ldtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('7')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ;; use flags.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, [edx + CPUMCPU.fUseFlags]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; debug registers
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test esi, CPUM_USE_DEBUG_REGS
b213616e0471f3407de0b025f3fac4727c4f10f4vboxsync jz htg_debug_regs_guest_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp htg_debug_regs_guest
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_debug_regs_guest_no:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('9')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; General registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebx, [edx + CPUMCPU.Hyper.ebx]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebp, [edx + CPUMCPU.Hyper.ebp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, [edx + CPUMCPU.Hyper.esi]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edi, [edx + CPUMCPU.Hyper.edi]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push dword [edx + CPUMCPU.Hyper.eflags]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync popfd
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('!')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Return to the VMM code which either called the switcher or
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ;; the code set up to run by HC.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
4a296be15f381ac7f3506e4eb2861627d062fee3vboxsync COM32_S_PRINT ';eip='
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov eax, [edx + CPUMCPU.Hyper.eip]
4a296be15f381ac7f3506e4eb2861627d062fee3vboxsync COM32_S_DWORD_REG eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR ';'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [edx + CPUMCPU.Hyper.eip]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; callees expect CPUM ptr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync CPUM_FROM_CPUMCPU(edx)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToGC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_STOP edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUM_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Detour for saving host DR0-3 and loading hypervisor debug registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; esi and edx must be preserved.
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_debug_regs_guest:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_S_CHAR('D')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_S_CHAR('R')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_S_CHAR('x')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; load hyper DR0-7
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebx, [edx + CPUMCPU.Hyper.dr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr0, ebx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, [edx + CPUMCPU.Hyper.dr + 8*1]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr1, ecx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [edx + CPUMCPU.Hyper.dr + 8*2]
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov dr2, eax
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov ebx, [edx + CPUMCPU.Hyper.dr + 8*3]
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov dr3, ebx
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync ;mov eax, [edx + CPUMCPU.Hyper.dr + 8*6]
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov ecx, 0ffff0ff0h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr6, ecx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [edx + CPUMCPU.Hyper.dr + 8*7]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr7, eax
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync jmp htg_debug_regs_guest_no
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Trampoline for doing a call when starting the hyper visor execution.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Push any arguments to the routine.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Push the argument frame size (cArg * 4).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Push the call target (_cdecl convention).
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync; Push the address of this routine.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncBEGINPROC vmmGCCallTrampoline
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR 'c'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR 't'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR '!'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; call routine
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop eax ; call address
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, edx ; save edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop edi ; argument count.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
ee2aeb0cd5535f38ee098713a9cebb74dc1c2e30vboxsync COM32_S_PRINT ';eax='
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_DWORD_REG eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR ';'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync call eax ; do call
c64777b77514bdc924249d2f9900be25079b0d84vboxsync add esp, edi ; cleanup stack
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; return to the host context.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push byte 0 ; eip
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, esi ; CPUM pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR '`'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp NAME(VMMGCGuestToHostAsm) ; eax = returncode.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmGCCallTrampoline
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The C interface.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmGCGuestToHost
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push esi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM_NEWLINE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('b')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('a')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('c')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('k')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('!')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM_NEWLINE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop esi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp NAME(VMMGCGuestToHostAsm)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmGCGuestToHost
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMMGCGuestToHostAsmGuestCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Switches from Guest Context to Host Context.
4a296be15f381ac7f3506e4eb2861627d062fee3vboxsync; Of course it's only called from within the GC.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param eax Return code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param esp + 4 Pointer to CPUMCTXCORE.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @remark ASSUMES interrupts disabled.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC VMMGCGuestToHostAsmGuestCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('~')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_STOP edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
37fb67be7d1d328213aeda3f56ab5aacd37416d1vboxsync ;
c8968199d271abe749c08bcea0512f7239250cdcvboxsync ; Load the CPUMCPU pointer.
c8968199d271abe749c08bcea0512f7239250cdcvboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Skip return address (assumes called!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lea esp, [esp + 4]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
37fb67be7d1d328213aeda3f56ab5aacd37416d1vboxsync ;
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; Guest Context (assumes esp now points to CPUMCTXCORE structure).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; general purpose registers
37fb67be7d1d328213aeda3f56ab5aacd37416d1vboxsync push eax ; save return code.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.edi]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Guest.edi], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.esi]
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov [edx + CPUMCPU.Guest.esi], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.ebp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Guest.ebp], eax
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov eax, [esp + 4 + CPUMCTXCORE.eax]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.eax], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.ebx]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.ebx], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.edx]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.edx], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.ecx]
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov [edx + CPUMCPU.Guest.ecx], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.esp]
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov [edx + CPUMCPU.Guest.esp], eax
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ; selectors
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov eax, [esp + 4 + CPUMCTXCORE.ss]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.ss], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.gs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Guest.gs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.fs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Guest.fs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.es]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.es], eax
af0b37c347057e87a85cfbc869b9e68432de1baevboxsync mov eax, [esp + 4 + CPUMCTXCORE.ds]
af0b37c347057e87a85cfbc869b9e68432de1baevboxsync mov [edx + CPUMCPU.Guest.ds], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [esp + 4 + CPUMCTXCORE.cs]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.cs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; flags
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.eflags]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.eflags], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; eip
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [esp + 4 + CPUMCTXCORE.eip]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.eip], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; jump to common worker code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop eax ; restore return code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync add esp, CPUMCTXCORE_size ; skip CPUMCTXCORE structure
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync jmp vmmGCGuestToHostAsm_EIPDone
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncENDPROC VMMGCGuestToHostAsmGuestCtx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync;;
af0b37c347057e87a85cfbc869b9e68432de1baevboxsync; VMMGCGuestToHostAsmHyperCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; This is an alternative entry point which we'll be using
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; when the we have the hypervisor context and need to save
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; that before going to the host.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; This is typically useful when abandoning the hypervisor
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; because of a trap and want the trap state to be saved.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param eax Return code.
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync; @param ecx Points to CPUMCTXCORE.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @uses eax,edx,ecx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC VMMGCGuestToHostAsmHyperCtx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync DEBUG_CHAR('#')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync%ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_STOP edx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load the CPUM pointer.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push eax ; save return code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; general purpose registers
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [ecx + CPUMCTXCORE.edi]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.edi], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.esi]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.esi], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.ebp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.ebp], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.eax]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.eax], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.ebx]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.ebx], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.edx]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.edx], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.ecx]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.ecx], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.esp]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.esp], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; selectors
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.ss]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Hyper.ss], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.gs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.gs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.fs]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Hyper.fs], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [ecx + CPUMCTXCORE.es]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Hyper.es], eax
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov eax, [ecx + CPUMCTXCORE.ds]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Hyper.ds], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.cs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.cs], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; flags
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.eflags]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.eflags], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; eip
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [ecx + CPUMCTXCORE.eip]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Hyper.eip], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; jump to common worker code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pop eax ; restore return code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp vmmGCGuestToHostAsm_SkipHyperRegs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC VMMGCGuestToHostAsmHyperCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMMGCGuestToHostAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; This is an alternative entry point which we'll be using
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; when the we have saved the guest state already or we haven't
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync; been messing with the guest at all.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync;
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync; @param eax Return code.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync; @uses eax, edx, ecx (or it may use them in the future)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync;
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncALIGNCODE(16)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncBEGINPROC VMMGCGuestToHostAsm
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync DEBUG_CHAR('%')
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef VBOX_WITH_STATISTICS
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_STOP edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%endif
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ;
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; Load the CPUM pointer.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ;
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync pop dword [edx + CPUMCPU.Hyper.eip] ; call return from stack
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync jmp short vmmGCGuestToHostAsm_EIPDone
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncALIGNCODE(16)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncvmmGCGuestToHostAsm_EIPDone:
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; general registers which we care about.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov dword [edx + CPUMCPU.Hyper.ebx], ebx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dword [edx + CPUMCPU.Hyper.esi], esi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dword [edx + CPUMCPU.Hyper.edi], edi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dword [edx + CPUMCPU.Hyper.ebp], ebp
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov dword [edx + CPUMCPU.Hyper.esp], esp
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; special registers which may change.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncvmmGCGuestToHostAsm_SkipHyperRegs:
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef STRICT_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync pushf
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync pop ecx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync test ecx, X86_EFL_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz .if_clear_out
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0c0ffee01h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync cli
c64777b77514bdc924249d2f9900be25079b0d84vboxsync.if_clear_out:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; str [edx + CPUMCPU.Hyper.tr] - double fault only, and it won't be right then either.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync sldt [edx + CPUMCPU.Hyper.ldtr]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; No need to save CRx here. They are set dynamically according to Guest/Host requirements.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; FPU context is saved before restore of host saving (another) branch.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Load Intermediate memory context.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edi, eax ; save return code in EDI (careful with COM_DWORD_REG from here on!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP SWITCHER_FIX_INTER_CR3_GC, 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('?')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; We're now in intermediate memory context!
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; 0. Jump to identity mapped location
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync FIXUP FIX_GC_2_ID_NEAR_REL, 1, NAME(IDExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp near NAME(IDExitTarget)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; We're now on identity mapped pages!
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncALIGNCODE(16)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncGLOBALNAME IDExitTarget
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync DEBUG_CHAR('1')
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ; 1. Disable paging.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov ebx, cr0
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync and ebx, ~X86_CR0_PG
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov cr0, ebx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync DEBUG_CHAR('2')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; 2. Enable PAE.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef SWITCHER_TO_PAE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; - already enabled
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%else
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, cr4
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or ecx, X86_CR4_PAE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr4, ecx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; 3. Load long mode intermediate CR3.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_INTER_AMD64_CR3, 1
4a1a50ee161eb0a0f907d9d1585581f3bb43bed2vboxsync mov ecx, 0ffffffffh
4a1a50ee161eb0a0f907d9d1585581f3bb43bed2vboxsync mov cr3, ecx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync DEBUG_CHAR('3')
37fb67be7d1d328213aeda3f56ab5aacd37416d1vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; 4. Enable long mode.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebp, edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
c64777b77514bdc924249d2f9900be25079b0d84vboxsync rdmsr
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync or eax, MSR_K6_EFER_LME
4a1a50ee161eb0a0f907d9d1585581f3bb43bed2vboxsync wrmsr
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, ebp
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync DEBUG_CHAR('4')
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync ; 5. Enable paging.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or ebx, X86_CR0_PG
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr0, ebx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('5')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Jump from compatibility mode to 64-bit mode.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_ID_FAR32_TO_64BIT_MODE, 1, NAME(IDExit64Mode) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp 0ffffh:0fffffffeh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; We're in 64-bit mode (ds, ss, es, fs, gs are all bogus).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Move on to the HC mapping.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBITS 64
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(IDExit64Mode):
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('6')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp [NAME(pHCExitTarget) wrt rip]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; 64-bit jump target
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(pHCExitTarget):
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncFIXUP FIX_HC_64BIT, 0, NAME(HCExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncdq 0ffffffffffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; 64-bit pCpum address.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(pCpumHC):
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncFIXUP FIX_HC_64BIT_CPUM, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncdq 0ffffffffffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; When we arrive here we're at the host context
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mapping of the switcher code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME HCExitTarget
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('9')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Clear high dword of the CPUMCPU pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and rdx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; load final cr3
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rsi, [rdx + CPUMCPU.Host.cr3]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, rsi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('@')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Restore Host context.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load CPUM pointer into edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, [NAME(pCpumHC) wrt rip]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load the CPUMCPU offset.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov r8d, [rdx + CPUM.offCPUMCPU0]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; activate host gdt and idt
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lgdt [rdx + r8 + CPUMCPU.Host.gdtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('0')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lidt [rdx + r8 + CPUMCPU.Host.idtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('1')
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync ; Restore TSS selector; must mark it as not busy before using ltr (!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%if 1 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync movzx eax, word [rdx + r8 + CPUMCPU.Host.tr] ; eax <- TR
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and al, 0F8h ; mask away TI and RPL bits, get descriptor offset.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync add rax, [rdx + r8 + CPUMCPU.Host.gdtr + 2] ; eax <- GDTR.address + descriptor offset.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and dword [rax + 4], ~0200h ; clear busy flag (2nd type2 bit)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ltr word [rdx + r8 + CPUMCPU.Host.tr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%else
c64777b77514bdc924249d2f9900be25079b0d84vboxsync movzx eax, word [rdx + r8 + CPUMCPU.Host.tr] ; eax <- TR
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and al, 0F8h ; mask away TI and RPL bits, get descriptor offset.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync add rax, [rdx + r8 + CPUMCPU.Host.gdtr + 2] ; eax <- GDTR.address + descriptor offset.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, [rax + 4] ; ecx <- 2nd descriptor dword
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebx, ecx ; save original value
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and ecx, ~0200h ; clear busy flag (2nd type2 bit)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rax + 4], ccx ; not using xchg here is paranoia..
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ltr word [rdx + r8 + CPUMCPU.Host.tr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync xchg [rax + 4], ebx ; using xchg is paranoia too...
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%endif
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; activate ldt
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('2')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lldt [rdx + r8 + CPUMCPU.Host.ldtr]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Restore segment registers
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rdx + r8 + CPUMCPU.Host.ds]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ds, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rdx + r8 + CPUMCPU.Host.es]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov es, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rdx + r8 + CPUMCPU.Host.fs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov fs, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rdx + r8 + CPUMCPU.Host.gs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov gs, eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; restore stack
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rdx + r8 + CPUMCPU.Host.ss]
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov ss, eax
e07a7480bb140d8cebbb6599980c7da0a12a6c4avboxsync mov rsp, [rdx + r8 + CPUMCPU.Host.rsp]
e07a7480bb140d8cebbb6599980c7da0a12a6c4avboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_NO_SYSENTER_JMP, 0, gth_sysenter_no - NAME(Start) ; this will insert a jmp gth_sysenter_no if host doesn't use sysenter.
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ; restore MSR_IA32_SYSENTER_CS register.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, rdx ; save edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_IA32_SYSENTER_CS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.SysEnter.cs]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.SysEnter.cs + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync wrmsr ; MSR[ecx] <- edx:eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, rbx ; restore edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp short gth_sysenter_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
ccd08a3ae2b154ad27cd2bb21a9360bc33aeb552vboxsyncgth_sysenter_no:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; @todo AMD syscall
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Restore FPU if guest has used it.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, [rdx + r8 + CPUMCPU.fUseFlags] ; esi == use flags.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test esi, CPUM_USED_FPU
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz short gth_fpu_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rcx, cr0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and rcx, ~(X86_CR0_TS | X86_CR0_EM)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr0, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync fxsave [rdx + r8 + CPUMCPU.Guest.fpu]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync fxrstor [rdx + r8 + CPUMCPU.Host.fpu]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp short gth_fpu_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncgth_fpu_no:
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Control registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Would've liked to have these higher up in case of crashes, but
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; the fpu stuff must be done before we restore cr0.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rcx, [rdx + r8 + CPUMCPU.Host.cr4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test rcx, X86_CR4_PCIDE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz gth_no_pcide
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rax, [rdx + r8 + CPUMCPU.Host.cr3]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and rax, ~0xfff ; clear the PCID in cr3
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, rax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr4, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rax, [rdx + r8 + CPUMCPU.Host.cr3]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, rax ; reload it with the right PCID.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp gth_restored_cr4
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncgth_no_pcide:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr4, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncgth_restored_cr4:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rcx, [rdx + r8 + CPUMCPU.Host.cr0]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr0, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;mov rcx, [rdx + r8 + CPUMCPU.Host.cr2] ; assumes this is waste of time.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;mov cr2, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; restore debug registers (if modified) (esi must still be fUseFlags!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; (must be done after cr4 reload because of the debug extension.)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test esi, CPUM_USE_DEBUG_REGS | CPUM_USE_DEBUG_REGS_HOST
4a25fdc1810f28c7813f2fd13ab04ce25b60f30bvboxsync jz short gth_debug_regs_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp gth_debug_regs_restore
4a25fdc1810f28c7813f2fd13ab04ce25b60f30bvboxsyncgth_debug_regs_no:
4a25fdc1810f28c7813f2fd13ab04ce25b60f30bvboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Restore MSRs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, rdx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K8_FS_BASE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.FSbase]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.FSbase + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync wrmsr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K8_GS_BASE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.GSbase]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.GSbase + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync wrmsr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.efer]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.efer + 4]
ff308c5c63cf562048295f83638429a925415a10vboxsync wrmsr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, rbx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; restore general registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, edi ; restore return code. eax = return code !!
ff308c5c63cf562048295f83638429a925415a10vboxsync ; mov rax, [rdx + r8 + CPUMCPU.Host.rax] - scratch + return code
ff308c5c63cf562048295f83638429a925415a10vboxsync mov rbx, [rdx + r8 + CPUMCPU.Host.rbx]
ff308c5c63cf562048295f83638429a925415a10vboxsync ; mov rcx, [rdx + r8 + CPUMCPU.Host.rcx] - scratch
ff308c5c63cf562048295f83638429a925415a10vboxsync ; mov rdx, [rdx + r8 + CPUMCPU.Host.rdx] - scratch
ff308c5c63cf562048295f83638429a925415a10vboxsync mov rdi, [rdx + r8 + CPUMCPU.Host.rdi]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov rsi, [rdx + r8 + CPUMCPU.Host.rsi]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov rsp, [rdx + r8 + CPUMCPU.Host.rsp]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov rbp, [rdx + r8 + CPUMCPU.Host.rbp]
ff308c5c63cf562048295f83638429a925415a10vboxsync ; mov r8, [rdx + r8 + CPUMCPU.Host.r8 ] - scratch
ff308c5c63cf562048295f83638429a925415a10vboxsync ; mov r9, [rdx + r8 + CPUMCPU.Host.r9 ] - scratch
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r10, [rdx + r8 + CPUMCPU.Host.r10]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r11, [rdx + r8 + CPUMCPU.Host.r11]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r12, [rdx + r8 + CPUMCPU.Host.r12]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r13, [rdx + r8 + CPUMCPU.Host.r13]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r14, [rdx + r8 + CPUMCPU.Host.r14]
ff308c5c63cf562048295f83638429a925415a10vboxsync mov r15, [rdx + r8 + CPUMCPU.Host.r15]
ff308c5c63cf562048295f83638429a925415a10vboxsync
ff308c5c63cf562048295f83638429a925415a10vboxsync ; finally restore flags. (probably not required)
ff308c5c63cf562048295f83638429a925415a10vboxsync push qword [rdx + r8 + CPUMCPU.Host.rflags]
ff308c5c63cf562048295f83638429a925415a10vboxsync popf
ff308c5c63cf562048295f83638429a925415a10vboxsync
ff308c5c63cf562048295f83638429a925415a10vboxsync
ff308c5c63cf562048295f83638429a925415a10vboxsync%ifdef DEBUG_STUFF
ff308c5c63cf562048295f83638429a925415a10vboxsync COM64_S_CHAR '4'
ff308c5c63cf562048295f83638429a925415a10vboxsync%endif
ff308c5c63cf562048295f83638429a925415a10vboxsync db 048h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync retf
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Detour for restoring the host debug registers.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; edx and edi must be preserved.
ad27e1d5e48ca41245120c331cc88b50464813cevboxsyncgth_debug_regs_restore:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_S_CHAR('d')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync xor eax, eax
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov dr7, rax ; paranoia or not?
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync test esi, CPUM_USE_DEBUG_REGS
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync jz short gth_debug_regs_dr7
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync DEBUG_S_CHAR('r')
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov rax, [rdx + r8 + CPUMCPU.Host.dr0]
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov dr0, rax
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov rbx, [rdx + r8 + CPUMCPU.Host.dr1]
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov dr1, rbx
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov rcx, [rdx + r8 + CPUMCPU.Host.dr2]
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov dr2, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rax, [rdx + r8 + CPUMCPU.Host.dr3]
4a64ab8cc32b5b6d329a51b36b23fa50c6ada410vboxsync mov dr3, rax
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncgth_debug_regs_dr7:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rbx, [rdx + r8 + CPUMCPU.Host.dr6]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr6, rbx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rcx, [rdx + r8 + CPUMCPU.Host.dr7]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov dr7, rcx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp gth_debug_regs_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC VMMGCGuestToHostAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME End
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The description string (in the text section).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(Description):
c64777b77514bdc924249d2f9900be25079b0d84vboxsync db SWITCHER_DESCRIPTION
c64777b77514bdc924249d2f9900be25079b0d84vboxsync db 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncextern NAME(Relocate)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync; End the fixup records.
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync;
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsyncBEGINDATA
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync db FIX_THE_END ; final entry.
d08565193a56acd57fd770cf3eb8c3fcbe3af70bvboxsyncGLOBALNAME FixupsEnd
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync;;
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The switcher definition structure.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNDATA(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME Def
c64777b77514bdc924249d2f9900be25079b0d84vboxsync istruc VMMSWITCHERDEF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.pvCode, RTCCPTR_DEF NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.pvFixups, RTCCPTR_DEF NAME(Fixups)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.pszDesc, RTCCPTR_DEF NAME(Description)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.pfnRelocate, RTCCPTR_DEF NAME(Relocate)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.enmType, dd SWITCHER_TYPE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbCode, dd NAME(End) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offR0HostToGuest, dd NAME(vmmR0HostToGuest) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCGuestToHost, dd NAME(vmmGCGuestToHost) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCCallTrampoline, dd NAME(vmmGCCallTrampoline) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCGuestToHostAsm, dd NAME(VMMGCGuestToHostAsm) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCGuestToHostAsmHyperCtx, dd NAME(VMMGCGuestToHostAsmHyperCtx)- NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCGuestToHostAsmGuestCtx, dd NAME(VMMGCGuestToHostAsmGuestCtx)- NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; disasm help
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offHCCode0, dd 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbHCCode0, dd NAME(IDEnterTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offHCCode1, dd NAME(HCExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbHCCode1, dd NAME(End) - NAME(HCExitTarget)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offIDCode0, dd NAME(IDEnterTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbIDCode0, dd NAME(JmpGCTarget) - NAME(IDEnterTarget)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offIDCode1, dd NAME(IDExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbIDCode1, dd NAME(HCExitTarget) - NAME(IDExitTarget)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.offGCCode, dd NAME(JmpGCTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync at VMMSWITCHERDEF.cbGCCode, dd NAME(IDExitTarget) - NAME(JmpGCTarget)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync iend
c64777b77514bdc924249d2f9900be25079b0d84vboxsync
c64777b77514bdc924249d2f9900be25079b0d84vboxsync