VirtualBox

Changeset 89974 in vbox for trunk


Ignore:
Timestamp:
Jun 30, 2021 11:02:04 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145433
Message:

IEM: Added IEMExecOneIgnoreLock for use with split-lock cases. bugref:10052

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/iem.h

    r82968 r89974  
    288288                                                                      const void *pvOpcodeBytes, size_t cbOpcodeBytes,
    289289                                                                      uint32_t *pcbWritten);
     290VMMDECL(VBOXSTRICTRC)       IEMExecOneIgnoreLock(PVMCPUCC pVCpu);
    290291VMMDECL(VBOXSTRICTRC)       IEMExecLots(PVMCPUCC pVCpu, uint32_t cMaxInstructions, uint32_t cPollRate, uint32_t *pcInstructions);
    291292/** Statistics returned by IEMExecForExits. */
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r89973 r89974  
    11941194 *                              calling thread.
    11951195 * @param   fBypassHandlers     Whether to bypass access handlers.
    1196  */
    1197 DECLINLINE(void) iemInitDecoder(PVMCPUCC pVCpu, bool fBypassHandlers)
     1196 * @param   fDisregardLock      Whether to disregard the LOCK prefix.
     1197 */
     1198DECLINLINE(void) iemInitDecoder(PVMCPUCC pVCpu, bool fBypassHandlers, bool fDisregardLock)
    11981199{
    11991200    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK);
     
    12501251    pVCpu->iem.s.rcPassUp           = VINF_SUCCESS;
    12511252    pVCpu->iem.s.fBypassHandlers    = fBypassHandlers;
     1253    pVCpu->iem.s.fDisregardLock     = fDisregardLock;
    12521254
    12531255#ifdef DBGFTRACE_ENABLED
     
    13761378 *                              calling thread.
    13771379 * @param   fBypassHandlers     Whether to bypass access handlers.
    1378  */
    1379 IEM_STATIC VBOXSTRICTRC iemInitDecoderAndPrefetchOpcodes(PVMCPUCC pVCpu, bool fBypassHandlers)
    1380 {
    1381     iemInitDecoder(pVCpu, fBypassHandlers);
     1380 * @param   fDisregardLock      Whether to disregard LOCK prefixes.
     1381 *
     1382 * @todo    Combine fDisregardLock and fBypassHandlers into a flag parameter and
     1383 *          store them as such.
     1384 */
     1385IEM_STATIC VBOXSTRICTRC iemInitDecoderAndPrefetchOpcodes(PVMCPUCC pVCpu, bool fBypassHandlers, bool fDisregardLock)
     1386{
     1387    iemInitDecoder(pVCpu, fBypassHandlers, fDisregardLock);
    13821388
    13831389#ifdef IEM_WITH_CODE_TLB
     
    81498155        if (   (fAccess & IEM_ACCESS_TYPE_WRITE)
    81508156            && !(fFlags & X86_PTE_RW)
    8151             && (       (pVCpu->iem.s.uCpl == 3
     8157            && (   (    pVCpu->iem.s.uCpl == 3
    81528158                    && !(fAccess & IEM_ACCESS_WHAT_SYS))
    81538159                || (pVCpu->cpum.GstCtx.cr0 & X86_CR0_WP)))
     
    1404214048        && EMIsInhibitInterruptsActive(pVCpu))
    1404314049    {
    14044         rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, pVCpu->iem.s.fBypassHandlers);
     14050        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, pVCpu->iem.s.fBypassHandlers, pVCpu->iem.s.fDisregardLock);
    1404514051        if (rcStrict == VINF_SUCCESS)
    1404614052        {
     
    1410414110     * Do the decoding and emulation.
    1410514111     */
    14106     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
     14112    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, false);
    1410714113    if (rcStrict == VINF_SUCCESS)
    1410814114        rcStrict = iemExecOneInner(pVCpu, true, "IEMExecOne");
     
    1412214128
    1412314129    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
    14124     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
     14130    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, false);
    1412514131    if (rcStrict == VINF_SUCCESS)
    1412614132    {
     
    1414514151        && pVCpu->cpum.GstCtx.rip == OpcodeBytesPC)
    1414614152    {
    14147         iemInitDecoder(pVCpu, false);
     14153        iemInitDecoder(pVCpu, false, false);
    1414814154#ifdef IEM_WITH_CODE_TLB
    1414914155        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     
    1415914165    }
    1416014166    else
    14161         rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
     14167        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, false);
    1416214168    if (rcStrict == VINF_SUCCESS)
    1416314169        rcStrict = iemExecOneInner(pVCpu, true, "IEMExecOneWithPrefetchedByPC");
     
    1417414180
    1417514181    uint32_t const cbOldWritten = pVCpu->iem.s.cbWritten;
    14176     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
     14182    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true, false);
    1417714183    if (rcStrict == VINF_SUCCESS)
    1417814184    {
     
    1419714203        && pVCpu->cpum.GstCtx.rip == OpcodeBytesPC)
    1419814204    {
    14199         iemInitDecoder(pVCpu, true);
     14205        iemInitDecoder(pVCpu, true, false);
    1420014206#ifdef IEM_WITH_CODE_TLB
    1420114207        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     
    1421114217    }
    1421214218    else
    14213         rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
     14219        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true, false);
    1421414220    if (rcStrict == VINF_SUCCESS)
    1421514221        rcStrict = iemExecOneInner(pVCpu, false, "IEMExecOneBypassWithPrefetchedByPC");
     
    1424514251        && pVCpu->cpum.GstCtx.rip == OpcodeBytesPC)
    1424614252    {
    14247         iemInitDecoder(pVCpu, true);
     14253        iemInitDecoder(pVCpu, true, false);
    1424814254#ifdef IEM_WITH_CODE_TLB
    1424914255        pVCpu->iem.s.uInstrBufPc      = OpcodeBytesPC;
     
    1425914265    }
    1426014266    else
    14261         rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true);
     14267        rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, true, false);
    1426214268    if (rcStrict == VINF_SUCCESS)
    1426314269    {
     
    1426914275        iemMemRollback(pVCpu);
    1427014276
     14277    return rcStrict;
     14278}
     14279
     14280
     14281/**
     14282 * For handling split cacheline lock operations when the host has split-lock
     14283 * detection enabled.
     14284 *
     14285 * This will cause the interpreter to disregard the lock prefix and implicit
     14286 * locking (xchg).
     14287 *
     14288 * @returns Strict VBox status code.
     14289 * @param   pVCpu   The cross context virtual CPU structure of the calling EMT.
     14290 */
     14291VMMDECL(VBOXSTRICTRC) IEMExecOneIgnoreLock(PVMCPUCC pVCpu)
     14292{
     14293    /*
     14294     * Do the decoding and emulation.
     14295     */
     14296    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, true /*fDisregardLock*/);
     14297    if (rcStrict == VINF_SUCCESS)
     14298        rcStrict = iemExecOneInner(pVCpu, true, "IEMExecOneIgnoreLock");
     14299    else if (pVCpu->iem.s.cActiveMappings > 0)
     14300        iemMemRollback(pVCpu);
     14301
     14302    if (rcStrict != VINF_SUCCESS)
     14303        LogFlow(("IEMExecOneIgnoreLock: cs:rip=%04x:%08RX64 ss:rsp=%04x:%08RX64 EFL=%06x - rcStrict=%Rrc\n",
     14304                 pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.rsp, pVCpu->cpum.GstCtx.eflags.u, VBOXSTRICTRC_VAL(rcStrict)));
    1427114305    return rcStrict;
    1427214306}
     
    1432814362     * Initial decoder init w/ prefetch, then setup setjmp.
    1432914363     */
    14330     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
     14364    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, false);
    1433114365    if (rcStrict == VINF_SUCCESS)
    1433214366    {
     
    1447114505     * Initial decoder init w/ prefetch, then setup setjmp.
    1447214506     */
    14473     VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false);
     14507    VBOXSTRICTRC rcStrict = iemInitDecoderAndPrefetchOpcodes(pVCpu, false, false);
    1447414508    if (rcStrict == VINF_SUCCESS)
    1447514509    {
     
    1462814662                                         uint8_t cbInstr)
    1462914663{
    14630     iemInitDecoder(pVCpu, false);
     14664    iemInitDecoder(pVCpu, false, false);
    1463114665#ifdef DBGFTRACE_ENABLED
    1463214666    RTTraceBufAddMsgF(pVCpu->CTX_SUFF(pVM)->CTX_SUFF(hTraceBuf), "IEMInjectTrap: %x %d %x %llx",
  • trunk/src/VBox/VMM/VMMAll/IEMAllAImpl.asm

    r87740 r89974  
    581581;
    582582BEGINCODE
    583 BEGINPROC_FASTCALL iemAImpl_xchg_u8, 8
     583BEGINPROC_FASTCALL iemAImpl_xchg_u8_locked, 8
    584584        PROLOGUE_2_ARGS
    585585        mov     T0_8, [A1]
     
    587587        mov     [A1], T0_8
    588588        EPILOGUE_2_ARGS
    589 ENDPROC iemAImpl_xchg_u8
    590 
    591 BEGINPROC_FASTCALL iemAImpl_xchg_u16, 8
     589ENDPROC iemAImpl_xchg_u8_locked
     590
     591BEGINPROC_FASTCALL iemAImpl_xchg_u16_locked, 8
    592592        PROLOGUE_2_ARGS
    593593        mov     T0_16, [A1]
     
    595595        mov     [A1], T0_16
    596596        EPILOGUE_2_ARGS
    597 ENDPROC iemAImpl_xchg_u16
    598 
    599 BEGINPROC_FASTCALL iemAImpl_xchg_u32, 8
     597ENDPROC iemAImpl_xchg_u16_locked
     598
     599BEGINPROC_FASTCALL iemAImpl_xchg_u32_locked, 8
    600600        PROLOGUE_2_ARGS
    601601        mov     T0_32, [A1]
     
    603603        mov     [A1], T0_32
    604604        EPILOGUE_2_ARGS
    605 ENDPROC iemAImpl_xchg_u32
     605ENDPROC iemAImpl_xchg_u32_locked
    606606
    607607%ifdef RT_ARCH_AMD64
    608 BEGINPROC_FASTCALL iemAImpl_xchg_u64, 8
     608BEGINPROC_FASTCALL iemAImpl_xchg_u64_locked, 8
    609609        PROLOGUE_2_ARGS
    610610        mov     T0, [A1]
     
    612612        mov     [A1], T0
    613613        EPILOGUE_2_ARGS
    614 ENDPROC iemAImpl_xchg_u64
     614ENDPROC iemAImpl_xchg_u64_locked
     615%endif
     616
     617; Unlocked variants for fDisregardLock mode.
     618
     619BEGINPROC_FASTCALL iemAImpl_xchg_u8_unlocked, 8
     620        PROLOGUE_2_ARGS
     621        mov     T0_8, [A1]
     622        mov     T1_8, [A0]
     623        mov     [A0], T0_8
     624        mov     [A1], T1_8
     625        EPILOGUE_2_ARGS
     626ENDPROC iemAImpl_xchg_u8_unlocked
     627
     628BEGINPROC_FASTCALL iemAImpl_xchg_u16_unlocked, 8
     629        PROLOGUE_2_ARGS
     630        mov     T0_16, [A1]
     631        mov     T1_16, [A0]
     632        mov     [A0], T0_16
     633        mov     [A1], T1_16
     634        EPILOGUE_2_ARGS
     635ENDPROC iemAImpl_xchg_u16_unlocked
     636
     637BEGINPROC_FASTCALL iemAImpl_xchg_u32_unlocked, 8
     638        PROLOGUE_2_ARGS
     639        mov     T0_32, [A1]
     640        mov     T1_32, [A0]
     641        mov     [A0], T0_32
     642        mov     [A1], T1_32
     643        EPILOGUE_2_ARGS
     644ENDPROC iemAImpl_xchg_u32_unlocked
     645
     646%ifdef RT_ARCH_AMD64
     647BEGINPROC_FASTCALL iemAImpl_xchg_u64_unlocked, 8
     648        PROLOGUE_2_ARGS
     649        mov     T0, [A1]
     650        mov     T1, [A0]
     651        mov     [A0], T0
     652        mov     [A1], T1
     653        EPILOGUE_2_ARGS
     654ENDPROC iemAImpl_xchg_u64_unlocked
    615655%endif
    616656
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r84476 r89974  
    36243624        IEM_MC_MEM_MAP(pu8Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    36253625        IEM_MC_REF_GREG_U8(pu8Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    3626         IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u8, pu8Mem, pu8Reg);
     3626        if (!pVCpu->iem.s.fDisregardLock)
     3627            IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u8_locked, pu8Mem, pu8Reg);
     3628        else
     3629            IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u8_unlocked, pu8Mem, pu8Reg);
    36273630        IEM_MC_MEM_COMMIT_AND_UNMAP(pu8Mem, IEM_ACCESS_DATA_RW);
    36283631
     
    37133716                IEM_MC_MEM_MAP(pu16Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    37143717                IEM_MC_REF_GREG_U16(pu16Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    3715                 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16, pu16Mem, pu16Reg);
     3718                if (!pVCpu->iem.s.fDisregardLock)
     3719                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16_unlocked, pu16Mem, pu16Reg);
     3720                else
     3721                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u16_unlocked, pu16Mem, pu16Reg);
    37163722                IEM_MC_MEM_COMMIT_AND_UNMAP(pu16Mem, IEM_ACCESS_DATA_RW);
    37173723
     
    37293735                IEM_MC_MEM_MAP(pu32Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    37303736                IEM_MC_REF_GREG_U32(pu32Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    3731                 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32, pu32Mem, pu32Reg);
     3737                if (!pVCpu->iem.s.fDisregardLock)
     3738                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32_locked, pu32Mem, pu32Reg);
     3739                else
     3740                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u32_unlocked, pu32Mem, pu32Reg);
    37323741                IEM_MC_MEM_COMMIT_AND_UNMAP(pu32Mem, IEM_ACCESS_DATA_RW);
    37333742
     
    37463755                IEM_MC_MEM_MAP(pu64Mem, IEM_ACCESS_DATA_RW, pVCpu->iem.s.iEffSeg, GCPtrEffDst, 0 /*arg*/);
    37473756                IEM_MC_REF_GREG_U64(pu64Reg, ((bRm >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK) | pVCpu->iem.s.uRexReg);
    3748                 IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64, pu64Mem, pu64Reg);
     3757                if (!pVCpu->iem.s.fDisregardLock)
     3758                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64_locked, pu64Mem, pu64Reg);
     3759                else
     3760                    IEM_MC_CALL_VOID_AIMPL_2(iemAImpl_xchg_u64_unlocked, pu64Mem, pu64Reg);
    37493761                IEM_MC_MEM_COMMIT_AND_UNMAP(pu64Mem, IEM_ACCESS_DATA_RW);
    37503762
     
    1059210604{
    1059310605    IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE("lock");
    10594     pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_LOCK;
     10606    if (!pVCpu->iem.s.fDisregardLock)
     10607        pVCpu->iem.s.fPrefixes |= IEM_OP_PRF_LOCK;
    1059510608
    1059610609    uint8_t b; IEM_OPCODE_GET_NEXT_U8(&b);
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