VirtualBox

Changeset 102587 in vbox


Ignore:
Timestamp:
Dec 12, 2023 2:13:35 PM (14 months ago)
Author:
vboxsync
Message:

VMM/IEM: Native translation of IEM_MC_SET_RIP_U16_AND_FINISH and friends. bugref:10371

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py

    r102585 r102587  
    7878    'IEM_MC_REL_JMP_S32_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  True,  ),
    7979
    80     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16':               (None, True,  False, ),
    81     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32':               (None, True,  False, ),
    82     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64':               (None, True,  False, ),
    83     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC16':               (None, True,  False, ),
    84     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32':               (None, True,  False, ),
    85     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64':               (None, True,  False, ),
    86     'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC32':               (None, True,  False, ),
    87     'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64':               (None, True,  False, ),
    88 
    89     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16_WITH_FLAGS':    (None, True,  False, ),
    90     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  False, ),
    91     'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  False, ),
    92     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC16_WITH_FLAGS':    (None, True,  False, ),
    93     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  False, ),
    94     'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  False, ),
    95     'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  False, ),
    96     'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  False, ),
     80    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16':               (None, True,  True, ),
     81    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32':               (None, True,  True, ),
     82    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64':               (None, True,  True, ),
     83    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC16':               (None, True,  True, ),
     84    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32':               (None, True,  True, ),
     85    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64':               (None, True,  True, ),
     86    'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC32':               (None, True,  True, ),
     87    'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64':               (None, True,  True, ),
     88
     89    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16_WITH_FLAGS':    (None, True,  True, ),
     90    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  True, ),
     91    'IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  True, ),
     92    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC16_WITH_FLAGS':    (None, True,  True, ),
     93    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  True, ),
     94    'IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  True, ),
     95    'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC32_WITH_FLAGS':    (None, True,  True, ),
     96    'IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64_WITH_FLAGS':    (None, True,  True, ),
    9797
    9898    'IEM_MC_CALC_RM_EFF_ADDR_THREADED_16':                       (None, False, True,  ),
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r102585 r102587  
    53305330    Assert(enmEffOpSize == IEMMODE_64BIT || enmEffOpSize == IEMMODE_16BIT);
    53315331
    5332     /* We speculatively modify PC and may raise #GP(0), so make sure the right value is in CPUMCTX. */
     5332    /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */
    53335333    off = iemNativeRegFlushPendingWrites(pReNative, off);
    53345334
     
    53925392    Assert(enmEffOpSize == IEMMODE_32BIT || enmEffOpSize == IEMMODE_16BIT);
    53935393
    5394     /* We speculatively modify PC and may raise #GP(0), so make sure the right value is in CPUMCTX. */
     5394    /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */
    53955395    off = iemNativeRegFlushPendingWrites(pReNative, off);
    53965396
     
    54435443                                                 uint8_t cbInstr, int32_t offDisp, uint8_t idxInstr)
    54445444{
    5445     /* We speculatively modify PC and may raise #GP(0), so make sure the right value is in CPUMCTX. */
     5445    /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */
    54465446    off = iemNativeRegFlushPendingWrites(pReNative, off);
    54475447
     
    54675467*********************************************************************************************************************************/
    54685468
    5469 /** Sets RIP (may trigger \#GP), finishes the instruction and returns. */
    5470 #define IEM_MC_SET_RIP_U16_AND_FINISH(a_u16NewIP)       return iemRegRipJumpU16AndFinishClearningRF((pVCpu), (a_u16NewIP))
    5471 /** Sets RIP (may trigger \#GP), finishes the instruction and returns. */
    5472 #define IEM_MC_SET_RIP_U32_AND_FINISH(a_u32NewIP)       return iemRegRipJumpU32AndFinishClearningRF((pVCpu), (a_u32NewIP))
    5473 /** Sets RIP (may trigger \#GP), finishes the instruction and returns. */
    5474 #define IEM_MC_SET_RIP_U64_AND_FINISH(a_u64NewIP)       return iemRegRipJumpU64AndFinishClearningRF((pVCpu), (a_u64NewIP))
     5469/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for pre-386 targets. */
     5470#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16(a_u16NewIP) \
     5471    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u16NewIP), false /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint16_t))
     5472
     5473/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for 386+ targets. */
     5474#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32(a_u16NewIP) \
     5475    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u16NewIP), false /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint16_t))
     5476
     5477/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for use in 64-bit code. */
     5478#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64(a_u16NewIP) \
     5479    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u16NewIP),  true /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint16_t))
     5480
     5481/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for pre-386 targets that checks and
     5482 *  clears flags. */
     5483#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16_WITH_FLAGS(a_u16NewIP) \
     5484    IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC16(a_u16NewIP); \
     5485    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5486
     5487/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for 386+ targets that checks and
     5488 *  clears flags. */
     5489#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_u16NewIP) \
     5490    IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC32(a_u16NewIP); \
     5491    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5492
     5493/** Variant of IEM_MC_SET_RIP_U16_AND_FINISH for use in 64-bit code that checks and
     5494 *  clears flags. */
     5495#define IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_u16NewIP) \
     5496    IEM_MC_SET_RIP_U16_AND_FINISH_THREADED_PC64(a_u16NewIP); \
     5497    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5498
     5499#undef IEM_MC_SET_RIP_U16_AND_FINISH
     5500
     5501
     5502/** Variant of IEM_MC_SET_RIP_U32_AND_FINISH for 386+ targets. */
     5503#define IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32(a_u32NewEIP) \
     5504    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u32NewEIP), false /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint32_t))
     5505
     5506/** Variant of IEM_MC_SET_RIP_U32_AND_FINISH for use in 64-bit code. */
     5507#define IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64(a_u32NewEIP) \
     5508    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u32NewEIP),  true /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint32_t))
     5509
     5510/** Variant of IEM_MC_SET_RIP_U32_AND_FINISH for 386+ targets that checks and
     5511 *  clears flags. */
     5512#define IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32_WITH_FLAGS(a_u32NewEIP) \
     5513    IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC32(a_u32NewEIP); \
     5514    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5515
     5516/** Variant of IEM_MC_SET_RIP_U32_AND_FINISH for use in 64-bit code that checks
     5517 *  and clears flags. */
     5518#define IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_u32NewEIP) \
     5519    IEM_MC_SET_RIP_U32_AND_FINISH_THREADED_PC64(a_u32NewEIP); \
     5520    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5521
     5522#undef IEM_MC_SET_RIP_U32_AND_FINISH
     5523
     5524
     5525/** Variant of IEM_MC_SET_RIP_U64_AND_FINISH for use in 64-bit code. */
     5526#define IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64(a_u64NewEIP) \
     5527    off = iemNativeEmitRipJumpNoFlags(pReNative, off, (a_u64NewEIP),  true /*f64Bit*/, pCallEntry->idxInstr, sizeof(uint64_t))
     5528
     5529/** Variant of IEM_MC_SET_RIP_U64_AND_FINISH for use in 64-bit code that checks
     5530 *  and clears flags. */
     5531#define IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64_WITH_FLAGS(a_u64NewEIP) \
     5532    IEM_MC_SET_RIP_U64_AND_FINISH_THREADED_PC64(a_u64NewEIP); \
     5533    off = iemNativeEmitFinishInstructionFlagsCheck(pReNative, off)
     5534
     5535#undef IEM_MC_SET_RIP_U64_AND_FINISH
     5536
     5537
     5538/** Same as iemRegRipJumpU16AndFinishNoFlags,
     5539 *  iemRegRipJumpU32AndFinishNoFlags and iemRegRipJumpU64AndFinishNoFlags. */
     5540DECL_INLINE_THROW(uint32_t)
     5541iemNativeEmitRipJumpNoFlags(PIEMRECOMPILERSTATE pReNative, uint32_t off, uint8_t idxVarPc, bool f64Bit,
     5542                            uint8_t idxInstr, uint8_t cbVar)
     5543{
     5544    IEMNATIVE_ASSERT_VAR_IDX(pReNative, idxVarPc);
     5545    Assert(pReNative->Core.aVars[idxVarPc].cbVar == cbVar);
     5546
     5547    /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */
     5548    off = iemNativeRegFlushPendingWrites(pReNative, off);
     5549
     5550    /* Get a register with the new PC loaded from idxVarPc.
     5551       Note! This ASSUMES that the high bits of the GPR is zeroed. */
     5552    uint8_t const idxPcReg = iemNativeVarRegisterAcquireForGuestReg(pReNative, idxVarPc, kIemNativeGstReg_Pc, &off);
     5553
     5554    /* Check limit (may #GP(0) + exit TB). */
     5555    if (!f64Bit)
     5556        off = iemNativeEmitCheckGpr32AgainstSegLimitMaybeRaiseGp0(pReNative, off, idxPcReg, X86_SREG_CS, idxInstr);
     5557    /* Check that the address is canonical, raising #GP(0) + exit TB if it isn't. */
     5558    else if (cbVar > sizeof(uint32_t))
     5559        off = iemNativeEmitCheckGprCanonicalMaybeRaiseGp0(pReNative, off, idxPcReg, idxInstr);
     5560
     5561    /* Store the result. */
     5562    off = iemNativeEmitStoreGprToVCpuU64(pReNative, off, idxPcReg, RT_UOFFSETOF(VMCPU, cpum.GstCtx.rip));
     5563
     5564    /** @todo implictly free the variable? */
     5565
     5566    return off;
     5567}
    54755568
    54765569
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r102558 r102587  
    824824
    825825DECL_HIDDEN_THROW(uint8_t)  iemNativeVarGetStackSlot(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar);
     826DECL_HIDDEN_THROW(uint8_t)  iemNativeVarRegisterAcquireForGuestReg(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar,
     827                                                                   IEMNATIVEGSTREG enmGstReg, uint32_t *poff);
    826828
    827829DECL_HIDDEN_THROW(uint32_t) iemNativeEmitLoadGprWithGstShadowReg(PIEMRECOMPILERSTATE pReNative, uint32_t off,
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