AMD64andLegacy.mac revision 4a64ab8cc32b5b6d329a51b36b23fa50c6ada410
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMM - World Switchers, template for AMD64 to PAE and 32-bit.
c626bd8465f241db74519c3c8dbe59ea620a9e34vboxsync; Copyright (C) 2006-2007 Oracle Corporation
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;%define DEBUG_STUFF 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;%define STRICT_IF 1
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;*******************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;* Header Files *
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'.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME Fixups
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME Start
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifndef VBOX_WITH_HYBRID_32BIT_KERNEL
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The C interface.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param pVM GCC: rdi MSC:rcx The VM handle.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmR0HostToGuest
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM64_S_NEWLINE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM64_S_CHAR '^'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; The ordinary version of the code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef STRICT_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync test eax, X86_EFL_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz .if_clear_in
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0c0ffee00h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync.if_clear_in:
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 mov r9, rdi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lea rdx, [r9 + VM.cpum]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync %ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Switcher stats.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM64_PROFILE_ADV_START r8
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Call worker (far return).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, cs
c64777b77514bdc924249d2f9900be25079b0d84vboxsync call NAME(vmmR0HostToGuestAsm)
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 jnc gth64_nolint0
6cac05f856d982151579a9d445a109960c2c07d2vboxsync and dword [r8 + APIC_REG_LVT_LINT0], ~APIC_REG_LVT_MASKED
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncgth64_nolint0:
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jnc gth64_nolint1
c7cb9c421f9eb85ddbb0ff0ffc7c1402bfff4b4fvboxsync and dword [r8 + APIC_REG_LVT_LINT1], ~APIC_REG_LVT_MASKED
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncgth64_nolint1:
9b828870d7acf28326746e3850098e579c590a44vboxsync jnc gth64_nopc
9b828870d7acf28326746e3850098e579c590a44vboxsync and dword [r8 + APIC_REG_LVT_PC], ~APIC_REG_LVT_MASKED
9b828870d7acf28326746e3850098e579c590a44vboxsync jnc gth64_notherm
9b828870d7acf28326746e3850098e579c590a44vboxsync and dword [r8 + APIC_REG_LVT_THMR], ~APIC_REG_LVT_MASKED
9b828870d7acf28326746e3850098e579c590a44vboxsyncgth64_notherm:
9b828870d7acf28326746e3850098e579c590a44vboxsync %ifdef VBOX_WITH_STATISTICS
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Switcher stats.
9b828870d7acf28326746e3850098e579c590a44vboxsync STAM64_PROFILE_ADV_STOP r8
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsyncENDPROC vmmR0HostToGuest
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync%else ; VBOX_WITH_HYBRID_32BIT_KERNEL
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync; The C interface.
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsyncBEGINPROC vmmR0HostToGuest
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync %ifdef DEBUG_STUFF
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync COM32_S_NEWLINE
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync COM32_S_CHAR '^'
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync %ifdef VBOX_WITH_STATISTICS
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; Switcher stats.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToGC
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync STAM_PROFILE_ADV_START edx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ; Thunk to/from 64 bit when invoking the worker routine.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.cpum
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_32BIT, 1, .vmmR0HostToGuestReturn - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_64BIT_CS, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_HC_32BIT, 1, NAME(vmmR0HostToGuestAsm) - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync push 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync.vmmR0HostToGuestReturn:
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 mov edx, ds
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ds, edx
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov ecx, es
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov es, ecx
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov edx, ss
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov ss, edx
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync %ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync Missing implementation!
6cac05f856d982151579a9d445a109960c2c07d2vboxsync %ifdef VBOX_WITH_STATISTICS
9b828870d7acf28326746e3850098e579c590a44vboxsync ; Switcher stats.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToHC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM_PROFILE_ADV_STOP edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmR0HostToGuest
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%endif ;!VBOX_WITH_HYBRID_32BIT_KERNEL
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; *****************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Phase one of the switch from host to guest context (host MMU context)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - edx virtual address of CPUM structure (valid in host context)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - eax, ecx, edx, r8
9b828870d7acf28326746e3850098e579c590a44vboxsync; ASSUMPTION:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; - current CS and DS selectors are wide open
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; *****************************************************************************
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Store the offset from CPUM to CPUMCPU in r8
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov r8d, [rdx + CPUM.offCPUMCPU0]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Save CPU host context
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Skip eax, edx and ecx as these are not preserved over calls.
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 mov rbx, rdx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K8_FS_BASE
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 mov [rbx + r8 + CPUMCPU.Host.GSbase], eax
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [rbx + r8 + CPUMCPU.Host.GSbase + 4], edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
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!
274fa6f604b8c189c2872bf928f5557680e4a887vboxsync pop qword [rdx + r8 + CPUMCPU.Host.rflags]
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
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + APIC_REG_VERSION]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync shr eax, 16
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
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 mov rdx, rbx ; restore edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp short htg_no_sysenter
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsynchtg_no_sysenter:
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
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
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 ;; Start switching to VMM context.
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 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 ; CR4.AndMask and CR4.OrMask are set in CPUMR3Init based on the presence of
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ; FXSAVE support on the host CPU
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 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 ; 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 ; Store the hypervisor cr3 for later loading
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync mov ebp, [rdx + r8 + CPUMCPU.Hyper.cr3]
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync ;; Load Intermediate memory context.
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsync FIXUP FIX_INTER_AMD64_CR3, 1
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync mov eax, 0ffffffffh
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync mov cr3, rax
48eb91b3fb1dfa50f67016efe43472c3f7058bc2vboxsync DEBUG_CHAR('2') ; trashes esi
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync ;; 1. Switch to compatibility mode, placing ourselves in identity mapped code.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync jmp far [NAME(fpIDEnterTarget) wrt rip]
e153d6933f9a73d7071afc4b501b4c1489243818vboxsync; 16:32 Pointer to IDEnterTarget.
e153d6933f9a73d7071afc4b501b4c1489243818vboxsyncNAME(fpIDEnterTarget):
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync FIXUP FIX_ID_32BIT, 0, NAME(IDEnterTarget) - NAME(Start)
80df0ee26f97f8e12c6bb0506d4d901ce7a76357vboxsync FIXUP FIX_HYPER_CS, 0
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 ; We're now on an identity mapped pages! in 32-bit compatibility mode.
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncALIGNCODE(16)
6cac05f856d982151579a9d445a109960c2c07d2vboxsyncGLOBALNAME IDEnterTarget
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('3')
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 ; 3. Load intermediate page table.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP SWITCHER_FIX_INTER_CR3_GC, 1
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov edx, 0ffffffffh
6cac05f856d982151579a9d445a109960c2c07d2vboxsync mov cr3, edx
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 DEBUG_CHAR('5')
6cac05f856d982151579a9d445a109960c2c07d2vboxsync and eax, ~(MSR_K6_EFER_LME | MSR_K6_EFER_SCE | MSR_K6_EFER_FFXSR)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync DEBUG_CHAR('6')
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync%ifndef SWITCHER_TO_PAE
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync ; 4b. Disable PAE.
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov eax, cr4
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync and eax, ~X86_CR4_PAE
6ba6cd69eba9efb4a3838ccf50235e68e8458f1avboxsync mov cr4, eax
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 ;; 6. Jump to guest code mapping of the code and load the Hypervisor CS.
6cac05f856d982151579a9d445a109960c2c07d2vboxsync FIXUP FIX_ID_2_GC_NEAR_REL, 1, NAME(JmpGCTarget) - NAME(Start)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync jmp near NAME(JmpGCTarget)
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;; When we arrive at this label we're at the
6cac05f856d982151579a9d445a109960c2c07d2vboxsync ;; guest code mapping of the switching code.
4ad0e04fb2a93fb4980de2644f7ccca9e8869083vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME JmpGCTarget
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('-')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync;mov eax, 0ffff0000h
3809172d0a0ce1c648e7a1f8dc94e1570266b5abvboxsync;.delay_loop:
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 ;; We're in VMM MMU context and VMM CS is loaded.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Setup the rest of the VMM state.
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 ; 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 ; 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 ; Activate the ldt (now we can safely crash).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('7')
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ;; use flags.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov esi, [edx + CPUMCPU.fUseFlags]
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 ; 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 DEBUG_CHAR('!')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Return to the VMM code which either called the switcher or
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ;; the code set up to run by HC.
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 mov eax, [edx + CPUMCPU.Hyper.eip]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; callees expect CPUM ptr
c64777b77514bdc924249d2f9900be25079b0d84vboxsync CPUM_FROM_CPUMCPU(edx)
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; 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
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmR0HostToGuestAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Trampoline for doing a call when starting the hyper visor execution.
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.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncBEGINPROC vmmGCCallTrampoline
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR 'c'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR 't'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR '!'
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 call eax ; do call
c64777b77514bdc924249d2f9900be25079b0d84vboxsync add esp, edi ; cleanup stack
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; return to the host context.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync push byte 0 ; eip
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, esi ; CPUM pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync COM32_S_CHAR '`'
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp NAME(VMMGCGuestToHostAsm) ; eax = returncode.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmGCCallTrampoline
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The C interface.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC vmmGCGuestToHost
c64777b77514bdc924249d2f9900be25079b0d84vboxsync%ifdef DEBUG_STUFF
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 mov eax, [esp + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp NAME(VMMGCGuestToHostAsm)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC vmmGCGuestToHost
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMMGCGuestToHostAsmGuestCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; Switches from Guest Context to Host Context.
4a296be15f381ac7f3506e4eb2861627d062fee3vboxsync; Of course it's only called from within the GC.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param eax Return code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param esp + 4 Pointer to CPUMCTXCORE.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @remark ASSUMES interrupts disabled.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC VMMGCGuestToHostAsmGuestCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('~')
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 FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
c8968199d271abe749c08bcea0512f7239250cdcvboxsync ; Load the CPUMCPU pointer.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Skip return address (assumes called!)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync lea esp, [esp + 4]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; Guest Context (assumes esp now points to CPUMCTXCORE structure).
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 mov eax, [esp + 4 + CPUMCTXCORE.eflags]
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov [edx + CPUMCPU.Guest.eflags], eax
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.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync add esp, CPUMCTXCORE_size ; skip CPUMCTXCORE structure
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync jmp vmmGCGuestToHostAsm_EIPDone
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncENDPROC VMMGCGuestToHostAsmGuestCtx
af0b37c347057e87a85cfbc869b9e68432de1baevboxsync; VMMGCGuestToHostAsmHyperCtx
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; This is typically useful when abandoning the hypervisor
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; because of a trap and want the trap state to be saved.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @param eax Return code.
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync; @param ecx Points to CPUMCTXCORE.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; @uses eax,edx,ecx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncBEGINPROC VMMGCGuestToHostAsmHyperCtx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync DEBUG_CHAR('#')
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync%ifdef VBOX_WITH_STATISTICS
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_STOP edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync STAM32_PROFILE_ADV_START edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Load the CPUM pointer.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, 0ffffffffh
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 mov eax, [ecx + CPUMCTXCORE.eflags]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov [edx + CPUMCPU.Hyper.eflags], eax
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
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC VMMGCGuestToHostAsmHyperCtx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; VMMGCGuestToHostAsm
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; @param eax Return code.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync; @uses eax, edx, ecx (or it may use them in the future)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncALIGNCODE(16)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncBEGINPROC VMMGCGuestToHostAsm
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync DEBUG_CHAR('%')
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 FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync STAM32_PROFILE_ADV_START edx
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; Load the CPUM pointer.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync FIXUP FIX_GC_CPUMCPU_OFF, 1, 0
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov edx, 0ffffffffh
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync pop dword [edx + CPUMCPU.Hyper.eip] ; call return from stack
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync jmp short vmmGCGuestToHostAsm_EIPDone
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 ; special registers which may change.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncvmmGCGuestToHostAsm_SkipHyperRegs:
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef STRICT_IF
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync test ecx, X86_EFL_IF
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jz .if_clear_out
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, 0c0ffee01h
c64777b77514bdc924249d2f9900be25079b0d84vboxsync.if_clear_out:
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; str [edx + CPUMCPU.Hyper.tr] - double fault only, and it won't be right then either.
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 ;; Load Intermediate memory context.
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 ;; We're now in intermediate memory context!
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; 0. Jump to identity mapped location
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync FIXUP FIX_GC_2_ID_NEAR_REL, 1, NAME(IDExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp near NAME(IDExitTarget)
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync ; We're now on identity mapped pages!
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsyncALIGNCODE(16)
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsyncGLOBALNAME IDExitTarget
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync DEBUG_CHAR('1')
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync ; 1. Disable paging.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync mov ebx, cr0
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync and ebx, ~X86_CR0_PG
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync mov cr0, ebx
42c1972c22e09797b4b24afbd0ec114ed076c37cvboxsync DEBUG_CHAR('2')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; 2. Enable PAE.
3942acfaf590eaef4740d7b8a5311bb91e2bed0dvboxsync%ifdef SWITCHER_TO_PAE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; - already enabled
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, cr4
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or ecx, X86_CR4_PAE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr4, ecx
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')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; 4. Enable long mode.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ebp, edx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync or eax, MSR_K6_EFER_LME
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync mov edx, ebp
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync DEBUG_CHAR('4')
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync ; 5. Enable paging.
c64777b77514bdc924249d2f9900be25079b0d84vboxsync or ebx, X86_CR0_PG
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr0, ebx
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('5')
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 ; We're in 64-bit mode (ds, ss, es, fs, gs are all bogus).
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Move on to the HC mapping.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(IDExit64Mode):
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('6')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp [NAME(pHCExitTarget) wrt rip]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; 64-bit jump target
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(pHCExitTarget):
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncFIXUP FIX_HC_64BIT, 0, NAME(HCExitTarget) - NAME(Start)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncdq 0ffffffffffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; 64-bit pCpum address.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(pCpumHC):
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncFIXUP FIX_HC_64BIT_CPUM, 0
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncdq 0ffffffffffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; When we arrive here we're at the host context
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; mapping of the switcher code.
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME HCExitTarget
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('9')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; Clear high dword of the CPUMCPU pointer
c64777b77514bdc924249d2f9900be25079b0d84vboxsync and rdx, 0ffffffffh
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ; load final cr3
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rsi, [rdx + CPUMCPU.Host.cr3]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov cr3, rsi
c64777b77514bdc924249d2f9900be25079b0d84vboxsync DEBUG_CHAR('@')
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; Restore Host context.
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 ; 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 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 ; 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]
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
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
ccd08a3ae2b154ad27cd2bb21a9360bc33aeb552vboxsyncgth_sysenter_no:
c64777b77514bdc924249d2f9900be25079b0d84vboxsync ;; @todo AMD syscall
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 fxsave [rdx + r8 + CPUMCPU.Guest.fpu]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync fxrstor [rdx + r8 + CPUMCPU.Host.fpu]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync jmp short gth_fpu_no
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncALIGNCODE(16)
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 ; 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:
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 mov ecx, MSR_K8_GS_BASE
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.GSbase]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.GSbase + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov ecx, MSR_K6_EFER
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov eax, [rbx + r8 + CPUMCPU.Host.efer]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov edx, [rbx + r8 + CPUMCPU.Host.efer + 4]
c64777b77514bdc924249d2f9900be25079b0d84vboxsync mov rdx, rbx
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 ; finally restore flags. (probably not required)
ff308c5c63cf562048295f83638429a925415a10vboxsync push qword [rdx + r8 + CPUMCPU.Host.rflags]
ff308c5c63cf562048295f83638429a925415a10vboxsync%ifdef DEBUG_STUFF
ff308c5c63cf562048295f83638429a925415a10vboxsync COM64_S_CHAR '4'
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
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncENDPROC VMMGCGuestToHostAsm
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncGLOBALNAME End
c64777b77514bdc924249d2f9900be25079b0d84vboxsync; The description string (in the text section).
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncNAME(Description):
c64777b77514bdc924249d2f9900be25079b0d84vboxsync db SWITCHER_DESCRIPTION
c64777b77514bdc924249d2f9900be25079b0d84vboxsyncextern NAME(Relocate)
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync; End the fixup records.
c1980cd3f410c88b8f92f464c56ed987a15f44c1vboxsync db FIX_THE_END ; final entry.
d08565193a56acd57fd770cf3eb8c3fcbe3af70bvboxsyncGLOBALNAME FixupsEnd
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.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)