VirtualBox

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


Ignore:
Timestamp:
Jul 15, 2023 1:20:13 AM (20 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158421
Message:

VMM/IEM: Must pass the FPU opcode word to the various MCs updating FOP as IEMCPU::uFpuOpcode isn't available during recompiled code execution. bugref:10369

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

Legend:

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

    r100266 r100591  
    28432843
    28442844
    2845 #ifndef IEM_WITH_OPAQUE_DECODER_STATE
    2846 /**
    2847  * Updates the FOP, FPU.CS and FPUIP registers.
    2848  *
    2849  * @param   pVCpu               The cross context virtual CPU structure of the calling thread.
    2850  * @param   pFpuCtx             The FPU context.
    2851  */
    2852 DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PVMCPUCC pVCpu, PX86FXSTATE pFpuCtx) RT_NOEXCEPT
    2853 {
    2854     Assert(pVCpu->iem.s.uFpuOpcode != UINT16_MAX);
    2855     iemFpuUpdateOpcodeAndIpWorkerEx(pVCpu, pFpuCtx, pVCpu->iem.s.uFpuOpcode);
    2856 }
    2857 #endif /* !IEM_WITH_OPAQUE_DECODER_STATE */
    2858 
    2859 
    28602845/**
    28612846 * Marks the specified stack register as free (for FFREE).
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r100305 r100591  
    42564256/** @name FPU access and helpers.
    42574257 * @{ */
    4258 void            iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult) RT_NOEXCEPT;
    4259 void            iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4260 void            iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult) RT_NOEXCEPT;
    4261 void            iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg) RT_NOEXCEPT;
    4262 void            iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg) RT_NOEXCEPT;
     4258void            iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4259void            iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4260void            iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4261void            iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4262void            iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT;
    42634263void            iemFpuStoreResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg,
    4264                                            uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
     4264                                           uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
    42654265void            iemFpuStoreResultWithMemOpThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg,
    4266                                                   uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4267 void            iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu) RT_NOEXCEPT;
    4268 void            iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT;
    4269 void            iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT;
    4270 void            iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4271 void            iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW) RT_NOEXCEPT;
    4272 void            iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4273 void            iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg) RT_NOEXCEPT;
    4274 void            iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4275 void            iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg) RT_NOEXCEPT;
    4276 void            iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
    4277 void            iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu) RT_NOEXCEPT;
    4278 void            iemFpuStackPushUnderflow(PVMCPUCC pVCpu) RT_NOEXCEPT;
    4279 void            iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu) RT_NOEXCEPT;
    4280 void            iemFpuStackPushOverflow(PVMCPUCC pVCpu) RT_NOEXCEPT;
    4281 void            iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff) RT_NOEXCEPT;
     4266                                                  uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4267void            iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4268void            iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4269void            iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4270void            iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4271void            iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4272void            iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4273void            iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4274void            iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4275void            iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4276void            iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4277void            iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4278void            iemFpuStackPushUnderflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4279void            iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4280void            iemFpuStackPushOverflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT;
     4281void            iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT;
    42824282/** @} */
    42834283
  • trunk/src/VBox/VMM/include/IEMMc.h

    r100579 r100591  
    14651465
    14661466/** Pushes FPU result onto the stack. */
    1467 #define IEM_MC_PUSH_FPU_RESULT(a_FpuData) \
    1468     iemFpuPushResult(pVCpu, &a_FpuData)
     1467#define IEM_MC_PUSH_FPU_RESULT(a_FpuData, a_uFpuOpcode) \
     1468    iemFpuPushResult(pVCpu, &a_FpuData, a_uFpuOpcode)
    14691469/** Pushes FPU result onto the stack and sets the FPUDP. */
    1470 #define IEM_MC_PUSH_FPU_RESULT_MEM_OP(a_FpuData, a_iEffSeg, a_GCPtrEff) \
    1471     iemFpuPushResultWithMemOp(pVCpu, &a_FpuData, a_iEffSeg, a_GCPtrEff)
     1470#define IEM_MC_PUSH_FPU_RESULT_MEM_OP(a_FpuData, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1471    iemFpuPushResultWithMemOp(pVCpu, &a_FpuData, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    14721472
    14731473/** Replaces ST0 with value one and pushes value 2 onto the FPU stack. */
    1474 #define IEM_MC_PUSH_FPU_RESULT_TWO(a_FpuDataTwo) \
    1475     iemFpuPushResultTwo(pVCpu, &a_FpuDataTwo)
     1474#define IEM_MC_PUSH_FPU_RESULT_TWO(a_FpuDataTwo, a_uFpuOpcode) \
     1475    iemFpuPushResultTwo(pVCpu, &a_FpuDataTwo, a_uFpuOpcode)
    14761476
    14771477/** Stores FPU result in a stack register. */
    1478 #define IEM_MC_STORE_FPU_RESULT(a_FpuData, a_iStReg) \
    1479     iemFpuStoreResult(pVCpu, &a_FpuData, a_iStReg)
     1478#define IEM_MC_STORE_FPU_RESULT(a_FpuData, a_iStReg, a_uFpuOpcode) \
     1479    iemFpuStoreResult(pVCpu, &a_FpuData, a_iStReg, a_uFpuOpcode)
    14801480/** Stores FPU result in a stack register and pops the stack. */
    1481 #define IEM_MC_STORE_FPU_RESULT_THEN_POP(a_FpuData, a_iStReg) \
    1482     iemFpuStoreResultThenPop(pVCpu, &a_FpuData, a_iStReg)
     1481#define IEM_MC_STORE_FPU_RESULT_THEN_POP(a_FpuData, a_iStReg, a_uFpuOpcode) \
     1482    iemFpuStoreResultThenPop(pVCpu, &a_FpuData, a_iStReg, a_uFpuOpcode)
    14831483/** Stores FPU result in a stack register and sets the FPUDP. */
    1484 #define IEM_MC_STORE_FPU_RESULT_MEM_OP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff) \
    1485     iemFpuStoreResultWithMemOp(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
     1484#define IEM_MC_STORE_FPU_RESULT_MEM_OP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1485    iemFpuStoreResultWithMemOp(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    14861486/** Stores FPU result in a stack register, sets the FPUDP, and pops the
    14871487 *  stack. */
    1488 #define IEM_MC_STORE_FPU_RESULT_WITH_MEM_OP_THEN_POP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff) \
    1489     iemFpuStoreResultWithMemOpThenPop(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff)
     1488#define IEM_MC_STORE_FPU_RESULT_WITH_MEM_OP_THEN_POP(a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1489    iemFpuStoreResultWithMemOpThenPop(pVCpu, &a_FpuData, a_iStReg, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    14901490
    14911491/** Only update the FOP, FPUIP, and FPUCS. (For FNOP.) */
    1492 #define IEM_MC_UPDATE_FPU_OPCODE_IP() \
    1493     iemFpuUpdateOpcodeAndIp(pVCpu)
     1492#define IEM_MC_UPDATE_FPU_OPCODE_IP(a_uFpuOpcode) \
     1493    iemFpuUpdateOpcodeAndIp(pVCpu, a_uFpuOpcode)
    14941494/** Free a stack register (for FFREE and FFREEP). */
    14951495#define IEM_MC_FPU_STACK_FREE(a_iStReg) \
     
    15031503
    15041504/** Updates the FSW, FOP, FPUIP, and FPUCS. */
    1505 #define IEM_MC_UPDATE_FSW(a_u16FSW) \
    1506     iemFpuUpdateFSW(pVCpu, a_u16FSW)
     1505#define IEM_MC_UPDATE_FSW(a_u16FSW, a_uFpuOpcode) \
     1506    iemFpuUpdateFSW(pVCpu, a_u16FSW, a_uFpuOpcode)
    15071507/** Updates the FSW with a constant value as well as FOP, FPUIP, and FPUCS. */
    1508 #define IEM_MC_UPDATE_FSW_CONST(a_u16FSW) \
    1509     iemFpuUpdateFSW(pVCpu, a_u16FSW)
     1508#define IEM_MC_UPDATE_FSW_CONST(a_u16FSW, a_uFpuOpcode) \
     1509    iemFpuUpdateFSW(pVCpu, a_u16FSW, a_uFpuOpcode)
    15101510/** Updates the FSW, FOP, FPUIP, FPUCS, FPUDP, and FPUDS. */
    1511 #define IEM_MC_UPDATE_FSW_WITH_MEM_OP(a_u16FSW, a_iEffSeg, a_GCPtrEff) \
    1512     iemFpuUpdateFSWWithMemOp(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
     1511#define IEM_MC_UPDATE_FSW_WITH_MEM_OP(a_u16FSW, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1512    iemFpuUpdateFSWWithMemOp(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    15131513/** Updates the FSW, FOP, FPUIP, and FPUCS, and then pops the stack. */
    1514 #define IEM_MC_UPDATE_FSW_THEN_POP(a_u16FSW) \
    1515     iemFpuUpdateFSWThenPop(pVCpu, a_u16FSW)
     1514#define IEM_MC_UPDATE_FSW_THEN_POP(a_u16FSW, a_uFpuOpcode) \
     1515    iemFpuUpdateFSWThenPop(pVCpu, a_u16FSW, a_uFpuOpcode)
    15161516/** Updates the FSW, FOP, FPUIP, FPUCS, FPUDP and FPUDS, and then pops the
    15171517 *  stack. */
    1518 #define IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(a_u16FSW, a_iEffSeg, a_GCPtrEff) \
    1519     iemFpuUpdateFSWWithMemOpThenPop(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff)
     1518#define IEM_MC_UPDATE_FSW_WITH_MEM_OP_THEN_POP(a_u16FSW, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1519    iemFpuUpdateFSWWithMemOpThenPop(pVCpu, a_u16FSW, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    15201520/** Updates the FSW, FOP, FPUIP, and FPUCS, and then pops the stack twice. */
    1521 #define IEM_MC_UPDATE_FSW_THEN_POP_POP(a_u16FSW) \
    1522     iemFpuUpdateFSWThenPopPop(pVCpu, a_u16FSW)
     1521#define IEM_MC_UPDATE_FSW_THEN_POP_POP(a_u16FSW, a_uFpuOpcode) \
     1522    iemFpuUpdateFSWThenPopPop(pVCpu, a_u16FSW, a_uFpuOpcode)
    15231523
    15241524/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. */
    1525 #define IEM_MC_FPU_STACK_UNDERFLOW(a_iStDst) \
    1526     iemFpuStackUnderflow(pVCpu, a_iStDst)
     1525#define IEM_MC_FPU_STACK_UNDERFLOW(a_iStDst, a_uFpuOpcode) \
     1526    iemFpuStackUnderflow(pVCpu, a_iStDst, a_uFpuOpcode)
    15271527/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. Pops
    15281528 *  stack. */
    1529 #define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(a_iStDst) \
    1530     iemFpuStackUnderflowThenPop(pVCpu, a_iStDst)
     1529#define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP(a_iStDst, a_uFpuOpcode) \
     1530    iemFpuStackUnderflowThenPop(pVCpu, a_iStDst, a_uFpuOpcode)
    15311531/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS, FOP, FPUDP and
    15321532 *  FPUDS. */
    1533 #define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(a_iStDst, a_iEffSeg, a_GCPtrEff) \
    1534     iemFpuStackUnderflowWithMemOp(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
     1533#define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP(a_iStDst, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1534    iemFpuStackUnderflowWithMemOp(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    15351535/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS, FOP, FPUDP and
    15361536 *  FPUDS. Pops stack. */
    1537 #define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(a_iStDst, a_iEffSeg, a_GCPtrEff) \
    1538     iemFpuStackUnderflowWithMemOpThenPop(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff)
     1537#define IEM_MC_FPU_STACK_UNDERFLOW_MEM_OP_THEN_POP(a_iStDst, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1538    iemFpuStackUnderflowWithMemOpThenPop(pVCpu, a_iStDst, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    15391539/** Raises a FPU stack underflow exception.  Sets FPUIP, FPUCS and FOP. Pops
    15401540 *  stack twice. */
    1541 #define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP() \
    1542     iemFpuStackUnderflowThenPopPop(pVCpu)
     1541#define IEM_MC_FPU_STACK_UNDERFLOW_THEN_POP_POP(a_uFpuOpcode) \
     1542    iemFpuStackUnderflowThenPopPop(pVCpu, a_uFpuOpcode)
    15431543/** Raises a FPU stack underflow exception for an instruction pushing a result
    15441544 *  value onto the stack. Sets FPUIP, FPUCS and FOP. */
    1545 #define IEM_MC_FPU_STACK_PUSH_UNDERFLOW() \
    1546     iemFpuStackPushUnderflow(pVCpu)
     1545#define IEM_MC_FPU_STACK_PUSH_UNDERFLOW(a_uFpuOpcode) \
     1546    iemFpuStackPushUnderflow(pVCpu, a_uFpuOpcode)
    15471547/** Raises a FPU stack underflow exception for an instruction pushing a result
    15481548 *  value onto the stack and replacing ST0. Sets FPUIP, FPUCS and FOP. */
    1549 #define IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO() \
    1550     iemFpuStackPushUnderflowTwo(pVCpu)
     1549#define IEM_MC_FPU_STACK_PUSH_UNDERFLOW_TWO(a_uFpuOpcode) \
     1550    iemFpuStackPushUnderflowTwo(pVCpu, a_uFpuOpcode)
    15511551
    15521552/** Raises a FPU stack overflow exception as part of a push attempt.  Sets
    15531553 *  FPUIP, FPUCS and FOP. */
    1554 #define IEM_MC_FPU_STACK_PUSH_OVERFLOW() \
    1555     iemFpuStackPushOverflow(pVCpu)
     1554#define IEM_MC_FPU_STACK_PUSH_OVERFLOW(a_uFpuOpcode) \
     1555    iemFpuStackPushOverflow(pVCpu, a_uFpuOpcode)
    15561556/** Raises a FPU stack overflow exception as part of a push attempt.  Sets
    15571557 *  FPUIP, FPUCS, FOP, FPUDP and FPUDS. */
    1558 #define IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(a_iEffSeg, a_GCPtrEff) \
    1559     iemFpuStackPushOverflowWithMemOp(pVCpu, a_iEffSeg, a_GCPtrEff)
     1558#define IEM_MC_FPU_STACK_PUSH_OVERFLOW_MEM_OP(a_iEffSeg, a_GCPtrEff, a_uFpuOpcode) \
     1559    iemFpuStackPushOverflowWithMemOp(pVCpu, a_iEffSeg, a_GCPtrEff, a_uFpuOpcode)
    15601560/** Prepares for using the FPU state.
    15611561 * Ensures that we can use the host FPU in the current context (RC+R0.
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette