Changeset 102587 in vbox
- Timestamp:
- Dec 12, 2023 2:13:35 PM (14 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllN8vePython.py
r102585 r102587 78 78 'IEM_MC_REL_JMP_S32_AND_FINISH_THREADED_PC64_WITH_FLAGS': (None, True, True, ), 79 79 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, ), 97 97 98 98 'IEM_MC_CALC_RM_EFF_ADDR_THREADED_16': (None, False, True, ), -
trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp
r102585 r102587 5330 5330 Assert(enmEffOpSize == IEMMODE_64BIT || enmEffOpSize == IEMMODE_16BIT); 5331 5331 5332 /* We speculatively modify PC and may raise #GP(0), so make sure the right value isin CPUMCTX. */5332 /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */ 5333 5333 off = iemNativeRegFlushPendingWrites(pReNative, off); 5334 5334 … … 5392 5392 Assert(enmEffOpSize == IEMMODE_32BIT || enmEffOpSize == IEMMODE_16BIT); 5393 5393 5394 /* We speculatively modify PC and may raise #GP(0), so make sure the right value isin CPUMCTX. */5394 /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */ 5395 5395 off = iemNativeRegFlushPendingWrites(pReNative, off); 5396 5396 … … 5443 5443 uint8_t cbInstr, int32_t offDisp, uint8_t idxInstr) 5444 5444 { 5445 /* We speculatively modify PC and may raise #GP(0), so make sure the right value isin CPUMCTX. */5445 /* We speculatively modify PC and may raise #GP(0), so make sure the right values are in CPUMCTX. */ 5446 5446 off = iemNativeRegFlushPendingWrites(pReNative, off); 5447 5447 … … 5467 5467 *********************************************************************************************************************************/ 5468 5468 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. */ 5540 DECL_INLINE_THROW(uint32_t) 5541 iemNativeEmitRipJumpNoFlags(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 } 5475 5568 5476 5569 -
trunk/src/VBox/VMM/include/IEMN8veRecompiler.h
r102558 r102587 824 824 825 825 DECL_HIDDEN_THROW(uint8_t) iemNativeVarGetStackSlot(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar); 826 DECL_HIDDEN_THROW(uint8_t) iemNativeVarRegisterAcquireForGuestReg(PIEMRECOMPILERSTATE pReNative, uint8_t idxVar, 827 IEMNATIVEGSTREG enmGstReg, uint32_t *poff); 826 828 827 829 DECL_HIDDEN_THROW(uint32_t) iemNativeEmitLoadGprWithGstShadowReg(PIEMRECOMPILERSTATE pReNative, uint32_t off,
Note:
See TracChangeset
for help on using the changeset viewer.