Changeset 100591 in vbox for trunk/src/VBox/VMM/include
- Timestamp:
- Jul 15, 2023 1:20:13 AM (20 months ago)
- svn:sync-xref-src-repo-rev:
- 158421
- Location:
- trunk/src/VBox/VMM/include
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/include/IEMInline.h
r100266 r100591 2843 2843 2844 2844 2845 #ifndef IEM_WITH_OPAQUE_DECODER_STATE2846 /**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_NOEXCEPT2853 {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 2860 2845 /** 2861 2846 * Marks the specified stack register as free (for FFREE). -
trunk/src/VBox/VMM/include/IEMInternal.h
r100305 r100591 4256 4256 /** @name FPU access and helpers. 4257 4257 * @{ */ 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;4258 void iemFpuPushResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint16_t uFpuOpcode) RT_NOEXCEPT; 4259 void iemFpuPushResultWithMemOp(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4260 void iemFpuPushResultTwo(PVMCPUCC pVCpu, PIEMFPURESULTTWO pResult, uint16_t uFpuOpcode) RT_NOEXCEPT; 4261 void iemFpuStoreResult(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT; 4262 void iemFpuStoreResultThenPop(PVMCPUCC pVCpu, PIEMFPURESULT pResult, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT; 4263 4263 void 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; 4265 4265 void 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; 4267 void iemFpuUpdateOpcodeAndIp(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT; 4268 void iemFpuUpdateFSW(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT; 4269 void iemFpuUpdateFSWThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT; 4270 void iemFpuUpdateFSWWithMemOp(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4271 void iemFpuUpdateFSWThenPopPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint16_t uFpuOpcode) RT_NOEXCEPT; 4272 void iemFpuUpdateFSWWithMemOpThenPop(PVMCPUCC pVCpu, uint16_t u16FSW, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4273 void iemFpuStackUnderflow(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT; 4274 void iemFpuStackUnderflowWithMemOp(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4275 void iemFpuStackUnderflowThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint16_t uFpuOpcode) RT_NOEXCEPT; 4276 void iemFpuStackUnderflowWithMemOpThenPop(PVMCPUCC pVCpu, uint8_t iStReg, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4277 void iemFpuStackUnderflowThenPopPop(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT; 4278 void iemFpuStackPushUnderflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT; 4279 void iemFpuStackPushUnderflowTwo(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT; 4280 void iemFpuStackPushOverflow(PVMCPUCC pVCpu, uint16_t uFpuOpcode) RT_NOEXCEPT; 4281 void iemFpuStackPushOverflowWithMemOp(PVMCPUCC pVCpu, uint8_t iEffSeg, RTGCPTR GCPtrEff, uint16_t uFpuOpcode) RT_NOEXCEPT; 4282 4282 /** @} */ 4283 4283 -
trunk/src/VBox/VMM/include/IEMMc.h
r100579 r100591 1465 1465 1466 1466 /** 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) 1469 1469 /** 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) 1472 1472 1473 1473 /** 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) 1476 1476 1477 1477 /** 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) 1480 1480 /** 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) 1483 1483 /** 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) 1486 1486 /** Stores FPU result in a stack register, sets the FPUDP, and pops the 1487 1487 * 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) 1490 1490 1491 1491 /** 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) 1494 1494 /** Free a stack register (for FFREE and FFREEP). */ 1495 1495 #define IEM_MC_FPU_STACK_FREE(a_iStReg) \ … … 1503 1503 1504 1504 /** 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) 1507 1507 /** 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) 1510 1510 /** 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) 1513 1513 /** 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) 1516 1516 /** Updates the FSW, FOP, FPUIP, FPUCS, FPUDP and FPUDS, and then pops the 1517 1517 * 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) 1520 1520 /** 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) 1523 1523 1524 1524 /** 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) 1527 1527 /** Raises a FPU stack underflow exception. Sets FPUIP, FPUCS and FOP. Pops 1528 1528 * 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) 1531 1531 /** Raises a FPU stack underflow exception. Sets FPUIP, FPUCS, FOP, FPUDP and 1532 1532 * 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) 1535 1535 /** Raises a FPU stack underflow exception. Sets FPUIP, FPUCS, FOP, FPUDP and 1536 1536 * 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) 1539 1539 /** Raises a FPU stack underflow exception. Sets FPUIP, FPUCS and FOP. Pops 1540 1540 * 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) 1543 1543 /** Raises a FPU stack underflow exception for an instruction pushing a result 1544 1544 * 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) 1547 1547 /** Raises a FPU stack underflow exception for an instruction pushing a result 1548 1548 * 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) 1551 1551 1552 1552 /** Raises a FPU stack overflow exception as part of a push attempt. Sets 1553 1553 * 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) 1556 1556 /** Raises a FPU stack overflow exception as part of a push attempt. Sets 1557 1557 * 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) 1560 1560 /** Prepares for using the FPU state. 1561 1561 * Ensures that we can use the host FPU in the current context (RC+R0.
Note:
See TracChangeset
for help on using the changeset viewer.