PAEand32Bit.mac revision f43fe417d3ec07e9d9ab5a64e79a55754d93b521
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; VMM - World Switchers, template for PAE and 32-Bit.
772269936494ffaddd0750ba9e28e805ba81398cvboxsync; Copyright (C) 2006-2007 Sun Microsystems, Inc.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; Clara, CA 95054 USA or visit http://www.sun.com if you need
772269936494ffaddd0750ba9e28e805ba81398cvboxsync; additional information or have any questions.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync;%define DEBUG_STUFF 1
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync;*******************************************************************************
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync;* Header Files *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync;*******************************************************************************
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%undef NEED_ID
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%ifdef NEED_PAE_ON_32BIT_HOST
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%define NEED_ID
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%ifdef NEED_32BIT_ON_PAE_HOST
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%define NEED_ID
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; Start the fixup records
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync; We collect the fixups in the .data section as we go along
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync; It is therefore VITAL that no-one is using the .data section
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; for anything else between 'Start' and 'End'.
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncGLOBALNAME Fixups
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncGLOBALNAME Start
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; The C interface.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBEGINPROC vmmR0HostToGuest
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%ifdef DEBUG_STUFF
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync COM_S_NEWLINE
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync COM_S_CHAR '^'
87150caf549846b0edba30c50dabe5092df70b5fvboxsync%ifdef VBOX_WITH_STATISTICS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; Switcher stats.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToGC
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov edx, 0ffffffffh
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync STAM_PROFILE_ADV_START edx
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; Call worker.
b725254e5641d950d1b5d5a1e2414775fa877265vboxsync FIXUP FIX_HC_CPUM_OFF, 1, 0
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov edx, 0ffffffffh
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync push cs ; allow for far return and restore cs correctly.
b725254e5641d950d1b5d5a1e2414775fa877265vboxsync call NAME(vmmR0HostToGuestAsm)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync%ifdef VBOX_WITH_STATISTICS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; Switcher stats.
e637cb22e348f5665d5473dae55ed785aa7b6e9avboxsync FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToHC
e637cb22e348f5665d5473dae55ed785aa7b6e9avboxsync mov edx, 0ffffffffh
e637cb22e348f5665d5473dae55ed785aa7b6e9avboxsync STAM_PROFILE_ADV_STOP edx
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsyncENDPROC vmmR0HostToGuest
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync; *****************************************************************************
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync; vmmR0HostToGuestAsm
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; Phase one of the switch from host to guest context (host MMU context)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; - edx virtual address of CPUM structure (valid in host context)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; - eax, ecx, edx
87150caf549846b0edba30c50dabe5092df70b5fvboxsync; ASSUMPTION:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; - current CS and DS selectors are wide open
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync; *****************************************************************************
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncALIGNCODE(16)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncBEGINPROC vmmR0HostToGuestAsm
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ;; Save CPU host context
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ;; Skip eax, edx and ecx as these are not preserved over calls.
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync CPUMCPU_FROM_CPUM(edx)
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ; general registers.
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mov [edx + CPUMCPU.Host.ebx], ebx
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.edi], edi
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.esi], esi
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.esp], esp
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mov [edx + CPUMCPU.Host.ebp], ebp
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync ; selectors.
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.ds], ds
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.es], es
7b6926b2bf44f326f40e1d9d1ce33a4dff0a2c67vboxsync mov [edx + CPUMCPU.Host.fs], fs
612ab06c3d17ed10137724a3745004d09566f53avboxsync mov [edx + CPUMCPU.Host.gs], gs
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov [edx + CPUMCPU.Host.ss], ss
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; special registers.
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync pop dword [edx + CPUMCPU.Host.eflags]
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync 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.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; save MSR_IA32_SYSENTER_CS register.
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync mov ecx, MSR_IA32_SYSENTER_CS
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov ebx, edx ; save edx
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync rdmsr ; edx:eax <- MSR[ecx]
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync mov [ebx + CPUMCPU.Host.SysEnter.cs], eax
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync mov [ebx + CPUMCPU.Host.SysEnter.cs + 4], edx
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync xor eax, eax ; load 0:0 to cause #GP upon sysenter
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync xor edx, edx
ee22a6c5721a33311c883a3c7bde66d83313093avboxsync xchg ebx, edx ; restore edx
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync jmp short htg_no_sysenter
ee22a6c5721a33311c883a3c7bde66d83313093avboxsyncALIGNCODE(16)
ee22a6c5721a33311c883a3c7bde66d83313093avboxsynchtg_no_sysenter:
ee22a6c5721a33311c883a3c7bde66d83313093avboxsync ;; handle use flags.
572a39d0d13280ed809258fe378b924f33f28aebvboxsync mov esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
572a39d0d13280ed809258fe378b924f33f28aebvboxsync and esi, ~CPUM_USED_FPU ; Clear CPUM_USED_* flags. ;;@todo FPU check can be optimized to use cr0 flags!
0e2a0905f4583cd1c88deabfcbe590166763331bvboxsync mov [edx + CPUMCPU.fUseFlags], esi
572a39d0d13280ed809258fe378b924f33f28aebvboxsync ; debug registers.
572a39d0d13280ed809258fe378b924f33f28aebvboxsync test esi, CPUM_USE_DEBUG_REGS | CPUM_USE_DEBUG_REGS_HOST
572a39d0d13280ed809258fe378b924f33f28aebvboxsync jz htg_debug_regs_no
572a39d0d13280ed809258fe378b924f33f28aebvboxsync jmp htg_debug_regs_save_dr7and6
572a39d0d13280ed809258fe378b924f33f28aebvboxsynchtg_debug_regs_no:
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync ; control registers.
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync mov eax, cr0
7519a1c4323fa86fbb19a36a91cd25abfd7af714vboxsync mov [edx + CPUMCPU.Host.cr0], eax
572a39d0d13280ed809258fe378b924f33f28aebvboxsync ;mov eax, cr2 ; assume host os don't suff things in cr2. (safe)
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync ;mov [edx + CPUMCPU.Host.cr2], eax
2888816fbcb216a2dbc97a95fa5a50b6caa09e32vboxsync mov eax, cr3
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov [edx + CPUMCPU.Host.cr3], eax
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync mov eax, cr4
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync mov [edx + CPUMCPU.Host.cr4], eax
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync ;; Start switching to VMM context.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; Change CR0 and CR4 so we can correctly emulate FPU/MMX/SSE[23] exceptions
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync ; Also disable WP. (eax==cr4 now)
a5f487d264b5aebe8d28ad35d0353630bd2b77cdvboxsync ; Note! X86_CR4_PSE and X86_CR4_PAE are important if the host thinks so :-)
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync ; Note! X86_CR4_VMXE must not be touched in case the CPU is in vmx root mode
223a6730e81629b0bf552ccc31f119a998cc8e27vboxsync and eax, X86_CR4_MCE | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_VMXE
5004cebdcde71a51ec9a5b450fa5af8a9db1aac2vboxsync mov ecx, [edx + CPUMCPU.Guest.cr4]
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ;; @todo Switcher cleanup: Determin base CR4 during CPUMR0Init / VMMR3SelectSwitcher putting it
ee22a6c5721a33311c883a3c7bde66d83313093avboxsync ; in CPUM.Hyper.cr4 (which isn't currently being used). That should
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ; simplify this operation a bit (and improve locality of the data).
and ecx, [edx + CPUM.CR4.AndMask]
or eax, [edx + CPUM.CR4.OrMask]
mov eax, [edx + CPUMCPU.Guest.cr0]
lgdt [edx + CPUM.Hyper.gdtr]
lidt [edx + CPUM.Hyper.idtr]
mov eax, [edx + CPUM.Hyper.esp]
mov [edx + CPUM.Hyper.lss_esp], eax
lss esp, [edx + CPUM.Hyper.lss_esp]
ltr word [edx + CPUM.Hyper.tr]
lldt [edx + CPUM.Hyper.ldtr]
mov esi, [edx + CPUMCPU.fUseFlags]
mov ebx, [edx + CPUM.Hyper.ebx]
mov ebp, [edx + CPUM.Hyper.ebp]
mov esi, [edx + CPUM.Hyper.esi]
mov edi, [edx + CPUM.Hyper.edi]
push dword [edx + CPUM.Hyper.eflags]
mov eax, [edx + CPUM.Hyper.eip]
mov eax, [edx + CPUM.Hyper.eip]
FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToGC
mov [edx + CPUMCPU.Host.dr7], eax
mov [edx + CPUMCPU.Host.dr6], eax
mov [edx + CPUMCPU.Host.dr0], eax
mov [edx + CPUMCPU.Host.dr1], ebx
mov [edx + CPUMCPU.Host.dr2], ecx
mov [edx + CPUMCPU.Host.dr3], eax
mov ebx, [edx + CPUM.Hyper.dr]
mov ecx, [edx + CPUM.Hyper.dr + 8*1]
mov eax, [edx + CPUM.Hyper.dr + 8*2]
mov ebx, [edx + CPUM.Hyper.dr + 8*3]
;mov eax, [edx + CPUM.Hyper.dr + 8*6]
mov eax, [edx + CPUM.Hyper.dr + 8*7]
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
mov eax, [esp + 4 + CPUMCTXCORE.eax]
mov [edx + CPUMCPU.Guest.eax], eax
mov eax, [esp + 4 + CPUMCTXCORE.ecx]
mov [edx + CPUMCPU.Guest.ecx], eax
mov eax, [esp + 4 + CPUMCTXCORE.edx]
mov [edx + CPUMCPU.Guest.edx], eax
mov eax, [esp + 4 + CPUMCTXCORE.ebx]
mov [edx + CPUMCPU.Guest.ebx], eax
mov eax, [esp + 4 + CPUMCTXCORE.esp]
mov [edx + CPUMCPU.Guest.esp], eax
mov eax, [esp + 4 + CPUMCTXCORE.ebp]
mov [edx + CPUMCPU.Guest.ebp], eax
mov eax, [esp + 4 + CPUMCTXCORE.esi]
mov [edx + CPUMCPU.Guest.esi], eax
mov eax, [esp + 4 + CPUMCTXCORE.edi]
mov [edx + CPUMCPU.Guest.edi], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.es]
mov dword [edx + CPUMCPU.Guest.es], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.cs]
mov dword [edx + CPUMCPU.Guest.cs], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.ss]
mov dword [edx + CPUMCPU.Guest.ss], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.ds]
mov dword [edx + CPUMCPU.Guest.ds], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.fs]
mov dword [edx + CPUMCPU.Guest.fs], eax
mov eax, dword [esp + 4 + CPUMCTXCORE.gs]
mov dword [edx + CPUMCPU.Guest.gs], eax
mov eax, [esp + 4 + CPUMCTXCORE.eflags]
mov dword [edx + CPUMCPU.Guest.eflags], eax
mov eax, [esp + 4 + CPUMCTXCORE.eip]
mov dword [edx + CPUMCPU.Guest.eip], eax
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
mov eax, [ecx + CPUMCTXCORE.edi]
mov [edx + CPUM.Hyper.edi], eax
mov eax, [ecx + CPUMCTXCORE.esi]
mov [edx + CPUM.Hyper.esi], eax
mov eax, [ecx + CPUMCTXCORE.ebp]
mov [edx + CPUM.Hyper.ebp], eax
mov eax, [ecx + CPUMCTXCORE.eax]
mov [edx + CPUM.Hyper.eax], eax
mov eax, [ecx + CPUMCTXCORE.ebx]
mov [edx + CPUM.Hyper.ebx], eax
mov eax, [ecx + CPUMCTXCORE.edx]
mov [edx + CPUM.Hyper.edx], eax
mov eax, [ecx + CPUMCTXCORE.ecx]
mov [edx + CPUM.Hyper.ecx], eax
mov eax, [ecx + CPUMCTXCORE.esp]
mov [edx + CPUM.Hyper.esp], eax
mov eax, [ecx + CPUMCTXCORE.ss]
mov [edx + CPUM.Hyper.ss], eax
mov eax, [ecx + CPUMCTXCORE.gs]
mov [edx + CPUM.Hyper.gs], eax
mov eax, [ecx + CPUMCTXCORE.fs]
mov [edx + CPUM.Hyper.fs], eax
mov eax, [ecx + CPUMCTXCORE.es]
mov [edx + CPUM.Hyper.es], eax
mov eax, [ecx + CPUMCTXCORE.ds]
mov [edx + CPUM.Hyper.ds], eax
mov eax, [ecx + CPUMCTXCORE.cs]
mov [edx + CPUM.Hyper.cs], eax
mov eax, [ecx + CPUMCTXCORE.eflags]
mov [edx + CPUM.Hyper.eflags], eax
mov eax, [ecx + CPUMCTXCORE.eip]
mov [edx + CPUM.Hyper.eip], eax
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalInGC
FIXUP FIX_GC_VM_OFF, 1, VM.StatTotalGCToQemu
FIXUP FIX_GC_VM_OFF, 1, VM.StatSwitcherToHC
pop dword [edx + CPUM.Hyper.eip] ; call return from stack
mov dword [edx + CPUM.Hyper.ebx], ebx
mov dword [edx + CPUM.Hyper.esi], esi
mov dword [edx + CPUM.Hyper.edi], edi
mov dword [edx + CPUM.Hyper.ebp], ebp
mov dword [edx + CPUM.Hyper.esp], esp
; str [edx + CPUM.Hyper.tr] - double fault only, and it won't be right then either.
sldt [edx + CPUM.Hyper.ldtr]
; No need to save CRx here. They are set dynamically according to Guest/Host requirements.
mov ecx, [edx + CPUMCPU.Host.cr3]
lgdt [edx + CPUMCPU.Host.gdtr]
lidt [edx + CPUMCPU.Host.idtr]
movzx eax, word [edx + CPUMCPU.Host.tr] ; eax <- TR
ltr word [edx + CPUMCPU.Host.tr]
movzx eax, word [edx + CPUMCPU.Host.tr] ; eax <- TR
ltr word [edx + CPUMCPU.Host.tr]
lldt [edx + CPUMCPU.Host.ldtr]
mov eax, [edx + CPUMCPU.Host.ds]
mov eax, [edx + CPUMCPU.Host.es]
mov eax, [edx + CPUMCPU.Host.fs]
mov eax, [edx + CPUMCPU.Host.gs]
lss esp, [edx + CPUMCPU.Host.esp]
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.
mov eax, [edx + CPUMCPU.Host.SysEnter.cs]
mov ebx, [edx + CPUMCPU.Host.SysEnter.cs + 4]
xchg edx, ebx ; save/load edx
mov esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
FIXUP FIX_NO_FXSAVE_JMP, 0, gth_no_fxsave - NAME(Start) ; this will insert a jmp gth_no_fxsave if fxsave isn't supported.
fxsave [edx + CPUMCPU.Guest.fpu]
fxrstor [edx + CPUMCPU.Host.fpu]
fnsave [edx + CPUMCPU.Guest.fpu]
mov eax, [edx + CPUMCPU.Host.fpu] ; control word
test eax, [edx + CPUMCPU.Host.fpu + 4] ; status word
and dword [edx + CPUMCPU.Host.fpu + 4], ~03Fh
frstor [edx + CPUMCPU.Host.fpu]
mov ecx, [edx + CPUMCPU.Host.cr4]
mov ecx, [edx + CPUMCPU.Host.cr0]
;mov ecx, [edx + CPUMCPU.Host.cr2] ; assumes this is waste of time.
mov edi, [edx + CPUMCPU.Host.edi]
mov esi, [edx + CPUMCPU.Host.esi]
mov ebx, [edx + CPUMCPU.Host.ebx]
mov ebp, [edx + CPUMCPU.Host.ebp]
push dword [edx + CPUMCPU.Host.eflags]
mov eax, [edx + CPUMCPU.Host.dr0]
mov ebx, [edx + CPUMCPU.Host.dr1]
mov ecx, [edx + CPUMCPU.Host.dr2]
mov eax, [edx + CPUMCPU.Host.dr3]
mov ebx, [edx + CPUMCPU.Host.dr6]
mov ecx, [edx + CPUMCPU.Host.dr7]
at VMMSWITCHERDEF.pvCode, RTCCPTR_DEF NAME(Start)
at VMMSWITCHERDEF.pvFixups, RTCCPTR_DEF NAME(Fixups)
at VMMSWITCHERDEF.pszDesc, RTCCPTR_DEF NAME(Description)
at VMMSWITCHERDEF.pfnRelocate, RTCCPTR_DEF NAME(Relocate)
at VMMSWITCHERDEF.enmType, dd SWITCHER_TYPE
at VMMSWITCHERDEF.cbCode, dd NAME(End) - NAME(Start)
at VMMSWITCHERDEF.offR0HostToGuest, dd NAME(vmmR0HostToGuest) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHost, dd NAME(vmmGCGuestToHost) - NAME(Start)
at VMMSWITCHERDEF.offGCCallTrampoline, dd NAME(vmmGCCallTrampoline) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsm, dd NAME(VMMGCGuestToHostAsm) - NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsmHyperCtx, dd NAME(VMMGCGuestToHostAsmHyperCtx)- NAME(Start)
at VMMSWITCHERDEF.offGCGuestToHostAsmGuestCtx, dd NAME(VMMGCGuestToHostAsmGuestCtx)- NAME(Start)
at VMMSWITCHERDEF.offHCCode0, dd 0
at VMMSWITCHERDEF.cbHCCode0, dd NAME(IDEnterTarget) - NAME(Start)
at VMMSWITCHERDEF.cbHCCode0, dd NAME(FarJmpGCTarget) - NAME(Start)
at VMMSWITCHERDEF.offHCCode1, dd NAME(HCExitTarget) - NAME(Start)
at VMMSWITCHERDEF.cbHCCode1, dd NAME(End) - NAME(HCExitTarget)
at VMMSWITCHERDEF.offIDCode0, dd NAME(IDEnterTarget) - NAME(Start)
at VMMSWITCHERDEF.cbIDCode0, dd NAME(FarJmpGCTarget) - NAME(IDEnterTarget)
at VMMSWITCHERDEF.offIDCode1, dd NAME(IDExitTarget) - NAME(Start)
at VMMSWITCHERDEF.cbIDCode1, dd NAME(HCExitTarget) - NAME(IDExitTarget)
at VMMSWITCHERDEF.offIDCode0, dd 0
at VMMSWITCHERDEF.cbIDCode0, dd 0
at VMMSWITCHERDEF.offIDCode1, dd 0
at VMMSWITCHERDEF.cbIDCode1, dd 0
at VMMSWITCHERDEF.offGCCode, dd NAME(FarJmpGCTarget) - NAME(Start)
at VMMSWITCHERDEF.cbGCCode, dd NAME(IDExitTarget) - NAME(FarJmpGCTarget)
at VMMSWITCHERDEF.cbGCCode, dd NAME(HCExitTarget) - NAME(FarJmpGCTarget)