VirtualBox

Changeset 99984 in vbox for trunk/src/VBox/VMM/include


Ignore:
Timestamp:
May 26, 2023 1:20:46 AM (21 months ago)
Author:
vboxsync
Message:

VMM/IEM: Fixed a few places in IEMAllCImpl.cpp and IEMAllCImplSvmInstr.cpp where decoder state was used directly instead of being passed as arguments. bugref:10369

Location:
trunk/src/VBox/VMM/include
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/include/IEMInline.h

    r99983 r99984  
    23682368
    23692369
    2370 #ifndef IEM_WITH_OPAQUE_DECODER_STATE
    2371 /**
    2372  * Updates the FOP, FPU.CS and FPUIP registers.
     2370/**
     2371 * Updates the FOP, FPU.CS and FPUIP registers, extended version.
    23732372 *
    23742373 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    23752374 * @param   pFpuCtx             The FPU context.
    2376  */
    2377 DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PVMCPUCC pVCpu, PX86FXSTATE pFpuCtx) RT_NOEXCEPT
    2378 {
    2379     Assert(pVCpu->iem.s.uFpuOpcode != UINT16_MAX);
    2380     pFpuCtx->FOP = pVCpu->iem.s.uFpuOpcode;
     2375 * @param   uFpuOpcode          The FPU opcode value (see IEMCPU::uFpuOpcode).
     2376 */
     2377DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorkerEx(PVMCPUCC pVCpu, PX86FXSTATE pFpuCtx, uint16_t uFpuOpcode) RT_NOEXCEPT
     2378{
     2379    Assert(uFpuOpcode != UINT16_MAX);
     2380    pFpuCtx->FOP = uFpuOpcode;
    23812381    /** @todo x87.CS and FPUIP needs to be kept seperately. */
    23822382    if (IEM_IS_REAL_OR_V86_MODE(pVCpu))
     
    23952395        *(uint64_t *)&pFpuCtx->FPUIP = pVCpu->cpum.GstCtx.rip;
    23962396}
     2397
     2398
     2399#ifndef IEM_WITH_OPAQUE_DECODER_STATE
     2400/**
     2401 * Updates the FOP, FPU.CS and FPUIP registers.
     2402 *
     2403 * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
     2404 * @param   pFpuCtx             The FPU context.
     2405 */
     2406DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PVMCPUCC pVCpu, PX86FXSTATE pFpuCtx) RT_NOEXCEPT
     2407{
     2408    Assert(pVCpu->iem.s.uFpuOpcode != UINT16_MAX);
     2409    iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, pVCpu->iem.s.uFpuOpcode);
     2410}
    23972411#endif /* !IEM_WITH_OPAQUE_DECODER_STATE */
    2398 
    2399 
    24002412
    24012413
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r99982 r99984  
    38163816 *  NRIP if needed.
    38173817 */
    3818 # define IEM_SVM_CHECK_INSTR_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2) \
     3818# define IEM_SVM_CHECK_INSTR_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2, a_cbInstr) \
    38193819    do \
    38203820    { \
    38213821        if (IEM_SVM_IS_CTRL_INTERCEPT_SET(a_pVCpu, a_Intercept)) \
    38223822        { \
    3823             IEM_SVM_UPDATE_NRIP(a_pVCpu); \
     3823            IEM_SVM_UPDATE_NRIP(a_pVCpu, a_cbInstr); \
    38243824            IEM_SVM_VMEXIT_RET(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2); \
    38253825        } \
     
    38273827
    38283828/** Checks and handles SVM nested-guest CR0 read intercept. */
    3829 # define IEM_SVM_CHECK_READ_CR0_INTERCEPT(a_pVCpu, a_uExitInfo1, a_uExitInfo2) \
     3829# define IEM_SVM_CHECK_READ_CR0_INTERCEPT(a_pVCpu, a_uExitInfo1, a_uExitInfo2, a_cbInstr) \
    38303830    do \
    38313831    { \
     
    38343834        else \
    38353835        { \
    3836             IEM_SVM_UPDATE_NRIP(a_pVCpu); \
     3836            IEM_SVM_UPDATE_NRIP(a_pVCpu, a_cbInstr); \
    38373837            IEM_SVM_VMEXIT_RET(a_pVCpu, SVM_EXIT_READ_CR0, a_uExitInfo1, a_uExitInfo2); \
    38383838        } \
     
    38423842 * Updates the NextRIP (NRI) field in the nested-guest VMCB.
    38433843 */
    3844 # define IEM_SVM_UPDATE_NRIP(a_pVCpu) \
     3844# define IEM_SVM_UPDATE_NRIP(a_pVCpu, a_cbInstr) \
    38453845    do { \
    38463846        if (IEM_GET_GUEST_CPU_FEATURES(a_pVCpu)->fSvmNextRipSave) \
    3847             CPUMGuestSvmUpdateNRip(a_pVCpu, IEM_GET_CTX(a_pVCpu), IEM_GET_INSTR_LEN(a_pVCpu)); \
     3847            CPUMGuestSvmUpdateNRip(a_pVCpu, IEM_GET_CTX(a_pVCpu), (a_cbInstr)); \
    38483848    } while (0)
    38493849
    38503850#else
    3851 # define IEM_SVM_IS_CTRL_INTERCEPT_SET(a_pVCpu, a_Intercept)                              (false)
    3852 # define IEM_SVM_IS_READ_CR_INTERCEPT_SET(a_pVCpu, a_uCr)                                 (false)
    3853 # define IEM_SVM_IS_WRITE_CR_INTERCEPT_SET(a_pVCpu, a_uCr)                                (false)
    3854 # define IEM_SVM_IS_READ_DR_INTERCEPT_SET(a_pVCpu, a_uDr)                                 (false)
    3855 # define IEM_SVM_IS_WRITE_DR_INTERCEPT_SET(a_pVCpu, a_uDr)                                (false)
    3856 # define IEM_SVM_IS_XCPT_INTERCEPT_SET(a_pVCpu, a_uVector)                                (false)
    3857 # define IEM_SVM_VMEXIT_RET(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2)             do { return VERR_SVM_IPE_1; } while (0)
    3858 # define IEM_SVM_CRX_VMEXIT_RET(a_pVCpu, a_uExitCode, a_enmAccessCrX, a_iGReg)            do { return VERR_SVM_IPE_1; } while (0)
    3859 # define IEM_SVM_CHECK_INSTR_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, a_uExitInfo1, a_uExitInfo2)   do { } while (0)
    3860 # define IEM_SVM_CHECK_READ_CR0_INTERCEPT(a_pVCpu, a_uExitInfo1, a_uExitInfo2)                          do { } while (0)
    3861 # define IEM_SVM_UPDATE_NRIP(a_pVCpu)                                                     do { } while (0)
     3851# define IEM_SVM_IS_CTRL_INTERCEPT_SET(a_pVCpu, a_Intercept)                                (false)
     3852# define IEM_SVM_IS_READ_CR_INTERCEPT_SET(a_pVCpu, a_uCr)                                   (false)
     3853# define IEM_SVM_IS_WRITE_CR_INTERCEPT_SET(a_pVCpu, a_uCr)                                  (false)
     3854# define IEM_SVM_IS_READ_DR_INTERCEPT_SET(a_pVCpu, a_uDr)                                   (false)
     3855# define IEM_SVM_IS_WRITE_DR_INTERCEPT_SET(a_pVCpu, a_uDr)                                  (false)
     3856# define IEM_SVM_IS_XCPT_INTERCEPT_SET(a_pVCpu, a_uVector)                                  (false)
     3857# define IEM_SVM_VMEXIT_RET(a_pVCpu, a_uExitCode, a_uExitInfo1, a_uExitInfo2)               do { return VERR_SVM_IPE_1; } while (0)
     3858# define IEM_SVM_CRX_VMEXIT_RET(a_pVCpu, a_uExitCode, a_enmAccessCrX, a_iGReg)              do { return VERR_SVM_IPE_1; } while (0)
     3859# define IEM_SVM_CHECK_INSTR_INTERCEPT(a_pVCpu, a_Intercept, a_uExitCode, \
     3860                                       a_uExitInfo1, a_uExitInfo2, a_cbInstr)               do { } while (0)
     3861# define IEM_SVM_CHECK_READ_CR0_INTERCEPT(a_pVCpu, a_uExitInfo1, a_uExitInfo2, a_cbInstr)   do { } while (0)
     3862# define IEM_SVM_UPDATE_NRIP(a_pVCpu, a_cbInstr)                                            do { } while (0)
    38623863
    38633864#endif
     
    41784179IEM_CIMPL_PROTO_0(iemCImpl_loadall286);
    41794180IEM_CIMPL_PROTO_0(iemCImpl_syscall);
    4180 IEM_CIMPL_PROTO_0(iemCImpl_sysret);
     4181IEM_CIMPL_PROTO_1(iemCImpl_sysret, IEMMODE, enmEffOpSize);
    41814182IEM_CIMPL_PROTO_0(iemCImpl_sysenter);
    41824183IEM_CIMPL_PROTO_1(iemCImpl_sysexit, IEMMODE, enmEffOpSize);
     
    42194220IEM_CIMPL_PROTO_0(iemCImpl_rdmsr);
    42204221IEM_CIMPL_PROTO_0(iemCImpl_wrmsr);
    4221 IEM_CIMPL_PROTO_3(iemCImpl_in, uint16_t, u16Port, bool, fImm, uint8_t, cbReg);
    4222 IEM_CIMPL_PROTO_1(iemCImpl_in_eAX_DX, uint8_t, cbReg);
    4223 IEM_CIMPL_PROTO_3(iemCImpl_out, uint16_t, u16Port, bool, fImm, uint8_t, cbReg);
    4224 IEM_CIMPL_PROTO_1(iemCImpl_out_DX_eAX, uint8_t, cbReg);
     4222IEM_CIMPL_PROTO_3(iemCImpl_in, uint16_t, u16Port, uint8_t, cbReg, uint8_t, bImmAndEffAddrMode);
     4223IEM_CIMPL_PROTO_2(iemCImpl_in_eAX_DX, uint8_t, cbReg, IEMMODE, enmEffAddrMode);
     4224IEM_CIMPL_PROTO_3(iemCImpl_out, uint16_t, u16Port, uint8_t, cbReg, uint8_t, bImmAndEffAddrMode);
     4225IEM_CIMPL_PROTO_2(iemCImpl_out_DX_eAX, uint8_t, cbReg, IEMMODE, enmEffAddrMode);
    42254226IEM_CIMPL_PROTO_0(iemCImpl_cli);
    42264227IEM_CIMPL_PROTO_0(iemCImpl_sti);
     
    42564257IEM_CIMPL_PROTO_3(iemCImpl_frstor, IEMMODE, enmEffOpSize, uint8_t, iEffSeg, RTGCPTR, GCPtrEffSrc);
    42574258IEM_CIMPL_PROTO_1(iemCImpl_fldcw, uint16_t, u16Fcw);
    4258 IEM_CIMPL_PROTO_1(iemCImpl_fxch_underflow, uint8_t, iStReg);
    4259 IEM_CIMPL_PROTO_3(iemCImpl_fcomi_fucomi, uint8_t, iStReg, PFNIEMAIMPLFPUR80EFL, pfnAImpl, bool, fPop);
     4259IEM_CIMPL_PROTO_2(iemCImpl_fxch_underflow, uint8_t, iStReg, uint16_t, uFpuOpcode);
     4260IEM_CIMPL_PROTO_3(iemCImpl_fcomi_fucomi, uint8_t, iStReg, PFNIEMAIMPLFPUR80EFL, pfnAImpl, uint32_t, uPopAndFpuOpcode);
    42604261/** @} */
    42614262
     
    44504451#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    44514452VBOXSTRICTRC    iemSvmVmexit(PVMCPUCC pVCpu, uint64_t uExitCode, uint64_t uExitInfo1, uint64_t uExitInfo2) RT_NOEXCEPT;
    4452 VBOXSTRICTRC    iemHandleSvmEventIntercept(PVMCPUCC pVCpu, uint8_t u8Vector, uint32_t fFlags, uint32_t uErr, uint64_t uCr2) RT_NOEXCEPT;
     4453VBOXSTRICTRC    iemHandleSvmEventIntercept(PVMCPUCC pVCpu, uint8_t cbInstr, uint8_t u8Vector, uint32_t fFlags, uint32_t uErr, uint64_t uCr2) RT_NOEXCEPT;
    44534454VBOXSTRICTRC    iemSvmHandleIOIntercept(PVMCPUCC pVCpu, uint16_t u16Port, SVMIOIOTYPE enmIoType, uint8_t cbReg,
    44544455                                        uint8_t cAddrSizeBits, uint8_t iEffSeg, bool fRep, bool fStrIo, uint8_t cbInstr) RT_NOEXCEPT;
    4455 VBOXSTRICTRC    iemSvmHandleMsrIntercept(PVMCPUCC pVCpu, uint32_t idMsr, bool fWrite) RT_NOEXCEPT;
     4456VBOXSTRICTRC    iemSvmHandleMsrIntercept(PVMCPUCC pVCpu, uint32_t idMsr, bool fWrite, uint8_t cbInstr) RT_NOEXCEPT;
    44564457IEM_CIMPL_PROTO_0(iemCImpl_vmrun);
    44574458IEM_CIMPL_PROTO_0(iemCImpl_vmload);
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