VirtualBox

Changeset 71092 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Feb 22, 2018 9:14:46 AM (7 years ago)
Author:
vboxsync
Message:

VMM/IEM: Nested Hw.virt: Implement SVM decode-assist and NRIP feature.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r71079 r71092  
    412412
    413413/**
     414 * Updates the NextRIP (NRI) field in the nested-guest VMCB.
     415 */
     416# define IEM_SVM_UPDATE_NRIP(a_pVCpu) \
     417    do { \
     418        if (IEM_GET_GUEST_CPU_FEATURES(a_pVCpu)->fSvmNextRipSave) \
     419            CPUMGuestSvmUpdateNRip(a_pVCpu, IEM_GET_CTX(a_pVCpu), IEM_GET_INSTR_LEN(a_pVCpu)); \
     420    } while (0)
     421
     422/**
    414423 * Check if an SVM is enabled.
    415424 */
     
    473482#else
    474483# define IEM_SVM_INSTR_COMMON_CHECKS(a_pVCpu, a_Instr)                                    do { } while (0)
     484# define IEM_SVM_UPDATE_NRIP(a_pVCpu)                                                     do { } while (0)
    475485# define IEM_IS_SVM_ENABLED(a_pVCpu)                                                      (false)
    476486# define IEM_IS_SVM_CTRL_INTERCEPT_SET(a_pVCpu, a_Intercept)                              (false)
     
    1283912849
    1284012850#ifdef VBOX_WITH_NESTED_HWVIRT
    12841 /** Check and handles SVM nested-guest control & instruction intercept. */
    12842 # define IEMOP_HLP_SVM_CTRL_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2) \
     12851/** Check and handles SVM nested-guest instruction intercept and updates
     12852 *  NRIP if needed. */
     12853# define IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2) \
    1284312854    do \
    1284412855    { \
    1284512856        if (IEM_IS_SVM_CTRL_INTERCEPT_SET(a_pVCpu, a_Intercept)) \
     12857        { \
     12858            IEM_SVM_UPDATE_NRIP(a_pVCpu); \
    1284612859            IEM_RETURN_SVM_VMEXIT(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2); \
     12860        } \
    1284712861    } while (0)
    1284812862
     
    1285212866    { \
    1285312867        if (IEM_IS_SVM_READ_CR_INTERCEPT_SET(a_pVCpu, a_uCr)) \
     12868        { \
     12869            IEM_SVM_UPDATE_NRIP(a_pVCpu); \
    1285412870            IEM_RETURN_SVM_VMEXIT(a_pVCpu, SVM_EXIT_READ_CR0 + (a_uCr), a_uExitInfo1, a_uExitInfo2); \
     12871        } \
    1285512872    } while (0)
    1285612873
    1285712874#else  /* !VBOX_WITH_NESTED_HWVIRT */
    12858 # define IEMOP_HLP_SVM_CTRL_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2)    do { } while (0)
    12859 # define IEMOP_HLP_SVM_READ_CR_INTERCEPT(a_pVCpu, a_uCr, a_uExitInfo1, a_uExitInfo2)                    do { } while (0)
     12875# define IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2)  do { } while (0)
     12876# define IEMOP_HLP_SVM_READ_CR_INTERCEPT(a_pVCpu, a_uCr, a_uExitInfo1, a_uExitInfo2)                            do { } while (0)
    1286012877#endif /* !VBOX_WITH_NESTED_HWVIRT */
    1286112878
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r71077 r71092  
    565565    {
    566566        Log2(("pushf: Guest intercept -> #VMEXIT\n"));
     567        IEM_SVM_UPDATE_NRIP(pVCpu);
    567568        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_PUSHF, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    568569    }
     
    632633    {
    633634        Log2(("popf: Guest intercept -> #VMEXIT\n"));
     635        IEM_SVM_UPDATE_NRIP(pVCpu);
    634636        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_POPF, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    635637    }
     
    38793881    {
    38803882        Log(("iret: Guest intercept -> #VMEXIT\n"));
     3883        IEM_SVM_UPDATE_NRIP(pVCpu);
    38813884        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_IRET, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    38823885    }
     
    46624665    {
    46634666        Log(("lgdt: Guest intercept -> #VMEXIT\n"));
     4667        IEM_SVM_UPDATE_NRIP(pVCpu);
    46644668        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_GDTR_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    46654669    }
     
    47134717    {
    47144718        Log(("sgdt: Guest intercept -> #VMEXIT\n"));
     4719        IEM_SVM_UPDATE_NRIP(pVCpu);
    47154720        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_GDTR_READ, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    47164721    }
     
    47404745    {
    47414746        Log(("lidt: Guest intercept -> #VMEXIT\n"));
     4747        IEM_SVM_UPDATE_NRIP(pVCpu);
    47424748        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_IDTR_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    47434749    }
     
    47904796    {
    47914797        Log(("sidt: Guest intercept -> #VMEXIT\n"));
     4798        IEM_SVM_UPDATE_NRIP(pVCpu);
    47924799        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_IDTR_READ, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    47934800    }
     
    48384845        {
    48394846            Log(("lldt: Guest intercept -> #VMEXIT\n"));
     4847            IEM_SVM_UPDATE_NRIP(pVCpu);
    48404848            IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_LDTR_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    48414849        }
     
    49194927    {
    49204928        Log(("lldt: Guest intercept -> #VMEXIT\n"));
     4929        IEM_SVM_UPDATE_NRIP(pVCpu);
    49214930        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_LDTR_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    49224931    }
     
    49764985    {
    49774986        Log(("ltr: Guest intercept -> #VMEXIT\n"));
     4987        IEM_SVM_UPDATE_NRIP(pVCpu);
    49784988        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_TR_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    49794989    }
     
    50835093    {
    50845094        Log(("iemCImpl_mov_Rd_Cd: Guest intercept CR%u -> #VMEXIT\n", iCrReg));
     5095        IEM_SVM_UPDATE_NRIP(pVCpu);
    50855096        IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_READ_CR0 + iCrReg, IEMACCESSCRX_MOV_CRX, iGReg);
    50865097    }
     
    52335244            {
    52345245                Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5246                IEM_SVM_UPDATE_NRIP(pVCpu);
    52355247                IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR0, enmAccessCrX, iGReg);
    52365248            }
     
    52435255                    Assert(enmAccessCrX != IEMACCESSCRX_CLTS);
    52445256                    Log(("iemCImpl_load_Cr%#x: TS/MP bit changed or lmsw instr: Guest intercept -> #VMEXIT\n", iCrReg));
     5257                    IEM_SVM_UPDATE_NRIP(pVCpu);
    52455258                    IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_CR0_SEL_WRITE, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    52465259                }
     
    53105323            {
    53115324                Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5325                IEM_SVM_UPDATE_NRIP(pVCpu);
    53125326                IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR2, enmAccessCrX, iGReg);
    53135327            }
     
    53625376            {
    53635377                Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5378                IEM_SVM_UPDATE_NRIP(pVCpu);
    53645379                IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR3, enmAccessCrX, iGReg);
    53655380            }
     
    54475462            {
    54485463                Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5464                IEM_SVM_UPDATE_NRIP(pVCpu);
    54495465                IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR4, enmAccessCrX, iGReg);
    54505466            }
     
    55095525                {
    55105526                    Log(("iemCImpl_load_Cr%#x: Guest intercept -> #VMEXIT\n", iCrReg));
     5527                    IEM_SVM_UPDATE_NRIP(pVCpu);
    55115528                    IEM_RETURN_SVM_CRX_VMEXIT(pVCpu, SVM_EXIT_WRITE_CR8, enmAccessCrX, iGReg);
    55125529                }
     
    56735690    {
    56745691        Log(("mov r%u,dr%u: Guest intercept -> #VMEXIT\n", iGReg, iDrReg));
     5692        IEM_SVM_UPDATE_NRIP(pVCpu);
    56755693        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_READ_DR0 + (iDrReg & 0xf),
    56765694                              IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmDecodeAssists ? (iGReg & 7) : 0, 0 /* uExitInfo2 */);
     
    57745792    {
    57755793        Log2(("mov dr%u,r%u: Guest intercept -> #VMEXIT\n", iDrReg, iGReg));
     5794        IEM_SVM_UPDATE_NRIP(pVCpu);
    57765795        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_WRITE_DR0 + (iDrReg & 0xf),
    57775796                              IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmDecodeAssists ? (iGReg & 7) : 0, 0 /* uExitInfo2 */);
     
    58105829    {
    58115830        Log(("invlpg: Guest intercept (%RGp) -> #VMEXIT\n", GCPtrPage));
     5831        IEM_SVM_UPDATE_NRIP(pVCpu);
    58125832        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_INVLPG,
    58135833                              IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmDecodeAssists ? GCPtrPage : 0, 0 /* uExitInfo2 */);
     
    59545974    {
    59555975        Log(("rdtsc: Guest intercept -> #VMEXIT\n"));
     5976        IEM_SVM_UPDATE_NRIP(pVCpu);
    59565977        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_RDTSC, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    59575978    }
     
    59986019    {
    59996020        Log(("rdtscp: Guest intercept -> #VMEXIT\n"));
     6021        IEM_SVM_UPDATE_NRIP(pVCpu);
    60006022        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_RDTSCP, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    60016023    }
     
    60396061    {
    60406062        Log(("rdpmc: Guest intercept -> #VMEXIT\n"));
     6063        IEM_SVM_UPDATE_NRIP(pVCpu);
    60416064        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_RDPMC, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    60426065    }
     
    64836506    {
    64846507        Log2(("hlt: Guest intercept -> #VMEXIT\n"));
     6508        IEM_SVM_UPDATE_NRIP(pVCpu);
    64856509        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_HLT, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    64866510    }
     
    65376561    {
    65386562        Log2(("monitor: Guest intercept -> #VMEXIT\n"));
     6563        IEM_SVM_UPDATE_NRIP(pVCpu);
    65396564        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_MONITOR, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    65406565    }
     
    66046629    {
    66056630        Log2(("mwait: Guest intercept (monitor hardware armed) -> #VMEXIT\n"));
     6631        IEM_SVM_UPDATE_NRIP(pVCpu);
    66066632        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_MWAIT_ARMED, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    66076633    }
     
    66096635    {
    66106636        Log2(("mwait: Guest intercept -> #VMEXIT\n"));
     6637        IEM_SVM_UPDATE_NRIP(pVCpu);
    66116638        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_MWAIT, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    66126639    }
     
    66616688    {
    66626689        Log2(("cpuid: Guest intercept -> #VMEXIT\n"));
     6690        IEM_SVM_UPDATE_NRIP(pVCpu);
    66636691        IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_CPUID, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    66646692    }
     
    70147042        {
    70157043            Log2(("xsetbv: Guest intercept -> #VMEXIT\n"));
     7044            IEM_SVM_UPDATE_NRIP(pVCpu);
    70167045            IEM_RETURN_SVM_VMEXIT(pVCpu, SVM_EXIT_XSETBV, 0 /* uExitInfo1 */, 0 /* uExitInfo2 */);
    70177046        }
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r69111 r71092  
    44614461        Assert(!IEM_GET_GUEST_CPU_FEATURES(pVCpu)->fSvmPauseFilterThreshold);
    44624462#endif
    4463         IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_PAUSE, SVM_EXIT_PAUSE, 0, 0);
     4463        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_PAUSE, SVM_EXIT_PAUSE, 0, 0);
    44644464    }
    44654465    else
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsTwoByte0f.cpp.h

    r70643 r71092  
    3535    {
    3636        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    37         IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_LDTR_READS, SVM_EXIT_LDTR_READ, 0, 0);
     37        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_LDTR_READS, SVM_EXIT_LDTR_READ, 0, 0);
    3838        switch (pVCpu->iem.s.enmEffOpSize)
    3939        {
     
    7575        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    7676        IEMOP_HLP_DECODED_NL_1(OP_SLDT, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    77         IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_LDTR_READS, SVM_EXIT_LDTR_READ, 0, 0);
     77        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_LDTR_READS, SVM_EXIT_LDTR_READ, 0, 0);
    7878        IEM_MC_FETCH_LDTR_U16(u16Ldtr);
    7979        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Ldtr);
     
    9595    {
    9696        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_REG, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    97         IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_TR_READS, SVM_EXIT_TR_READ, 0, 0);
     97        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_TR_READS, SVM_EXIT_TR_READ, 0, 0);
    9898        switch (pVCpu->iem.s.enmEffOpSize)
    9999        {
     
    135135        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm, 0);
    136136        IEMOP_HLP_DECODED_NL_1(OP_STR, IEMOPFORM_M_MEM, OP_PARM_Ew, DISOPTYPE_DANGEROUS | DISOPTYPE_PRIVILEGED_NOTRAP);
    137         IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_TR_READS, SVM_EXIT_TR_READ, 0, 0);
     137        IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_TR_READS, SVM_EXIT_TR_READ, 0, 0);
    138138        IEM_MC_FETCH_TR_U16(u16Tr);
    139139        IEM_MC_STORE_MEM_U16(pVCpu->iem.s.iEffSeg, GCPtrEffDst, u16Tr);
     
    653653    IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX();
    654654    /** @todo SVM intercept removal from here. */
    655     IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_RDTSCP, SVM_EXIT_RDTSCP, 0, 0);
     655    IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_RDTSCP, SVM_EXIT_RDTSCP, 0, 0);
    656656    return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_rdtscp);
    657657}
     
    889889#ifdef VBOX_WITH_NESTED_HWVIRT
    890890    IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO();
    891     IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_INVD, SVM_EXIT_INVD, 0, 0);
     891    IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_INVD, SVM_EXIT_INVD, 0, 0);
    892892#else
    893893    RT_NOREF_PV(pVCpu);
     
    910910    IEM_MC_BEGIN(0, 0);
    911911    IEM_MC_RAISE_GP0_IF_CPL_NOT_ZERO();
    912     IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_WBINVD, SVM_EXIT_WBINVD, 0, 0);
     912    IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_WBINVD, SVM_EXIT_WBINVD, 0, 0);
    913913    IEM_MC_ADVANCE_RIP();
    914914    IEM_MC_END();
     
    66656665{
    66666666    IEMOP_MNEMONIC(rsm, "rsm");
    6667     IEMOP_HLP_SVM_CTRL_INTERCEPT(pVCpu, SVM_CTRL_INTERCEPT_RSM, SVM_EXIT_RSM, 0, 0);
     6667    IEMOP_HLP_SVM_INSTR_INTERCEPT_AND_NRIP(pVCpu, SVM_CTRL_INTERCEPT_RSM, SVM_EXIT_RSM, 0, 0);
    66686668    /** @todo rsm - for the regular case (above handles only the SVM nested-guest
    66696669     *        intercept). */
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