VirtualBox

Changeset 87408 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jan 24, 2021 7:57:39 PM (4 years ago)
Author:
vboxsync
Message:

VMM/HMVMX: More hmR0VmxExportHostSegmentRegs tweaking. Moved all the vmwrites to one block. Added assembly helper for windows so we don't make a whole bunch of ASMGetCS/SS/DS/ES/FS/GS/TR calls to two instruction external assembly routines. Assuming that LDT selectors are rare, did an optimized code path for that (the assembly output look much better with MSC).

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMR0A.asm

    r87401 r87408  
    314314
    315315;;
     316; Used on platforms with poor inline assembly support to retrieve all the
     317; info from the CPU and put it in the @a pRestoreHost structure.
     318;
     319; @returns VBox status code
     320; @param   pRestoreHost   msc: rcx  gcc: rdi    Pointer to the RestoreHost struct.
     321; @param   fHaveFsGsBase  msc: dl   gcc: sil    Whether we can use rdfsbase or not.
     322;
     323ALIGNCODE(64)
     324BEGINPROC hmR0VmxExportHostSegmentRegsAsmHlp
     325%ifdef ASM_CALL64_MSC
     326 %define pRestoreHost rcx
     327%elifdef ASM_CALL64_MSC
     328 %define pRestoreHost rdi
     329%else
     330 %error Unknown calling convension.
     331%endif
     332        SEH64_END_PROLOGUE
     333
     334        ; Start with the FS and GS base so we can trash DL/SIL.
     335%ifdef ASM_CALL64_MSC
     336        or      dl, dl
     337%else
     338        or      sil, sil
     339%endif
     340        jz      .use_rdmsr_for_fs_and_gs_base
     341        rdfsbase rax
     342        mov     [pRestoreHost + VMXRESTOREHOST.uHostFSBase], rax
     343        rdgsbase rax
     344        mov     [pRestoreHost + VMXRESTOREHOST.uHostGSBase], rax
     345.done_fs_and_gs_base:
     346
     347        ; TR, GDTR and IDTR
     348        str     [pRestoreHost + VMXRESTOREHOST.uHostSelTR]
     349        sgdt    [pRestoreHost + VMXRESTOREHOST.HostGdtr]
     350        sidt    [pRestoreHost + VMXRESTOREHOST.HostIdtr]
     351
     352        ; Segment registers.
     353        xor     eax, eax
     354        mov     eax, cs
     355        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelCS], ax
     356
     357        mov     eax, ss
     358        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelSS], ax
     359
     360        mov     eax, gs
     361        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelGS], ax
     362
     363        mov     eax, fs
     364        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelFS], ax
     365
     366        mov     eax, es
     367        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelES], ax
     368
     369        mov     eax, ds
     370        mov     [pRestoreHost + VMXRESTOREHOST.uHostSelDS], ax
     371
     372        ret
     373
     374ALIGNCODE(16)
     375.use_rdmsr_for_fs_and_gs_base:
     376%ifdef ASM_CALL64_MSC
     377        mov     r8, pRestoreHost
     378%endif
     379
     380        mov     ecx, MSR_K8_FS_BASE
     381        rdmsr
     382        shl     rdx, 32
     383        or      rdx, rax
     384        mov     [r8 + VMXRESTOREHOST.uHostFSBase], rax
     385
     386        mov     ecx, MSR_K8_GS_BASE
     387        rdmsr
     388        shl     rdx, 32
     389        or      rdx, rax
     390        mov     [r8 + VMXRESTOREHOST.uHostGSBase], rax
     391
     392%ifdef ASM_CALL64_MSC
     393        mov     pRestoreHost, r8
     394%endif
     395        jmp     .done_fs_and_gs_base
     396%undef pRestoreHost
     397ENDPROC hmR0VmxExportHostSegmentRegsAsmHlp
     398
     399
     400;;
    316401; Restores host-state fields.
    317402;
     
    333418    SEH64_END_PROLOGUE
    334419
    335 .restore_gdtr
     420.restore_gdtr:
    336421    test        edi, VMX_RESTORE_HOST_GDTR
    337422    jz          .restore_idtr
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r87405 r87408  
    45244524static int hmR0VmxExportHostSegmentRegs(PVMCPUCC pVCpu, uint64_t uHostCr4)
    45254525{
    4526 /**
    4527  * Macro for adjusting host segment selectors to satisfy VT-x's VM-entry
    4528  * requirements. See hmR0VmxExportHostSegmentRegs().
    4529  */
    4530 #define VMXLOCAL_ADJUST_HOST_SEG(a_Seg, a_selValue) \
    4531     if ((a_selValue) & (X86_SEL_RPL | X86_SEL_LDT)) \
    4532     { \
    4533         uint32_t fAttr; \
    4534         if (   !((a_selValue) & X86_SEL_LDT) /* likely */ \
    4535             || (((fAttr = ASMGetSegAttr(a_selValue)) & X86_DESC_P) && fAttr != UINT32_MAX)) \
    4536         { \
    4537             fRestoreHostFlags |= VMX_RESTORE_HOST_SEL_##a_Seg; \
    4538             pVCpu->hm.s.vmx.RestoreHost.uHostSel##a_Seg = (a_selValue); \
    4539         } \
    4540         (a_selValue) = 0; \
    4541     }
    4542 
    45434526    /*
    45444527     * If we've executed guest code using hardware-assisted VMX, the host-state bits
     
    45564539        pVCpu->hm.s.vmx.fRestoreHostFlags = 0;
    45574540    }
    4558     uint32_t fRestoreHostFlags = 0;
    4559 
    4560     /*
    4561      * Host segment registers.
    4562      */
    4563     RTSEL uSelES = ASMGetES();
    4564     RTSEL uSelCS = ASMGetCS();
    4565     RTSEL uSelSS = ASMGetSS();
    4566     RTSEL uSelDS = ASMGetDS();
    4567     RTSEL uSelFS = ASMGetFS();
    4568     RTSEL uSelGS = ASMGetGS();
    4569     RTSEL uSelTR = ASMGetTR();
     4541
     4542    /*
     4543     * Get all the host info.
     4544     * ASSUME it is safe to use rdfsbase and friends if the CR4.FSGSBASE bit is set
     4545     * without also checking the cpuid bit.
     4546     */
     4547    uint32_t fRestoreHostFlags;
     4548#if RT_INLINE_ASM_EXTERNAL
     4549    if (uHostCr4 & X86_CR4_FSGSBASE)
     4550    {
     4551        hmR0VmxExportHostSegmentRegsAsmHlp(&pVCpu->hm.s.vmx.RestoreHost, true /*fHaveFsGsBase*/);
     4552        fRestoreHostFlags = VMX_RESTORE_HOST_CAN_USE_WRFSBASE_AND_WRGSBASE;
     4553    }
     4554    else
     4555    {
     4556        hmR0VmxExportHostSegmentRegsAsmHlp(&pVCpu->hm.s.vmx.RestoreHost, false /*fHaveFsGsBase*/);
     4557        fRestoreHostFlags = 0;
     4558    }
     4559    RTSEL uSelES = pVCpu->hm.s.vmx.RestoreHost.uHostSelES;
     4560    RTSEL uSelDS = pVCpu->hm.s.vmx.RestoreHost.uHostSelDS;
     4561    RTSEL uSelFS = pVCpu->hm.s.vmx.RestoreHost.uHostSelFS;
     4562    RTSEL uSelGS = pVCpu->hm.s.vmx.RestoreHost.uHostSelGS;
     4563#else
     4564    pVCpu->hm.s.vmx.RestoreHost.uHostSelTR = ASMGetTR();
     4565    pVCpu->hm.s.vmx.RestoreHost.uHostSelSS = ASMGetSS();
     4566    pVCpu->hm.s.vmx.RestoreHost.uHostSelCS = ASMGetCS();
     4567    ASMGetGDTR((PRTGDTR)&pVCpu->hm.s.vmx.RestoreHost.HostGdtr);
     4568    ASMGetIDTR((PRTIDTR)&pVCpu->hm.s.vmx.RestoreHost.HostIdtr);
     4569    if (uHostCr4 & X86_CR4_FSGSBASE)
     4570    {
     4571        pVCpu->hm.s.vmx.RestoreHost.uHostFSBase = ASMGetFSBase();
     4572        pVCpu->hm.s.vmx.RestoreHost.uHostGSBase = ASMGetGSBase();
     4573        fRestoreHostFlags = VMX_RESTORE_HOST_CAN_USE_WRFSBASE_AND_WRGSBASE;
     4574    }
     4575    else
     4576    {
     4577        pVCpu->hm.s.vmx.RestoreHost.uHostFSBase = ASMRdMsr(MSR_K8_FS_BASE);
     4578        pVCpu->hm.s.vmx.RestoreHost.uHostGSBase = ASMRdMsr(MSR_K8_GS_BASE);
     4579        fRestoreHostFlags = 0;
     4580    }
     4581    RTSEL uSelES, uSelDS, uSelFS, uSelGS;
     4582    pVCpu->hm.s.vmx.RestoreHost.uHostSelDS = uSelDS = ASMGetDS();
     4583    pVCpu->hm.s.vmx.RestoreHost.uHostSelES = uSelES = ASMGetES();
     4584    pVCpu->hm.s.vmx.RestoreHost.uHostSelFS = uSelFS = ASMGetFS();
     4585    pVCpu->hm.s.vmx.RestoreHost.uHostSelGS = uSelGS = ASMGetGS();
     4586#endif
    45704587
    45714588    /*
     
    45754592     * See Intel spec. 26.2.3 "Checks on Host Segment and Descriptor-Table Registers".
    45764593     */
    4577     VMXLOCAL_ADJUST_HOST_SEG(DS, uSelDS);
    4578     VMXLOCAL_ADJUST_HOST_SEG(ES, uSelES);
    4579     VMXLOCAL_ADJUST_HOST_SEG(FS, uSelFS);
    4580     VMXLOCAL_ADJUST_HOST_SEG(GS, uSelGS);
     4594    RTSEL const uSelAll = uSelFS | uSelGS | uSelES | uSelDS;
     4595    if (uSelAll & (X86_SEL_RPL | X86_SEL_LDT))
     4596    {
     4597        if (!(uSelAll & X86_SEL_LDT))
     4598        {
     4599#define VMXLOCAL_ADJUST_HOST_SEG(a_Seg, a_uVmcsVar) \
     4600                do { \
     4601                    (a_uVmcsVar) = pVCpu->hm.s.vmx.RestoreHost.uHostSel##a_Seg; \
     4602                    if ((a_uVmcsVar) & X86_SEL_RPL) \
     4603                    { \
     4604                        fRestoreHostFlags |= VMX_RESTORE_HOST_SEL_##a_Seg; \
     4605                        (a_uVmcsVar) = 0; \
     4606                    } \
     4607                } while (0)
     4608            VMXLOCAL_ADJUST_HOST_SEG(DS, uSelDS);
     4609            VMXLOCAL_ADJUST_HOST_SEG(ES, uSelES);
     4610            VMXLOCAL_ADJUST_HOST_SEG(FS, uSelFS);
     4611            VMXLOCAL_ADJUST_HOST_SEG(GS, uSelGS);
     4612#undef VMXLOCAL_ADJUST_HOST_SEG
     4613        }
     4614        else
     4615        {
     4616#define VMXLOCAL_ADJUST_HOST_SEG(a_Seg, a_uVmcsVar) \
     4617                do { \
     4618                    (a_uVmcsVar) = pVCpu->hm.s.vmx.RestoreHost.uHostSel##a_Seg; \
     4619                    if ((a_uVmcsVar) & (X86_SEL_RPL | X86_SEL_LDT)) \
     4620                    { \
     4621                        if (!((a_uVmcsVar) & X86_SEL_LDT)) \
     4622                            fRestoreHostFlags |= VMX_RESTORE_HOST_SEL_##a_Seg; \
     4623                        else \
     4624                        { \
     4625                            uint32_t const fAttr = ASMGetSegAttr(a_uVmcsVar); \
     4626                            if ((fAttr & X86_DESC_P) && fAttr != UINT32_MAX) \
     4627                                fRestoreHostFlags |= VMX_RESTORE_HOST_SEL_##a_Seg; \
     4628                        } \
     4629                        (a_uVmcsVar) = 0; \
     4630                    } \
     4631                } while (0)
     4632            VMXLOCAL_ADJUST_HOST_SEG(DS, uSelDS);
     4633            VMXLOCAL_ADJUST_HOST_SEG(ES, uSelES);
     4634            VMXLOCAL_ADJUST_HOST_SEG(FS, uSelFS);
     4635            VMXLOCAL_ADJUST_HOST_SEG(GS, uSelGS);
     4636#undef VMXLOCAL_ADJUST_HOST_SEG
     4637        }
     4638    }
    45814639
    45824640    /* Verification based on Intel spec. 26.2.3 "Checks on Host Segment and Descriptor-Table Registers"  */
    4583     Assert(!(uSelCS & X86_SEL_RPL)); Assert(!(uSelCS & X86_SEL_LDT));
    4584     Assert(!(uSelSS & X86_SEL_RPL)); Assert(!(uSelSS & X86_SEL_LDT));
     4641    Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelTR & X86_SEL_RPL)); Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelTR & X86_SEL_LDT)); Assert(pVCpu->hm.s.vmx.RestoreHost.uHostSelTR);
     4642    Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelCS & X86_SEL_RPL)); Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelCS & X86_SEL_LDT)); Assert(pVCpu->hm.s.vmx.RestoreHost.uHostSelCS);
     4643    Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelSS & X86_SEL_RPL)); Assert(!(pVCpu->hm.s.vmx.RestoreHost.uHostSelSS & X86_SEL_LDT));
    45854644    Assert(!(uSelDS & X86_SEL_RPL)); Assert(!(uSelDS & X86_SEL_LDT));
    45864645    Assert(!(uSelES & X86_SEL_RPL)); Assert(!(uSelES & X86_SEL_LDT));
    45874646    Assert(!(uSelFS & X86_SEL_RPL)); Assert(!(uSelFS & X86_SEL_LDT));
    45884647    Assert(!(uSelGS & X86_SEL_RPL)); Assert(!(uSelGS & X86_SEL_LDT));
    4589     Assert(!(uSelTR & X86_SEL_RPL)); Assert(!(uSelTR & X86_SEL_LDT));
    4590     Assert(uSelCS);
    4591     Assert(uSelTR);
    4592 
    4593     /* Write these host selector fields into the host-state area in the VMCS. */
    4594     int rc = VMXWriteVmcs16(VMX_VMCS16_HOST_CS_SEL, uSelCS);    AssertRC(rc);
    4595     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_SS_SEL, uSelSS);    AssertRC(rc);
    4596     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_DS_SEL, uSelDS);    AssertRC(rc);
    4597     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_ES_SEL, uSelES);    AssertRC(rc);
    4598     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_FS_SEL, uSelFS);    AssertRC(rc);
    4599     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_GS_SEL, uSelGS);    AssertRC(rc);
    4600     rc     = VMXWriteVmcs16(VMX_VMCS16_HOST_TR_SEL, uSelTR);    AssertRC(rc);
    4601 
    4602     /*
    4603      * Host GDTR and IDTR.
    4604      */
    4605     RTGDTRALIGNED Gdtr;
    4606     RTIDTRALIGNED Idtr;
    4607     ASMGetGDTR(&Gdtr.s.Gdtr);
    4608     ASMGetIDTR(&Idtr.s.Idtr);
    4609     rc = VMXWriteVmcsNw(VMX_VMCS_HOST_GDTR_BASE, Gdtr.s.Gdtr.pGdt);    AssertRC(rc);
    4610     rc = VMXWriteVmcsNw(VMX_VMCS_HOST_IDTR_BASE, Idtr.s.Idtr.pIdt);    AssertRC(rc);
    46114648
    46124649    /*
     
    46144651     * them to the maximum limit (0xffff) on every VM-exit.
    46154652     */
    4616     if (Gdtr.s.Gdtr.cbGdt != 0xffff)
     4653    if (pVCpu->hm.s.vmx.RestoreHost.HostGdtr.cb != 0xffff)
    46174654        fRestoreHostFlags |= VMX_RESTORE_HOST_GDTR;
    46184655
     
    46274664     */
    46284665#if defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
    4629     if (Idtr.s.Idtr.cbIdt <  0x0fff)
     4666    if (pVCpu->hm.s.vmx.RestoreHost.HostIdtr.cb <  0x0fff)
    46304667#else
    4631     if (Idtr.s.Idtr.cbIdt != 0xffff)
     4668    if (pVCpu->hm.s.vmx.RestoreHost.HostIdtr.cb != 0xffff)
    46324669#endif
    4633     {
    46344670        fRestoreHostFlags |= VMX_RESTORE_HOST_IDTR;
    4635         pVCpu->hm.s.vmx.RestoreHost.HostIdtr.cb    = Idtr.s.Idtr.cbIdt;
    4636         pVCpu->hm.s.vmx.RestoreHost.HostIdtr.uAddr = Idtr.s.Idtr.pIdt;
    4637     }
    46384671
    46394672    /*
     
    46424675     * RPL should be too in most cases.
    46434676     */
    4644     AssertMsgReturn((uSelTR | X86_SEL_RPL_LDT) <= Gdtr.s.Gdtr.cbGdt,
    4645                     ("TR selector exceeds limit. TR=%RTsel cbGdt=%#x\n", uSelTR, Gdtr.s.Gdtr.cbGdt), VERR_VMX_INVALID_HOST_STATE);
    4646 
    4647     PCX86DESCHC pDesc = (PCX86DESCHC)(Gdtr.s.Gdtr.pGdt + (uSelTR & X86_SEL_MASK));
     4677    RTSEL const uSelTR = pVCpu->hm.s.vmx.RestoreHost.uHostSelTR;
     4678    AssertMsgReturn((uSelTR | X86_SEL_RPL_LDT) <= pVCpu->hm.s.vmx.RestoreHost.HostGdtr.cb,
     4679                    ("TR selector exceeds limit. TR=%RTsel cbGdt=%#x\n", uSelTR, pVCpu->hm.s.vmx.RestoreHost.HostGdtr.cb),
     4680                    VERR_VMX_INVALID_HOST_STATE);
     4681
     4682    PCX86DESCHC pDesc = (PCX86DESCHC)(pVCpu->hm.s.vmx.RestoreHost.HostGdtr.uAddr + (uSelTR & X86_SEL_MASK));
    46484683    uintptr_t const uTRBase = X86DESC64_BASE(pDesc);
    46494684
     
    46724707            /* The GDT is read-only but the writable GDT is available. */
    46734708            fRestoreHostFlags |= VMX_RESTORE_HOST_GDT_NEED_WRITABLE;
    4674             pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.cb = Gdtr.s.Gdtr.cbGdt;
    4675             rc = SUPR0GetCurrentGdtRw(&pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.uAddr);
     4709            pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.cb = pVCpu->hm.s.vmx.RestoreHost.HostGdtr.cb;
     4710            int rc = SUPR0GetCurrentGdtRw(&pVCpu->hm.s.vmx.RestoreHost.HostGdtrRw.uAddr);
    46764711            AssertRCReturn(rc, rc);
    46774712        }
    4678         pVCpu->hm.s.vmx.RestoreHost.uHostSelTR = uSelTR;
    4679     }
    4680 
    4681     /*
    4682      * Store the GDTR as we need it when restoring the GDT and while restoring the TR.
    4683      */
    4684     if (fRestoreHostFlags & (VMX_RESTORE_HOST_GDTR | VMX_RESTORE_HOST_SEL_TR))
    4685     {
    4686         pVCpu->hm.s.vmx.RestoreHost.HostGdtr.cb    = Gdtr.s.Gdtr.cbGdt;
    4687         pVCpu->hm.s.vmx.RestoreHost.HostGdtr.uAddr = Gdtr.s.Gdtr.pGdt;
    4688     }
    4689 
    4690     rc = VMXWriteVmcsNw(VMX_VMCS_HOST_TR_BASE, uTRBase);
    4691     AssertRC(rc);
    4692 
    4693     /*
    4694      * Host FS base and GS base.
    4695      * ASSUME it is safe to use rdfsbase and friends if the CR4.FSGSBASE bit is set
    4696      * without also checking the cpuid bit.
    4697      */
    4698     uint64_t GCPtrFSBase, GCPtrGSBase;
    4699     if (uHostCr4 & X86_CR4_FSGSBASE)
    4700     {
    4701         fRestoreHostFlags |= VMX_RESTORE_HOST_CAN_USE_WRFSBASE_AND_WRGSBASE;
    4702         GCPtrFSBase = ASMGetFSBase();
    4703         GCPtrGSBase = ASMGetGSBase();
    4704     }
    4705     else
    4706     {
    4707         GCPtrFSBase = ASMRdMsr(MSR_K8_FS_BASE);
    4708         GCPtrGSBase = ASMRdMsr(MSR_K8_GS_BASE);
    4709     }
    4710     rc = VMXWriteVmcsNw(VMX_VMCS_HOST_FS_BASE, GCPtrFSBase);  AssertRC(rc);
    4711     rc = VMXWriteVmcsNw(VMX_VMCS_HOST_GS_BASE, GCPtrGSBase);  AssertRC(rc);
    4712 
    4713     /* Store the base if we have to restore FS or GS manually as we need to restore the base as well. */
    4714     if (fRestoreHostFlags & VMX_RESTORE_HOST_SEL_FS)
    4715         pVCpu->hm.s.vmx.RestoreHost.uHostFSBase = GCPtrFSBase;
    4716     if (fRestoreHostFlags & VMX_RESTORE_HOST_SEL_GS)
    4717         pVCpu->hm.s.vmx.RestoreHost.uHostGSBase = GCPtrGSBase;
     4713    }
    47184714
    47194715    pVCpu->hm.s.vmx.fRestoreHostFlags = fRestoreHostFlags;
    47204716
     4717    /*
     4718     * Do all the VMCS updates in one block to assist nested virtualization.
     4719     */
     4720    int rc;
     4721    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_CS_SEL,  pVCpu->hm.s.vmx.RestoreHost.uHostSelCS);       AssertRC(rc);
     4722    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_SS_SEL,  pVCpu->hm.s.vmx.RestoreHost.uHostSelSS);       AssertRC(rc);
     4723    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_DS_SEL,  uSelDS);                                       AssertRC(rc);
     4724    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_ES_SEL,  uSelES);                                       AssertRC(rc);
     4725    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_FS_SEL,  uSelFS);                                       AssertRC(rc);
     4726    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_GS_SEL,  uSelGS);                                       AssertRC(rc);
     4727    rc = VMXWriteVmcs16(VMX_VMCS16_HOST_TR_SEL,  pVCpu->hm.s.vmx.RestoreHost.uHostSelTR);       AssertRC(rc);
     4728    rc = VMXWriteVmcsNw(VMX_VMCS_HOST_GDTR_BASE, pVCpu->hm.s.vmx.RestoreHost.HostGdtr.uAddr);   AssertRC(rc);
     4729    rc = VMXWriteVmcsNw(VMX_VMCS_HOST_IDTR_BASE, pVCpu->hm.s.vmx.RestoreHost.HostIdtr.uAddr);   AssertRC(rc);
     4730    rc = VMXWriteVmcsNw(VMX_VMCS_HOST_TR_BASE,   uTRBase);                                      AssertRC(rc);
     4731    rc = VMXWriteVmcsNw(VMX_VMCS_HOST_FS_BASE,   pVCpu->hm.s.vmx.RestoreHost.uHostFSBase);      AssertRC(rc);
     4732    rc = VMXWriteVmcsNw(VMX_VMCS_HOST_GS_BASE,   pVCpu->hm.s.vmx.RestoreHost.uHostGSBase);      AssertRC(rc);
     4733
    47214734    return VINF_SUCCESS;
    4722 #undef VMXLOCAL_ADJUST_HOST_SEG
    47234735}
    47244736
  • trunk/src/VBox/VMM/include/HMInternal.h

    r87401 r87408  
    914914    RTSEL       uHostSelGS;     /**< 0x10 */
    915915    RTSEL       uHostSelTR;     /**< 0x12 */
    916     uint8_t     abPadding0[2];  /**< 0x14 */
     916    RTSEL       uHostSelSS;     /**< 0x14 - not restored, just for fetching */
    917917    X86XDTR64   HostGdtrRw;     /**< 0x16 - should be aligned by its 64-bit member. */
    918     uint8_t     abPadding1[6];  /**< 0x20 */
     918    RTSEL       uHostSelCS;     /**< 0x20 - not restored, just for fetching */
     919    uint8_t     abPadding1[4];  /**< 0x22 */
    919920    X86XDTR64   HostIdtr;       /**< 0x26 - should be aligned by its 64-bit member. */
    920921    uint64_t    uHostFSBase;    /**< 0x30 */
     
    13431344
    13441345/**
     1346 * Used on platforms with poor inline assembly support to retrieve all the
     1347 * info from the CPU and put it in the @a pRestoreHost structure.
     1348 */
     1349DECLASM(void)               hmR0VmxExportHostSegmentRegsAsmHlp(PVMXRESTOREHOST pRestoreHost, bool fHaveFsGsBase);
     1350
     1351/**
    13451352 * Restores some host-state fields that need not be done on every VM-exit.
    13461353 *
  • trunk/src/VBox/VMM/include/HMInternal.mac

    r87401 r87408  
    102102    .uHostSelGS                     resw    1
    103103    .uHostSelTR                     resw    1
    104     .abPadding0                     resb    2
     104    .uHostSelSS                     resw    1
    105105    .HostGdtrRw                     resb    10
    106     .abPadding1                     resb    6
     106    .uHostSelCS                     resw    1
     107    .abPadding1                     resb    4
    107108    .HostIdtr                       resb    10
    108109    alignb 8
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette