Changeset 54898 in vbox
- Timestamp:
- Mar 22, 2015 11:47:07 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99113
- Location:
- trunk
- Files:
-
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpum.mac
r54738 r54898 133 133 134 134 135 %define XSTATE_SIZE 8192 136 135 137 struc CPUMCTX 136 . fpu resb 512138 .XState resb XSTATE_SIZE 137 139 .eax resq 1 138 140 .ecx resq 1 -
trunk/include/VBox/vmm/cpumctx.h
r54897 r54898 250 250 * @todo This doesn't have to be in X86FXSTATE on CPUs without fxsr - we need a type for the 251 251 * actual format or convert it (waste of time). */ 252 X86 FXSTATE fpu;252 X86XSAVEAREA XState; 253 253 254 254 /** CPUMCTXCORE Part. -
trunk/include/VBox/vmm/vm.h
r54897 r54898 231 231 uint8_t abAlignment2[3584]; 232 232 233 /** PGM part. */ 234 union 235 { 236 #ifdef ___PGMInternal_h 237 struct PGMCPU s; 238 #endif 239 uint8_t padding[4096]; /* multiple of 4096 */ 240 } pgm; 241 233 242 /** CPUM part. */ 234 243 union … … 237 246 struct CPUMCPU s; 238 247 #endif 239 uint8_t padding[ 4096]; /* multiple of 4096 */248 uint8_t padding[28672]; /* multiple of 4096 */ 240 249 } cpum; 241 242 /** PGM part. */243 union244 {245 #ifdef ___PGMInternal_h246 struct PGMCPU s;247 #endif248 uint8_t padding[4096]; /* multiple of 4096 */249 } pgm;250 250 251 251 } VMCPU; -
trunk/include/VBox/vmm/vm.mac
r54897 r54898 146 146 147 147 alignb 4096 148 .cpum resb 4096149 148 .pgm resb 4096 149 alignb 4096 150 .cpum resb 28672 151 alignb 4096 150 152 endstruc 151 153 -
trunk/include/iprt/x86.h
r54896 r54898 2772 2772 } AmdBd; 2773 2773 2774 /** Reserved 8K here for current and future state info. */ 2774 /** To enbling static deployments that have a reasonable chance of working for 2775 * the next 3-6 CPU generations without running short on space, we allocate a 2776 * lot of extra space here, making the structure a round 8KB in size. This 2777 * leaves us 7616 bytes for extended state. The skylake xeons are likely to use 2778 * 2112 of these, leaving us with 5504 bytes for future Intel generations. */ 2775 2779 uint8_t ab[8192 - 512 - 64]; 2776 2780 } u; … … 2778 2782 #ifndef VBOX_FOR_DTRACE_LIB 2779 2783 AssertCompileSize(X86XSAVEAREA, 8192); 2784 AssertCompileMemberSize(X86XSAVEAREA, u.Intel, 0x840 /*2112 => total 0xa80 (2688) */); 2780 2785 AssertCompileMemberOffset(X86XSAVEAREA, Hdr, 0x200); 2781 2786 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.YmmHi, 0x240); -
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r54892 r54898 5229 5229 DECLINLINE(void) iemFpuUpdateOpcodeAndIpWorker(PIEMCPU pIemCpu, PCPUMCTX pCtx) 5230 5230 { 5231 pCtx-> fpu.FOP = pIemCpu->abOpcode[pIemCpu->offFpuOpcode]5231 pCtx->XState.x87.FOP = pIemCpu->abOpcode[pIemCpu->offFpuOpcode] 5232 5232 | ((uint16_t)(pIemCpu->abOpcode[pIemCpu->offFpuOpcode - 1] & 0x7) << 8); 5233 /** @todo FPU.CS and FPUIP needs to be kept seperately. */5233 /** @todo XState.x87.CS and FPUIP needs to be kept seperately. */ 5234 5234 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) 5235 5235 { 5236 5236 /** @todo Testcase: making assumptions about how FPUIP and FPUDP are handled 5237 5237 * happens in real mode here based on the fnsave and fnstenv images. */ 5238 pCtx-> fpu.CS = 0;5239 pCtx-> fpu.FPUIP = pCtx->eip | ((uint32_t)pCtx->cs.Sel << 4);5238 pCtx->XState.x87.CS = 0; 5239 pCtx->XState.x87.FPUIP = pCtx->eip | ((uint32_t)pCtx->cs.Sel << 4); 5240 5240 } 5241 5241 else 5242 5242 { 5243 pCtx-> fpu.CS = pCtx->cs.Sel;5244 pCtx-> fpu.FPUIP = pCtx->rip;5245 } 5246 } 5247 5248 5249 /** 5250 * Updates the FPU.DS and FPUDP registers.5243 pCtx->XState.x87.CS = pCtx->cs.Sel; 5244 pCtx->XState.x87.FPUIP = pCtx->rip; 5245 } 5246 } 5247 5248 5249 /** 5250 * Updates the XState.x87.DS and FPUDP registers. 5251 5251 * 5252 5252 * @param pIemCpu The IEM per CPU data. … … 5270 5270 sel = pCtx->ds.Sel; 5271 5271 } 5272 /** @todo FPU.DS and FPUDP needs to be kept seperately. */5272 /** @todo XState.x87.DS and FPUDP needs to be kept seperately. */ 5273 5273 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) 5274 5274 { 5275 pCtx-> fpu.DS = 0;5276 pCtx-> fpu.FPUDP = (uint32_t)GCPtrEff | ((uint32_t)sel << 4);5275 pCtx->XState.x87.DS = 0; 5276 pCtx->XState.x87.FPUDP = (uint32_t)GCPtrEff | ((uint32_t)sel << 4); 5277 5277 } 5278 5278 else 5279 5279 { 5280 pCtx-> fpu.DS = sel;5281 pCtx-> fpu.FPUDP = GCPtrEff;5280 pCtx->XState.x87.DS = sel; 5281 pCtx->XState.x87.FPUDP = GCPtrEff; 5282 5282 } 5283 5283 } … … 5293 5293 DECLINLINE(void) iemFpuRotateStackPush(PCPUMCTX pCtx) 5294 5294 { 5295 RTFLOAT80U r80Tmp = pCtx-> fpu.aRegs[7].r80;5296 pCtx-> fpu.aRegs[7].r80 = pCtx->fpu.aRegs[6].r80;5297 pCtx-> fpu.aRegs[6].r80 = pCtx->fpu.aRegs[5].r80;5298 pCtx-> fpu.aRegs[5].r80 = pCtx->fpu.aRegs[4].r80;5299 pCtx-> fpu.aRegs[4].r80 = pCtx->fpu.aRegs[3].r80;5300 pCtx-> fpu.aRegs[3].r80 = pCtx->fpu.aRegs[2].r80;5301 pCtx-> fpu.aRegs[2].r80 = pCtx->fpu.aRegs[1].r80;5302 pCtx-> fpu.aRegs[1].r80 = pCtx->fpu.aRegs[0].r80;5303 pCtx-> fpu.aRegs[0].r80 = r80Tmp;5295 RTFLOAT80U r80Tmp = pCtx->XState.x87.aRegs[7].r80; 5296 pCtx->XState.x87.aRegs[7].r80 = pCtx->XState.x87.aRegs[6].r80; 5297 pCtx->XState.x87.aRegs[6].r80 = pCtx->XState.x87.aRegs[5].r80; 5298 pCtx->XState.x87.aRegs[5].r80 = pCtx->XState.x87.aRegs[4].r80; 5299 pCtx->XState.x87.aRegs[4].r80 = pCtx->XState.x87.aRegs[3].r80; 5300 pCtx->XState.x87.aRegs[3].r80 = pCtx->XState.x87.aRegs[2].r80; 5301 pCtx->XState.x87.aRegs[2].r80 = pCtx->XState.x87.aRegs[1].r80; 5302 pCtx->XState.x87.aRegs[1].r80 = pCtx->XState.x87.aRegs[0].r80; 5303 pCtx->XState.x87.aRegs[0].r80 = r80Tmp; 5304 5304 } 5305 5305 … … 5314 5314 DECLINLINE(void) iemFpuRotateStackPop(PCPUMCTX pCtx) 5315 5315 { 5316 RTFLOAT80U r80Tmp = pCtx-> fpu.aRegs[0].r80;5317 pCtx-> fpu.aRegs[0].r80 = pCtx->fpu.aRegs[1].r80;5318 pCtx-> fpu.aRegs[1].r80 = pCtx->fpu.aRegs[2].r80;5319 pCtx-> fpu.aRegs[2].r80 = pCtx->fpu.aRegs[3].r80;5320 pCtx-> fpu.aRegs[3].r80 = pCtx->fpu.aRegs[4].r80;5321 pCtx-> fpu.aRegs[4].r80 = pCtx->fpu.aRegs[5].r80;5322 pCtx-> fpu.aRegs[5].r80 = pCtx->fpu.aRegs[6].r80;5323 pCtx-> fpu.aRegs[6].r80 = pCtx->fpu.aRegs[7].r80;5324 pCtx-> fpu.aRegs[7].r80 = r80Tmp;5316 RTFLOAT80U r80Tmp = pCtx->XState.x87.aRegs[0].r80; 5317 pCtx->XState.x87.aRegs[0].r80 = pCtx->XState.x87.aRegs[1].r80; 5318 pCtx->XState.x87.aRegs[1].r80 = pCtx->XState.x87.aRegs[2].r80; 5319 pCtx->XState.x87.aRegs[2].r80 = pCtx->XState.x87.aRegs[3].r80; 5320 pCtx->XState.x87.aRegs[3].r80 = pCtx->XState.x87.aRegs[4].r80; 5321 pCtx->XState.x87.aRegs[4].r80 = pCtx->XState.x87.aRegs[5].r80; 5322 pCtx->XState.x87.aRegs[5].r80 = pCtx->XState.x87.aRegs[6].r80; 5323 pCtx->XState.x87.aRegs[6].r80 = pCtx->XState.x87.aRegs[7].r80; 5324 pCtx->XState.x87.aRegs[7].r80 = r80Tmp; 5325 5325 } 5326 5326 … … 5337 5337 { 5338 5338 /* Update FSW and bail if there are pending exceptions afterwards. */ 5339 uint16_t fFsw = pCtx-> fpu.FSW & ~X86_FSW_C_MASK;5339 uint16_t fFsw = pCtx->XState.x87.FSW & ~X86_FSW_C_MASK; 5340 5340 fFsw |= pResult->FSW & ~X86_FSW_TOP_MASK; 5341 if ( (fFsw & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))5342 & ~(pCtx-> fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))5343 { 5344 pCtx-> fpu.FSW = fFsw;5341 if ( (fFsw & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE)) 5342 & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM))) 5343 { 5344 pCtx->XState.x87.FSW = fFsw; 5345 5345 return; 5346 5346 } 5347 5347 5348 5348 uint16_t iNewTop = (X86_FSW_TOP_GET(fFsw) + 7) & X86_FSW_TOP_SMASK; 5349 if (!(pCtx-> fpu.FTW & RT_BIT(iNewTop)))5349 if (!(pCtx->XState.x87.FTW & RT_BIT(iNewTop))) 5350 5350 { 5351 5351 /* All is fine, push the actual value. */ 5352 pCtx-> fpu.FTW |= RT_BIT(iNewTop);5353 pCtx-> fpu.aRegs[7].r80 = pResult->r80Result;5354 } 5355 else if (pCtx-> fpu.FCW & X86_FCW_IM)5352 pCtx->XState.x87.FTW |= RT_BIT(iNewTop); 5353 pCtx->XState.x87.aRegs[7].r80 = pResult->r80Result; 5354 } 5355 else if (pCtx->XState.x87.FCW & X86_FCW_IM) 5356 5356 { 5357 5357 /* Masked stack overflow, push QNaN. */ 5358 5358 fFsw |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1; 5359 iemFpuStoreQNan(&pCtx-> fpu.aRegs[7].r80);5359 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80); 5360 5360 } 5361 5361 else 5362 5362 { 5363 5363 /* Raise stack overflow, don't push anything. */ 5364 pCtx-> fpu.FSW |= pResult->FSW & ~X86_FSW_C_MASK;5365 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;5364 pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_C_MASK; 5365 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES; 5366 5366 return; 5367 5367 } … … 5369 5369 fFsw &= ~X86_FSW_TOP_MASK; 5370 5370 fFsw |= iNewTop << X86_FSW_TOP_SHIFT; 5371 pCtx-> fpu.FSW = fFsw;5371 pCtx->XState.x87.FSW = fFsw; 5372 5372 5373 5373 iemFpuRotateStackPush(pCtx); … … 5386 5386 { 5387 5387 Assert(iStReg < 8); 5388 uint16_t iReg = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;5389 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5390 pCtx-> fpu.FSW |= pResult->FSW & ~X86_FSW_TOP_MASK;5391 pCtx-> fpu.FTW |= RT_BIT(iReg);5392 pCtx-> fpu.aRegs[iStReg].r80 = pResult->r80Result;5388 uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK; 5389 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5390 pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_TOP_MASK; 5391 pCtx->XState.x87.FTW |= RT_BIT(iReg); 5392 pCtx->XState.x87.aRegs[iStReg].r80 = pResult->r80Result; 5393 5393 } 5394 5394 … … 5403 5403 static void iemFpuUpdateFSWOnly(PCPUMCTX pCtx, uint16_t u16FSW) 5404 5404 { 5405 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5406 pCtx-> fpu.FSW |= u16FSW & ~X86_FSW_TOP_MASK;5405 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5406 pCtx->XState.x87.FSW |= u16FSW & ~X86_FSW_TOP_MASK; 5407 5407 } 5408 5408 … … 5416 5416 { 5417 5417 /* Check pending exceptions. */ 5418 uint16_t uFSW = pCtx-> fpu.FSW;5419 if ( (pCtx-> fpu.FSW & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE))5420 & ~(pCtx-> fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))5418 uint16_t uFSW = pCtx->XState.x87.FSW; 5419 if ( (pCtx->XState.x87.FSW & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE)) 5420 & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM))) 5421 5421 return; 5422 5422 … … 5425 5425 uFSW &= ~X86_FSW_TOP_MASK; 5426 5426 uFSW |= (iOldTop + (UINT16_C(9) << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK; 5427 pCtx-> fpu.FSW = uFSW;5427 pCtx->XState.x87.FSW = uFSW; 5428 5428 5429 5429 /* Mark the previous ST0 as empty. */ 5430 5430 iOldTop >>= X86_FSW_TOP_SHIFT; 5431 pCtx-> fpu.FTW &= ~RT_BIT(iOldTop);5431 pCtx->XState.x87.FTW &= ~RT_BIT(iOldTop); 5432 5432 5433 5433 /* Rotate the registers. */ … … 5481 5481 5482 5482 /* Update FSW and bail if there are pending exceptions afterwards. */ 5483 uint16_t fFsw = pCtx-> fpu.FSW & ~X86_FSW_C_MASK;5483 uint16_t fFsw = pCtx->XState.x87.FSW & ~X86_FSW_C_MASK; 5484 5484 fFsw |= pResult->FSW & ~X86_FSW_TOP_MASK; 5485 5485 if ( (fFsw & (X86_FSW_IE | X86_FSW_ZE | X86_FSW_DE)) 5486 & ~(pCtx-> fpu.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM)))5487 { 5488 pCtx-> fpu.FSW = fFsw;5486 & ~(pCtx->XState.x87.FCW & (X86_FCW_IM | X86_FCW_ZM | X86_FCW_DM))) 5487 { 5488 pCtx->XState.x87.FSW = fFsw; 5489 5489 return; 5490 5490 } 5491 5491 5492 5492 uint16_t iNewTop = (X86_FSW_TOP_GET(fFsw) + 7) & X86_FSW_TOP_SMASK; 5493 if (!(pCtx-> fpu.FTW & RT_BIT(iNewTop)))5493 if (!(pCtx->XState.x87.FTW & RT_BIT(iNewTop))) 5494 5494 { 5495 5495 /* All is fine, push the actual value. */ 5496 pCtx-> fpu.FTW |= RT_BIT(iNewTop);5497 pCtx-> fpu.aRegs[0].r80 = pResult->r80Result1;5498 pCtx-> fpu.aRegs[7].r80 = pResult->r80Result2;5499 } 5500 else if (pCtx-> fpu.FCW & X86_FCW_IM)5496 pCtx->XState.x87.FTW |= RT_BIT(iNewTop); 5497 pCtx->XState.x87.aRegs[0].r80 = pResult->r80Result1; 5498 pCtx->XState.x87.aRegs[7].r80 = pResult->r80Result2; 5499 } 5500 else if (pCtx->XState.x87.FCW & X86_FCW_IM) 5501 5501 { 5502 5502 /* Masked stack overflow, push QNaN. */ 5503 5503 fFsw |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1; 5504 iemFpuStoreQNan(&pCtx-> fpu.aRegs[0].r80);5505 iemFpuStoreQNan(&pCtx-> fpu.aRegs[7].r80);5504 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80); 5505 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80); 5506 5506 } 5507 5507 else 5508 5508 { 5509 5509 /* Raise stack overflow, don't push anything. */ 5510 pCtx-> fpu.FSW |= pResult->FSW & ~X86_FSW_C_MASK;5511 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES;5510 pCtx->XState.x87.FSW |= pResult->FSW & ~X86_FSW_C_MASK; 5511 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_C1 | X86_FSW_B | X86_FSW_ES; 5512 5512 return; 5513 5513 } … … 5515 5515 fFsw &= ~X86_FSW_TOP_MASK; 5516 5516 fFsw |= iNewTop << X86_FSW_TOP_SHIFT; 5517 pCtx-> fpu.FSW = fFsw;5517 pCtx->XState.x87.FSW = fFsw; 5518 5518 5519 5519 iemFpuRotateStackPush(pCtx); … … 5619 5619 Assert(iStReg < 8); 5620 5620 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5621 uint8_t iReg = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;5622 pCtx-> fpu.FTW &= ~RT_BIT(iReg);5621 uint8_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK; 5622 pCtx->XState.x87.FTW &= ~RT_BIT(iReg); 5623 5623 } 5624 5624 … … 5632 5632 { 5633 5633 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5634 uint16_t uFsw = pCtx-> fpu.FSW;5634 uint16_t uFsw = pCtx->XState.x87.FSW; 5635 5635 uint16_t uTop = uFsw & X86_FSW_TOP_MASK; 5636 5636 uTop = (uTop + (1 << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK; 5637 5637 uFsw &= ~X86_FSW_TOP_MASK; 5638 5638 uFsw |= uTop; 5639 pCtx-> fpu.FSW = uFsw;5639 pCtx->XState.x87.FSW = uFsw; 5640 5640 } 5641 5641 … … 5649 5649 { 5650 5650 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5651 uint16_t uFsw = pCtx-> fpu.FSW;5651 uint16_t uFsw = pCtx->XState.x87.FSW; 5652 5652 uint16_t uTop = uFsw & X86_FSW_TOP_MASK; 5653 5653 uTop = (uTop + (7 << X86_FSW_TOP_SHIFT)) & X86_FSW_TOP_MASK; 5654 5654 uFsw &= ~X86_FSW_TOP_MASK; 5655 5655 uFsw |= uTop; 5656 pCtx-> fpu.FSW = uFsw;5656 pCtx->XState.x87.FSW = uFsw; 5657 5657 } 5658 5658 … … 5748 5748 { 5749 5749 Assert(iStReg < 8 || iStReg == UINT8_MAX); 5750 if (pCtx-> fpu.FCW & X86_FCW_IM)5750 if (pCtx->XState.x87.FCW & X86_FCW_IM) 5751 5751 { 5752 5752 /* Masked underflow. */ 5753 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5754 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF;5755 uint16_t iReg = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;5753 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5754 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF; 5755 uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK; 5756 5756 if (iStReg != UINT8_MAX) 5757 5757 { 5758 pCtx-> fpu.FTW |= RT_BIT(iReg);5759 iemFpuStoreQNan(&pCtx-> fpu.aRegs[iStReg].r80);5758 pCtx->XState.x87.FTW |= RT_BIT(iReg); 5759 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[iStReg].r80); 5760 5760 } 5761 5761 } 5762 5762 else 5763 5763 { 5764 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5765 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;5764 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5765 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 5766 5766 } 5767 5767 } … … 5830 5830 iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx); 5831 5831 5832 if (pCtx-> fpu.FCW & X86_FCW_IM)5832 if (pCtx->XState.x87.FCW & X86_FCW_IM) 5833 5833 { 5834 5834 /* Masked overflow - Push QNaN. */ 5835 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + 7) & X86_FSW_TOP_SMASK;5836 pCtx-> fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);5837 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF;5838 pCtx-> fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;5839 pCtx-> fpu.FTW |= RT_BIT(iNewTop);5840 iemFpuStoreQNan(&pCtx-> fpu.aRegs[7].r80);5835 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK; 5836 pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK); 5837 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF; 5838 pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT; 5839 pCtx->XState.x87.FTW |= RT_BIT(iNewTop); 5840 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80); 5841 5841 iemFpuRotateStackPush(pCtx); 5842 5842 } … … 5844 5844 { 5845 5845 /* Exception pending - don't change TOP or the register stack. */ 5846 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5847 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;5846 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5847 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 5848 5848 } 5849 5849 } … … 5856 5856 iemFpuUpdateOpcodeAndIpWorker(pIemCpu, pCtx); 5857 5857 5858 if (pCtx-> fpu.FCW & X86_FCW_IM)5858 if (pCtx->XState.x87.FCW & X86_FCW_IM) 5859 5859 { 5860 5860 /* Masked overflow - Push QNaN. */ 5861 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + 7) & X86_FSW_TOP_SMASK;5862 pCtx-> fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);5863 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF;5864 pCtx-> fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;5865 pCtx-> fpu.FTW |= RT_BIT(iNewTop);5866 iemFpuStoreQNan(&pCtx-> fpu.aRegs[0].r80);5867 iemFpuStoreQNan(&pCtx-> fpu.aRegs[7].r80);5861 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK; 5862 pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK); 5863 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF; 5864 pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT; 5865 pCtx->XState.x87.FTW |= RT_BIT(iNewTop); 5866 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80); 5867 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80); 5868 5868 iemFpuRotateStackPush(pCtx); 5869 5869 } … … 5871 5871 { 5872 5872 /* Exception pending - don't change TOP or the register stack. */ 5873 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5874 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;5873 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5874 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 5875 5875 } 5876 5876 } … … 5885 5885 static void iemFpuStackPushOverflowOnly(PIEMCPU pIemCpu, PCPUMCTX pCtx) 5886 5886 { 5887 if (pCtx-> fpu.FCW & X86_FCW_IM)5887 if (pCtx->XState.x87.FCW & X86_FCW_IM) 5888 5888 { 5889 5889 /* Masked overflow. */ 5890 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + 7) & X86_FSW_TOP_SMASK;5891 pCtx-> fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK);5892 pCtx-> fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;5893 pCtx-> fpu.FSW |= iNewTop << X86_FSW_TOP_SHIFT;5894 pCtx-> fpu.FTW |= RT_BIT(iNewTop);5895 iemFpuStoreQNan(&pCtx-> fpu.aRegs[7].r80);5890 uint16_t iNewTop = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + 7) & X86_FSW_TOP_SMASK; 5891 pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_C_MASK); 5892 pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF; 5893 pCtx->XState.x87.FSW |= iNewTop << X86_FSW_TOP_SHIFT; 5894 pCtx->XState.x87.FTW |= RT_BIT(iNewTop); 5895 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[7].r80); 5896 5896 iemFpuRotateStackPush(pCtx); 5897 5897 } … … 5899 5899 { 5900 5900 /* Exception pending - don't change TOP or the register stack. */ 5901 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;5902 pCtx-> fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;5901 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 5902 pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 5903 5903 } 5904 5904 } … … 5938 5938 { 5939 5939 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5940 uint16_t iReg = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;5941 if (pCtx-> fpu.FTW & RT_BIT(iReg))5940 uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK; 5941 if (pCtx->XState.x87.FTW & RT_BIT(iReg)) 5942 5942 return VINF_SUCCESS; 5943 5943 return VERR_NOT_FOUND; … … 5948 5948 { 5949 5949 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5950 uint16_t iReg = (X86_FSW_TOP_GET(pCtx-> fpu.FSW) + iStReg) & X86_FSW_TOP_SMASK;5951 if (pCtx-> fpu.FTW & RT_BIT(iReg))5952 { 5953 *ppRef = &pCtx-> fpu.aRegs[iStReg].r80;5950 uint16_t iReg = (X86_FSW_TOP_GET(pCtx->XState.x87.FSW) + iStReg) & X86_FSW_TOP_SMASK; 5951 if (pCtx->XState.x87.FTW & RT_BIT(iReg)) 5952 { 5953 *ppRef = &pCtx->XState.x87.aRegs[iStReg].r80; 5954 5954 return VINF_SUCCESS; 5955 5955 } … … 5962 5962 { 5963 5963 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5964 uint16_t iTop = X86_FSW_TOP_GET(pCtx-> fpu.FSW);5964 uint16_t iTop = X86_FSW_TOP_GET(pCtx->XState.x87.FSW); 5965 5965 uint16_t iReg0 = (iTop + iStReg0) & X86_FSW_TOP_SMASK; 5966 5966 uint16_t iReg1 = (iTop + iStReg1) & X86_FSW_TOP_SMASK; 5967 if ((pCtx-> fpu.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))5968 { 5969 *ppRef0 = &pCtx-> fpu.aRegs[iStReg0].r80;5970 *ppRef1 = &pCtx-> fpu.aRegs[iStReg1].r80;5967 if ((pCtx->XState.x87.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1))) 5968 { 5969 *ppRef0 = &pCtx->XState.x87.aRegs[iStReg0].r80; 5970 *ppRef1 = &pCtx->XState.x87.aRegs[iStReg1].r80; 5971 5971 return VINF_SUCCESS; 5972 5972 } … … 5978 5978 { 5979 5979 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 5980 uint16_t iTop = X86_FSW_TOP_GET(pCtx-> fpu.FSW);5980 uint16_t iTop = X86_FSW_TOP_GET(pCtx->XState.x87.FSW); 5981 5981 uint16_t iReg0 = (iTop + iStReg0) & X86_FSW_TOP_SMASK; 5982 5982 uint16_t iReg1 = (iTop + iStReg1) & X86_FSW_TOP_SMASK; 5983 if ((pCtx-> fpu.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1)))5984 { 5985 *ppRef0 = &pCtx-> fpu.aRegs[iStReg0].r80;5983 if ((pCtx->XState.x87.FTW & (RT_BIT(iReg0) | RT_BIT(iReg1))) == (RT_BIT(iReg0) | RT_BIT(iReg1))) 5984 { 5985 *ppRef0 = &pCtx->XState.x87.aRegs[iStReg0].r80; 5986 5986 return VINF_SUCCESS; 5987 5987 } … … 5997 5997 static void iemFpuRecalcExceptionStatus(PCPUMCTX pCtx) 5998 5998 { 5999 uint16_t u16Fsw = pCtx-> fpu.FSW;6000 if ((u16Fsw & X86_FSW_XCPT_MASK) & ~(pCtx-> fpu.FCW & X86_FCW_XCPT_MASK))5999 uint16_t u16Fsw = pCtx->XState.x87.FSW; 6000 if ((u16Fsw & X86_FSW_XCPT_MASK) & ~(pCtx->XState.x87.FCW & X86_FCW_XCPT_MASK)) 6001 6001 u16Fsw |= X86_FSW_ES | X86_FSW_B; 6002 6002 else 6003 6003 u16Fsw &= ~(X86_FSW_ES | X86_FSW_B); 6004 pCtx-> fpu.FSW = u16Fsw;6004 pCtx->XState.x87.FSW = u16Fsw; 6005 6005 } 6006 6006 … … 6014 6014 static uint16_t iemFpuCalcFullFtw(PCCPUMCTX pCtx) 6015 6015 { 6016 uint8_t const u8Ftw = (uint8_t)pCtx-> fpu.FTW;6016 uint8_t const u8Ftw = (uint8_t)pCtx->XState.x87.FTW; 6017 6017 uint16_t u16Ftw = 0; 6018 unsigned const iTop = X86_FSW_TOP_GET(pCtx-> fpu.FSW);6018 unsigned const iTop = X86_FSW_TOP_GET(pCtx->XState.x87.FSW); 6019 6019 for (unsigned iSt = 0; iSt < 8; iSt++) 6020 6020 { … … 6025 6025 { 6026 6026 uint16_t uTag; 6027 PCRTFLOAT80U const pr80Reg = &pCtx-> fpu.aRegs[iSt].r80;6027 PCRTFLOAT80U const pr80Reg = &pCtx->XState.x87.aRegs[iSt].r80; 6028 6028 if (pr80Reg->s.uExponent == 0x7fff) 6029 6029 uTag = 2; /* Exponent is all 1's => Special. */ … … 7172 7172 /* The lazy approach for now... */ 7173 7173 /** @todo testcase: Ordering of \#SS(0) vs \#GP() vs \#PF on SSE stuff. */ 7174 if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)-> fpu.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */7174 if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->XState.x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */ 7175 7175 return iemRaiseGeneralProtectionFault0(pIemCpu); 7176 7176 … … 7372 7372 { 7373 7373 /* The lazy approach for now... */ 7374 if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)-> fpu.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */7374 if ((GCPtrMem & 15) && !(pIemCpu->CTX_SUFF(pCtx)->XState.x87.MXCSR & X86_MXSCR_MM)) /** @todo should probably check this *after* applying seg.u64Base... Check real HW. */ 7375 7375 return iemRaiseGeneralProtectionFault0(pIemCpu); 7376 7376 … … 8304 8304 #define IEM_MC_MAYBE_RAISE_FPU_XCPT() \ 8305 8305 do { \ 8306 if ((pIemCpu)->CTX_SUFF(pCtx)-> fpu.FSW & X86_FSW_ES) \8306 if ((pIemCpu)->CTX_SUFF(pCtx)->XState.x87.FSW & X86_FSW_ES) \ 8307 8307 return iemRaiseMathFault(pIemCpu); \ 8308 8308 } while (0) … … 8387 8387 #define IEM_MC_FETCH_EFLAGS(a_EFlags) (a_EFlags) = (pIemCpu)->CTX_SUFF(pCtx)->eflags.u 8388 8388 #define IEM_MC_FETCH_EFLAGS_U8(a_EFlags) (a_EFlags) = (uint8_t)(pIemCpu)->CTX_SUFF(pCtx)->eflags.u 8389 #define IEM_MC_FETCH_FSW(a_u16Fsw) (a_u16Fsw) = pIemCpu->CTX_SUFF(pCtx)-> fpu.FSW8390 #define IEM_MC_FETCH_FCW(a_u16Fcw) (a_u16Fcw) = pIemCpu->CTX_SUFF(pCtx)-> fpu.FCW8389 #define IEM_MC_FETCH_FSW(a_u16Fsw) (a_u16Fsw) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.FSW 8390 #define IEM_MC_FETCH_FCW(a_u16Fcw) (a_u16Fcw) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW 8391 8391 8392 8392 #define IEM_MC_STORE_GREG_U8(a_iGReg, a_u8Value) *iemGRegRefU8(pIemCpu, (a_iGReg)) = (a_u8Value) … … 8401 8401 #define IEM_MC_CLEAR_HIGH_GREG_U64_BY_REF(a_pu32Dst) do { (a_pu32Dst)[1] = 0; } while (0) 8402 8402 #define IEM_MC_STORE_FPUREG_R80_SRC_REF(a_iSt, a_pr80Src) \ 8403 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0)8403 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[a_iSt].r80 = *(a_pr80Src); } while (0) 8404 8404 8405 8405 #define IEM_MC_REF_GREG_U8(a_pu8Dst, a_iGReg) (a_pu8Dst) = iemGRegRefU8(pIemCpu, (a_iGReg)) … … 8492 8492 #define IEM_MC_FLIP_EFL_BIT(a_fBit) do { (pIemCpu)->CTX_SUFF(pCtx)->eflags.u ^= (a_fBit); } while (0) 8493 8493 8494 #define IEM_MC_CLEAR_FSW_EX() do { (pIemCpu)->CTX_SUFF(pCtx)-> fpu.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0)8494 #define IEM_MC_CLEAR_FSW_EX() do { (pIemCpu)->CTX_SUFF(pCtx)->XState.x87.FSW &= X86_FSW_C_MASK | X86_FSW_TOP_MASK; } while (0) 8495 8495 8496 8496 8497 8497 #define IEM_MC_FETCH_MREG_U64(a_u64Value, a_iMReg) \ 8498 do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx; } while (0)8498 do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx; } while (0) 8499 8499 #define IEM_MC_FETCH_MREG_U32(a_u32Value, a_iMReg) \ 8500 do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].au32[0]; } while (0)8500 do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].au32[0]; } while (0) 8501 8501 #define IEM_MC_STORE_MREG_U64(a_iMReg, a_u64Value) \ 8502 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0)8502 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx = (a_u64Value); } while (0) 8503 8503 #define IEM_MC_STORE_MREG_U32_ZX_U64(a_iMReg, a_u32Value) \ 8504 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0)8504 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx = (uint32_t)(a_u32Value); } while (0) 8505 8505 #define IEM_MC_REF_MREG_U64(a_pu64Dst, a_iMReg) \ 8506 (a_pu64Dst) = (&pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx)8506 (a_pu64Dst) = (&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx) 8507 8507 #define IEM_MC_REF_MREG_U64_CONST(a_pu64Dst, a_iMReg) \ 8508 (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx)8508 (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx) 8509 8509 #define IEM_MC_REF_MREG_U32_CONST(a_pu32Dst, a_iMReg) \ 8510 (a_pu32Dst) = ((uint32_t const *)&pIemCpu->CTX_SUFF(pCtx)-> fpu.aRegs[(a_iMReg)].mmx)8510 (a_pu32Dst) = ((uint32_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aRegs[(a_iMReg)].mmx) 8511 8511 8512 8512 #define IEM_MC_FETCH_XREG_U128(a_u128Value, a_iXReg) \ 8513 do { (a_u128Value) = pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].xmm; } while (0)8513 do { (a_u128Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm; } while (0) 8514 8514 #define IEM_MC_FETCH_XREG_U64(a_u64Value, a_iXReg) \ 8515 do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[0]; } while (0)8515 do { (a_u64Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0]; } while (0) 8516 8516 #define IEM_MC_FETCH_XREG_U32(a_u32Value, a_iXReg) \ 8517 do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au32[0]; } while (0)8517 do { (a_u32Value) = pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au32[0]; } while (0) 8518 8518 #define IEM_MC_STORE_XREG_U128(a_iXReg, a_u128Value) \ 8519 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0)8519 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm = (a_u128Value); } while (0) 8520 8520 #define IEM_MC_STORE_XREG_U64_ZX_U128(a_iXReg, a_u64Value) \ 8521 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \8522 pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[1] = 0; \8521 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0] = (a_u64Value); \ 8522 pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \ 8523 8523 } while (0) 8524 8524 #define IEM_MC_STORE_XREG_U32_ZX_U128(a_iXReg, a_u32Value) \ 8525 do { pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \8526 pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[1] = 0; \8525 do { pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0] = (uint32_t)(a_u32Value); \ 8526 pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[1] = 0; \ 8527 8527 } while (0) 8528 8528 #define IEM_MC_REF_XREG_U128(a_pu128Dst, a_iXReg) \ 8529 (a_pu128Dst) = (&pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].xmm)8529 (a_pu128Dst) = (&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm) 8530 8530 #define IEM_MC_REF_XREG_U128_CONST(a_pu128Dst, a_iXReg) \ 8531 (a_pu128Dst) = ((uint128_t const *)&pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].xmm)8531 (a_pu128Dst) = ((uint128_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].xmm) 8532 8532 #define IEM_MC_REF_XREG_U64_CONST(a_pu64Dst, a_iXReg) \ 8533 (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)-> fpu.aXMM[(a_iXReg)].au64[0])8533 (a_pu64Dst) = ((uint64_t const *)&pIemCpu->CTX_SUFF(pCtx)->XState.x87.aXMM[(a_iXReg)].au64[0]) 8534 8534 8535 8535 #define IEM_MC_FETCH_MEM_U8(a_u8Dst, a_iSeg, a_GCPtrMem) \ … … 8739 8739 if ( !(a_u16FSW & X86_FSW_ES) \ 8740 8740 || !( (a_u16FSW & (X86_FSW_UE | X86_FSW_OE | X86_FSW_IE)) \ 8741 & ~(pIemCpu->CTX_SUFF(pCtx)-> fpu.FCW & X86_FCW_MASK_ALL) ) ) \8741 & ~(pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW & X86_FCW_MASK_ALL) ) ) \ 8742 8742 IEM_MC_RETURN_ON_FAILURE(iemMemCommitAndUnmap(pIemCpu, (a_pvMem), (a_fAccess))); \ 8743 8743 } while (0) … … 8875 8875 do { \ 8876 8876 iemFpuPrepareUsage(pIemCpu); \ 8877 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0)); \8877 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0)); \ 8878 8878 } while (0) 8879 8879 … … 8888 8888 do { \ 8889 8889 iemFpuPrepareUsage(pIemCpu); \ 8890 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1)); \8890 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \ 8891 8891 } while (0) 8892 8892 … … 8902 8902 do { \ 8903 8903 iemFpuPrepareUsage(pIemCpu); \ 8904 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1), (a2)); \8904 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \ 8905 8905 } while (0) 8906 8906 … … 9019 9019 do { \ 9020 9020 iemFpuPrepareUsage(pIemCpu); \ 9021 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1)); \9021 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \ 9022 9022 } while (0) 9023 9023 … … 9033 9033 do { \ 9034 9034 iemFpuPrepareUsage(pIemCpu); \ 9035 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1), (a2)); \9035 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \ 9036 9036 } while (0) 9037 9037 … … 9047 9047 do { \ 9048 9048 iemFpuPrepareUsageSse(pIemCpu); \ 9049 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1)); \9049 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1)); \ 9050 9050 } while (0) 9051 9051 … … 9061 9061 do { \ 9062 9062 iemFpuPrepareUsageSse(pIemCpu); \ 9063 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)-> fpu, (a0), (a1), (a2)); \9063 a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->XState.x87, (a0), (a1), (a2)); \ 9064 9064 } while (0) 9065 9065 … … 9131 9131 if (iemFpu2StRegsNotEmptyRefFirst(pIemCpu, (a_iSt0), &(a_pr80Dst0), (a_iSt1)) == VINF_SUCCESS) { 9132 9132 #define IEM_MC_IF_FCW_IM() \ 9133 if (pIemCpu->CTX_SUFF(pCtx)-> fpu.FCW & X86_FCW_IM) {9133 if (pIemCpu->CTX_SUFF(pCtx)->XState.x87.FCW & X86_FCW_IM) { 9134 9134 9135 9135 #define IEM_MC_ELSE() } else { … … 10219 10219 if (fRem) 10220 10220 { 10221 pOrgCtx-> fpu.FOP = pDebugCtx->fpu.FOP;10222 pOrgCtx-> fpu.FPUIP = pDebugCtx->fpu.FPUIP;10223 pOrgCtx-> fpu.CS = pDebugCtx->fpu.CS;10224 pOrgCtx-> fpu.Rsrvd1 = pDebugCtx->fpu.Rsrvd1;10225 pOrgCtx-> fpu.FPUDP = pDebugCtx->fpu.FPUDP;10226 pOrgCtx-> fpu.DS = pDebugCtx->fpu.DS;10227 pOrgCtx-> fpu.Rsrvd2 = pDebugCtx->fpu.Rsrvd2;10228 //pOrgCtx-> fpu.MXCSR_MASK = pDebugCtx->fpu.MXCSR_MASK;10229 if ((pOrgCtx-> fpu.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->fpu.FSW & X86_FSW_TOP_MASK))10230 pOrgCtx-> fpu.FSW = pDebugCtx->fpu.FSW;10221 pOrgCtx->XState.x87.FOP = pDebugCtx->XState.x87.FOP; 10222 pOrgCtx->XState.x87.FPUIP = pDebugCtx->XState.x87.FPUIP; 10223 pOrgCtx->XState.x87.CS = pDebugCtx->XState.x87.CS; 10224 pOrgCtx->XState.x87.Rsrvd1 = pDebugCtx->XState.x87.Rsrvd1; 10225 pOrgCtx->XState.x87.FPUDP = pDebugCtx->XState.x87.FPUDP; 10226 pOrgCtx->XState.x87.DS = pDebugCtx->XState.x87.DS; 10227 pOrgCtx->XState.x87.Rsrvd2 = pDebugCtx->XState.x87.Rsrvd2; 10228 //pOrgCtx->XState.x87.MXCSR_MASK = pDebugCtx->XState.x87.MXCSR_MASK; 10229 if ((pOrgCtx->XState.x87.FSW & X86_FSW_TOP_MASK) == (pDebugCtx->XState.x87.FSW & X86_FSW_TOP_MASK)) 10230 pOrgCtx->XState.x87.FSW = pDebugCtx->XState.x87.FSW; 10231 10231 } 10232 10232 #endif 10233 if (memcmp(&pOrgCtx-> fpu, &pDebugCtx->fpu, sizeof(pDebugCtx->fpu)))10233 if (memcmp(&pOrgCtx->XState.x87, &pDebugCtx->XState.x87, sizeof(pDebugCtx->XState.x87))) 10234 10234 { 10235 10235 RTAssertMsg2Weak(" the FPU state differs\n"); 10236 10236 cDiffs++; 10237 CHECK_FIELD( fpu.FCW);10238 CHECK_FIELD( fpu.FSW);10239 CHECK_FIELD( fpu.FTW);10240 CHECK_FIELD( fpu.FOP);10241 CHECK_FIELD( fpu.FPUIP);10242 CHECK_FIELD( fpu.CS);10243 CHECK_FIELD( fpu.Rsrvd1);10244 CHECK_FIELD( fpu.FPUDP);10245 CHECK_FIELD( fpu.DS);10246 CHECK_FIELD( fpu.Rsrvd2);10247 CHECK_FIELD( fpu.MXCSR);10248 CHECK_FIELD( fpu.MXCSR_MASK);10249 CHECK_FIELD( fpu.aRegs[0].au64[0]); CHECK_FIELD(fpu.aRegs[0].au64[1]);10250 CHECK_FIELD( fpu.aRegs[1].au64[0]); CHECK_FIELD(fpu.aRegs[1].au64[1]);10251 CHECK_FIELD( fpu.aRegs[2].au64[0]); CHECK_FIELD(fpu.aRegs[2].au64[1]);10252 CHECK_FIELD( fpu.aRegs[3].au64[0]); CHECK_FIELD(fpu.aRegs[3].au64[1]);10253 CHECK_FIELD( fpu.aRegs[4].au64[0]); CHECK_FIELD(fpu.aRegs[4].au64[1]);10254 CHECK_FIELD( fpu.aRegs[5].au64[0]); CHECK_FIELD(fpu.aRegs[5].au64[1]);10255 CHECK_FIELD( fpu.aRegs[6].au64[0]); CHECK_FIELD(fpu.aRegs[6].au64[1]);10256 CHECK_FIELD( fpu.aRegs[7].au64[0]); CHECK_FIELD(fpu.aRegs[7].au64[1]);10257 CHECK_FIELD( fpu.aXMM[ 0].au64[0]); CHECK_FIELD(fpu.aXMM[ 0].au64[1]);10258 CHECK_FIELD( fpu.aXMM[ 1].au64[0]); CHECK_FIELD(fpu.aXMM[ 1].au64[1]);10259 CHECK_FIELD( fpu.aXMM[ 2].au64[0]); CHECK_FIELD(fpu.aXMM[ 2].au64[1]);10260 CHECK_FIELD( fpu.aXMM[ 3].au64[0]); CHECK_FIELD(fpu.aXMM[ 3].au64[1]);10261 CHECK_FIELD( fpu.aXMM[ 4].au64[0]); CHECK_FIELD(fpu.aXMM[ 4].au64[1]);10262 CHECK_FIELD( fpu.aXMM[ 5].au64[0]); CHECK_FIELD(fpu.aXMM[ 5].au64[1]);10263 CHECK_FIELD( fpu.aXMM[ 6].au64[0]); CHECK_FIELD(fpu.aXMM[ 6].au64[1]);10264 CHECK_FIELD( fpu.aXMM[ 7].au64[0]); CHECK_FIELD(fpu.aXMM[ 7].au64[1]);10265 CHECK_FIELD( fpu.aXMM[ 8].au64[0]); CHECK_FIELD(fpu.aXMM[ 8].au64[1]);10266 CHECK_FIELD( fpu.aXMM[ 9].au64[0]); CHECK_FIELD(fpu.aXMM[ 9].au64[1]);10267 CHECK_FIELD( fpu.aXMM[10].au64[0]); CHECK_FIELD(fpu.aXMM[10].au64[1]);10268 CHECK_FIELD( fpu.aXMM[11].au64[0]); CHECK_FIELD(fpu.aXMM[11].au64[1]);10269 CHECK_FIELD( fpu.aXMM[12].au64[0]); CHECK_FIELD(fpu.aXMM[12].au64[1]);10270 CHECK_FIELD( fpu.aXMM[13].au64[0]); CHECK_FIELD(fpu.aXMM[13].au64[1]);10271 CHECK_FIELD( fpu.aXMM[14].au64[0]); CHECK_FIELD(fpu.aXMM[14].au64[1]);10272 CHECK_FIELD( fpu.aXMM[15].au64[0]); CHECK_FIELD(fpu.aXMM[15].au64[1]);10273 for (unsigned i = 0; i < RT_ELEMENTS(pOrgCtx-> fpu.au32RsrvdRest); i++)10274 CHECK_FIELD( fpu.au32RsrvdRest[i]);10237 CHECK_FIELD(XState.x87.FCW); 10238 CHECK_FIELD(XState.x87.FSW); 10239 CHECK_FIELD(XState.x87.FTW); 10240 CHECK_FIELD(XState.x87.FOP); 10241 CHECK_FIELD(XState.x87.FPUIP); 10242 CHECK_FIELD(XState.x87.CS); 10243 CHECK_FIELD(XState.x87.Rsrvd1); 10244 CHECK_FIELD(XState.x87.FPUDP); 10245 CHECK_FIELD(XState.x87.DS); 10246 CHECK_FIELD(XState.x87.Rsrvd2); 10247 CHECK_FIELD(XState.x87.MXCSR); 10248 CHECK_FIELD(XState.x87.MXCSR_MASK); 10249 CHECK_FIELD(XState.x87.aRegs[0].au64[0]); CHECK_FIELD(XState.x87.aRegs[0].au64[1]); 10250 CHECK_FIELD(XState.x87.aRegs[1].au64[0]); CHECK_FIELD(XState.x87.aRegs[1].au64[1]); 10251 CHECK_FIELD(XState.x87.aRegs[2].au64[0]); CHECK_FIELD(XState.x87.aRegs[2].au64[1]); 10252 CHECK_FIELD(XState.x87.aRegs[3].au64[0]); CHECK_FIELD(XState.x87.aRegs[3].au64[1]); 10253 CHECK_FIELD(XState.x87.aRegs[4].au64[0]); CHECK_FIELD(XState.x87.aRegs[4].au64[1]); 10254 CHECK_FIELD(XState.x87.aRegs[5].au64[0]); CHECK_FIELD(XState.x87.aRegs[5].au64[1]); 10255 CHECK_FIELD(XState.x87.aRegs[6].au64[0]); CHECK_FIELD(XState.x87.aRegs[6].au64[1]); 10256 CHECK_FIELD(XState.x87.aRegs[7].au64[0]); CHECK_FIELD(XState.x87.aRegs[7].au64[1]); 10257 CHECK_FIELD(XState.x87.aXMM[ 0].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 0].au64[1]); 10258 CHECK_FIELD(XState.x87.aXMM[ 1].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 1].au64[1]); 10259 CHECK_FIELD(XState.x87.aXMM[ 2].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 2].au64[1]); 10260 CHECK_FIELD(XState.x87.aXMM[ 3].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 3].au64[1]); 10261 CHECK_FIELD(XState.x87.aXMM[ 4].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 4].au64[1]); 10262 CHECK_FIELD(XState.x87.aXMM[ 5].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 5].au64[1]); 10263 CHECK_FIELD(XState.x87.aXMM[ 6].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 6].au64[1]); 10264 CHECK_FIELD(XState.x87.aXMM[ 7].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 7].au64[1]); 10265 CHECK_FIELD(XState.x87.aXMM[ 8].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 8].au64[1]); 10266 CHECK_FIELD(XState.x87.aXMM[ 9].au64[0]); CHECK_FIELD(XState.x87.aXMM[ 9].au64[1]); 10267 CHECK_FIELD(XState.x87.aXMM[10].au64[0]); CHECK_FIELD(XState.x87.aXMM[10].au64[1]); 10268 CHECK_FIELD(XState.x87.aXMM[11].au64[0]); CHECK_FIELD(XState.x87.aXMM[11].au64[1]); 10269 CHECK_FIELD(XState.x87.aXMM[12].au64[0]); CHECK_FIELD(XState.x87.aXMM[12].au64[1]); 10270 CHECK_FIELD(XState.x87.aXMM[13].au64[0]); CHECK_FIELD(XState.x87.aXMM[13].au64[1]); 10271 CHECK_FIELD(XState.x87.aXMM[14].au64[0]); CHECK_FIELD(XState.x87.aXMM[14].au64[1]); 10272 CHECK_FIELD(XState.x87.aXMM[15].au64[0]); CHECK_FIELD(XState.x87.aXMM[15].au64[1]); 10273 for (unsigned i = 0; i < RT_ELEMENTS(pOrgCtx->XState.x87.au32RsrvdRest); i++) 10274 CHECK_FIELD(XState.x87.au32RsrvdRest[i]); 10275 10275 } 10276 10276 CHECK_FIELD(rip); … … 10529 10529 pCtx->cs.Sel, pCtx->ss.Sel, pCtx->ds.Sel, pCtx->es.Sel, 10530 10530 pCtx->fs.Sel, pCtx->gs.Sel, pCtx->eflags.u, 10531 pCtx-> fpu.FSW, pCtx->fpu.FCW, pCtx->fpu.FTW, pCtx->fpu.MXCSR, pCtx->fpu.MXCSR_MASK,10531 pCtx->XState.x87.FSW, pCtx->XState.x87.FCW, pCtx->XState.x87.FTW, pCtx->XState.x87.MXCSR, pCtx->XState.x87.MXCSR_MASK, 10532 10532 szInstr)); 10533 10533 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
r54862 r54898 5436 5436 else 5437 5437 { 5438 #ifdef IN_RING3 5438 5439 CPUMCTX CtxTmp = *pCtx; 5439 5440 rcStrict = CPUMSetGuestMsr(IEMCPU_TO_VMCPU(pIemCpu), pCtx->ecx, uValue.u); … … 5441 5442 *pCtx = *pCtx2; 5442 5443 *pCtx2 = CtxTmp; 5444 #else 5445 AssertReleaseFailedReturn(VERR_INTERNAL_ERROR_4); 5446 #endif 5443 5447 } 5444 5448 if (rcStrict == VINF_SUCCESS) … … 6041 6045 if (iemFRegIsFxSaveFormat(pIemCpu)) 6042 6046 { 6043 pCtx-> fpu.FCW = 0x37f;6044 pCtx-> fpu.FSW = 0;6045 pCtx-> fpu.FTW = 0x00; /* 0 - empty. */6046 pCtx-> fpu.FPUDP = 0;6047 pCtx-> fpu.DS = 0; //??6048 pCtx-> fpu.Rsrvd2= 0;6049 pCtx-> fpu.FPUIP = 0;6050 pCtx-> fpu.CS = 0; //??6051 pCtx-> fpu.Rsrvd1= 0;6052 pCtx-> fpu.FOP = 0;6047 pCtx->XState.x87.FCW = 0x37f; 6048 pCtx->XState.x87.FSW = 0; 6049 pCtx->XState.x87.FTW = 0x00; /* 0 - empty. */ 6050 pCtx->XState.x87.FPUDP = 0; 6051 pCtx->XState.x87.DS = 0; //?? 6052 pCtx->XState.x87.Rsrvd2= 0; 6053 pCtx->XState.x87.FPUIP = 0; 6054 pCtx->XState.x87.CS = 0; //?? 6055 pCtx->XState.x87.Rsrvd1= 0; 6056 pCtx->XState.x87.FOP = 0; 6053 6057 } 6054 6058 else 6055 6059 { 6056 PX86FPUSTATE pFpu = (PX86FPUSTATE)&pCtx-> fpu;6060 PX86FPUSTATE pFpu = (PX86FPUSTATE)&pCtx->XState.x87; 6057 6061 pFpu->FCW = 0x37f; 6058 6062 pFpu->FSW = 0; … … 6117 6121 6118 6122 /* common for all formats */ 6119 pDst->FCW = pCtx-> fpu.FCW;6120 pDst->FSW = pCtx-> fpu.FSW;6121 pDst->FTW = pCtx-> fpu.FTW & UINT16_C(0xff);6122 pDst->FOP = pCtx-> fpu.FOP;6123 pDst->MXCSR = pCtx-> fpu.MXCSR;6124 pDst->MXCSR_MASK = pCtx-> fpu.MXCSR_MASK;6123 pDst->FCW = pCtx->XState.x87.FCW; 6124 pDst->FSW = pCtx->XState.x87.FSW; 6125 pDst->FTW = pCtx->XState.x87.FTW & UINT16_C(0xff); 6126 pDst->FOP = pCtx->XState.x87.FOP; 6127 pDst->MXCSR = pCtx->XState.x87.MXCSR; 6128 pDst->MXCSR_MASK = pCtx->XState.x87.MXCSR_MASK; 6125 6129 for (uint32_t i = 0; i < RT_ELEMENTS(pDst->aRegs); i++) 6126 6130 { 6127 6131 /** @todo Testcase: What actually happens to the 6 reserved bytes? I'm clearing 6128 6132 * them for now... */ 6129 pDst->aRegs[i].au32[0] = pCtx-> fpu.aRegs[i].au32[0];6130 pDst->aRegs[i].au32[1] = pCtx-> fpu.aRegs[i].au32[1];6131 pDst->aRegs[i].au32[2] = pCtx-> fpu.aRegs[i].au32[2] & UINT32_C(0xffff);6133 pDst->aRegs[i].au32[0] = pCtx->XState.x87.aRegs[i].au32[0]; 6134 pDst->aRegs[i].au32[1] = pCtx->XState.x87.aRegs[i].au32[1]; 6135 pDst->aRegs[i].au32[2] = pCtx->XState.x87.aRegs[i].au32[2] & UINT32_C(0xffff); 6132 6136 pDst->aRegs[i].au32[3] = 0; 6133 6137 } 6134 6138 6135 6139 /* FPU IP, CS, DP and DS. */ 6136 pDst->FPUIP = pCtx-> fpu.FPUIP;6137 pDst->CS = pCtx-> fpu.CS;6138 pDst->FPUDP = pCtx-> fpu.FPUDP;6139 pDst->DS = pCtx-> fpu.DS;6140 pDst->FPUIP = pCtx->XState.x87.FPUIP; 6141 pDst->CS = pCtx->XState.x87.CS; 6142 pDst->FPUDP = pCtx->XState.x87.FPUDP; 6143 pDst->DS = pCtx->XState.x87.DS; 6140 6144 if (enmEffOpSize == IEMMODE_64BIT) 6141 6145 { 6142 6146 /* Save upper 16-bits of FPUIP (IP:CS:Rsvd1) and FPUDP (DP:DS:Rsvd2). */ 6143 pDst->Rsrvd1 = pCtx-> fpu.Rsrvd1;6144 pDst->Rsrvd2 = pCtx-> fpu.Rsrvd2;6147 pDst->Rsrvd1 = pCtx->XState.x87.Rsrvd1; 6148 pDst->Rsrvd2 = pCtx->XState.x87.Rsrvd2; 6145 6149 pDst->au32RsrvdForSoftware[0] = 0; 6146 6150 } … … 6159 6163 uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8; 6160 6164 for (uint32_t i = 0; i < cXmmRegs; i++) 6161 pDst->aXMM[i] = pCtx-> fpu.aXMM[i];6165 pDst->aXMM[i] = pCtx->XState.x87.aXMM[i]; 6162 6166 /** @todo Testcase: What happens to the reserved XMM registers? Untouched, 6163 6167 * right? */ … … 6218 6222 */ 6219 6223 uint32_t const fMXCSR = pSrc->MXCSR; 6220 uint32_t const fMXCSR_MASK = pCtx-> fpu.MXCSR_MASK ? pCtx->fpu.MXCSR_MASK : UINT32_C(0xffbf);6224 uint32_t const fMXCSR_MASK = pCtx->XState.x87.MXCSR_MASK ? pCtx->XState.x87.MXCSR_MASK : UINT32_C(0xffbf); 6221 6225 if (fMXCSR & ~fMXCSR_MASK) 6222 6226 { … … 6232 6236 6233 6237 /* common for all formats */ 6234 pCtx-> fpu.FCW = pSrc->FCW;6235 pCtx-> fpu.FSW = pSrc->FSW;6236 pCtx-> fpu.FTW = pSrc->FTW & UINT16_C(0xff);6237 pCtx-> fpu.FOP = pSrc->FOP;6238 pCtx-> fpu.MXCSR = fMXCSR;6238 pCtx->XState.x87.FCW = pSrc->FCW; 6239 pCtx->XState.x87.FSW = pSrc->FSW; 6240 pCtx->XState.x87.FTW = pSrc->FTW & UINT16_C(0xff); 6241 pCtx->XState.x87.FOP = pSrc->FOP; 6242 pCtx->XState.x87.MXCSR = fMXCSR; 6239 6243 /* (MXCSR_MASK is read-only) */ 6240 6244 for (uint32_t i = 0; i < RT_ELEMENTS(pSrc->aRegs); i++) 6241 6245 { 6242 pCtx-> fpu.aRegs[i].au32[0] = pSrc->aRegs[i].au32[0];6243 pCtx-> fpu.aRegs[i].au32[1] = pSrc->aRegs[i].au32[1];6244 pCtx-> fpu.aRegs[i].au32[2] = pSrc->aRegs[i].au32[2] & UINT32_C(0xffff);6245 pCtx-> fpu.aRegs[i].au32[3] = 0;6246 pCtx->XState.x87.aRegs[i].au32[0] = pSrc->aRegs[i].au32[0]; 6247 pCtx->XState.x87.aRegs[i].au32[1] = pSrc->aRegs[i].au32[1]; 6248 pCtx->XState.x87.aRegs[i].au32[2] = pSrc->aRegs[i].au32[2] & UINT32_C(0xffff); 6249 pCtx->XState.x87.aRegs[i].au32[3] = 0; 6246 6250 } 6247 6251 … … 6249 6253 if (pIemCpu->enmCpuMode == IEMMODE_64BIT) 6250 6254 { 6251 pCtx-> fpu.FPUIP = pSrc->FPUIP;6252 pCtx-> fpu.CS = pSrc->CS;6253 pCtx-> fpu.Rsrvd1 = pSrc->Rsrvd1;6254 pCtx-> fpu.FPUDP = pSrc->FPUDP;6255 pCtx-> fpu.DS = pSrc->DS;6256 pCtx-> fpu.Rsrvd2 = pSrc->Rsrvd2;6255 pCtx->XState.x87.FPUIP = pSrc->FPUIP; 6256 pCtx->XState.x87.CS = pSrc->CS; 6257 pCtx->XState.x87.Rsrvd1 = pSrc->Rsrvd1; 6258 pCtx->XState.x87.FPUDP = pSrc->FPUDP; 6259 pCtx->XState.x87.DS = pSrc->DS; 6260 pCtx->XState.x87.Rsrvd2 = pSrc->Rsrvd2; 6257 6261 } 6258 6262 else 6259 6263 { 6260 pCtx-> fpu.FPUIP = pSrc->FPUIP;6261 pCtx-> fpu.CS = pSrc->CS;6262 pCtx-> fpu.Rsrvd1 = 0;6263 pCtx-> fpu.FPUDP = pSrc->FPUDP;6264 pCtx-> fpu.DS = pSrc->DS;6265 pCtx-> fpu.Rsrvd2 = 0;6264 pCtx->XState.x87.FPUIP = pSrc->FPUIP; 6265 pCtx->XState.x87.CS = pSrc->CS; 6266 pCtx->XState.x87.Rsrvd1 = 0; 6267 pCtx->XState.x87.FPUDP = pSrc->FPUDP; 6268 pCtx->XState.x87.DS = pSrc->DS; 6269 pCtx->XState.x87.Rsrvd2 = 0; 6266 6270 } 6267 6271 … … 6273 6277 uint32_t cXmmRegs = enmEffOpSize == IEMMODE_64BIT ? 16 : 8; 6274 6278 for (uint32_t i = 0; i < cXmmRegs; i++) 6275 pCtx-> fpu.aXMM[i] = pSrc->aXMM[i];6279 pCtx->XState.x87.aXMM[i] = pSrc->aXMM[i]; 6276 6280 } 6277 6281 … … 6299 6303 if (enmEffOpSize == IEMMODE_16BIT) 6300 6304 { 6301 uPtr.pu16[0] = pCtx-> fpu.FCW;6302 uPtr.pu16[1] = pCtx-> fpu.FSW;6305 uPtr.pu16[0] = pCtx->XState.x87.FCW; 6306 uPtr.pu16[1] = pCtx->XState.x87.FSW; 6303 6307 uPtr.pu16[2] = iemFpuCalcFullFtw(pCtx); 6304 6308 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) … … 6309 6313 * effective address ((CS << 4) + IP) in the offset register and not 6310 6314 * doing any address calculations here. */ 6311 uPtr.pu16[3] = (uint16_t)pCtx-> fpu.FPUIP;6312 uPtr.pu16[4] = ((pCtx-> fpu.FPUIP >> 4) & UINT16_C(0xf000)) | pCtx->fpu.FOP;6313 uPtr.pu16[5] = (uint16_t)pCtx-> fpu.FPUDP;6314 uPtr.pu16[6] = (pCtx-> fpu.FPUDP >> 4) & UINT16_C(0xf000);6315 uPtr.pu16[3] = (uint16_t)pCtx->XState.x87.FPUIP; 6316 uPtr.pu16[4] = ((pCtx->XState.x87.FPUIP >> 4) & UINT16_C(0xf000)) | pCtx->XState.x87.FOP; 6317 uPtr.pu16[5] = (uint16_t)pCtx->XState.x87.FPUDP; 6318 uPtr.pu16[6] = (pCtx->XState.x87.FPUDP >> 4) & UINT16_C(0xf000); 6315 6319 } 6316 6320 else 6317 6321 { 6318 uPtr.pu16[3] = pCtx-> fpu.FPUIP;6319 uPtr.pu16[4] = pCtx-> fpu.CS;6320 uPtr.pu16[5] = pCtx-> fpu.FPUDP;6321 uPtr.pu16[6] = pCtx-> fpu.DS;6322 uPtr.pu16[3] = pCtx->XState.x87.FPUIP; 6323 uPtr.pu16[4] = pCtx->XState.x87.CS; 6324 uPtr.pu16[5] = pCtx->XState.x87.FPUDP; 6325 uPtr.pu16[6] = pCtx->XState.x87.DS; 6322 6326 } 6323 6327 } … … 6325 6329 { 6326 6330 /** @todo Testcase: what is stored in the "gray" areas? (figure 8-9 and 8-10) */ 6327 uPtr.pu16[0*2] = pCtx-> fpu.FCW;6328 uPtr.pu16[1*2] = pCtx-> fpu.FSW;6331 uPtr.pu16[0*2] = pCtx->XState.x87.FCW; 6332 uPtr.pu16[1*2] = pCtx->XState.x87.FSW; 6329 6333 uPtr.pu16[2*2] = iemFpuCalcFullFtw(pCtx); 6330 6334 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) 6331 6335 { 6332 uPtr.pu16[3*2] = (uint16_t)pCtx-> fpu.FPUIP;6333 uPtr.pu32[4] = ((pCtx-> fpu.FPUIP & UINT32_C(0xffff0000)) >> 4) | pCtx->fpu.FOP;6334 uPtr.pu16[5*2] = (uint16_t)pCtx-> fpu.FPUDP;6335 uPtr.pu32[6] = (pCtx-> fpu.FPUDP & UINT32_C(0xffff0000)) >> 4;6336 uPtr.pu16[3*2] = (uint16_t)pCtx->XState.x87.FPUIP; 6337 uPtr.pu32[4] = ((pCtx->XState.x87.FPUIP & UINT32_C(0xffff0000)) >> 4) | pCtx->XState.x87.FOP; 6338 uPtr.pu16[5*2] = (uint16_t)pCtx->XState.x87.FPUDP; 6339 uPtr.pu32[6] = (pCtx->XState.x87.FPUDP & UINT32_C(0xffff0000)) >> 4; 6336 6340 } 6337 6341 else 6338 6342 { 6339 uPtr.pu32[3] = pCtx-> fpu.FPUIP;6340 uPtr.pu16[4*2] = pCtx-> fpu.CS;6341 uPtr.pu16[4*2+1]= pCtx-> fpu.FOP;6342 uPtr.pu32[5] = pCtx-> fpu.FPUDP;6343 uPtr.pu16[6*2] = pCtx-> fpu.DS;6343 uPtr.pu32[3] = pCtx->XState.x87.FPUIP; 6344 uPtr.pu16[4*2] = pCtx->XState.x87.CS; 6345 uPtr.pu16[4*2+1]= pCtx->XState.x87.FOP; 6346 uPtr.pu32[5] = pCtx->XState.x87.FPUDP; 6347 uPtr.pu16[6*2] = pCtx->XState.x87.DS; 6344 6348 } 6345 6349 } … … 6357 6361 if (enmEffOpSize == IEMMODE_16BIT) 6358 6362 { 6359 pCtx-> fpu.FCW = uPtr.pu16[0];6360 pCtx-> fpu.FSW = uPtr.pu16[1];6361 pCtx-> fpu.FTW = uPtr.pu16[2];6363 pCtx->XState.x87.FCW = uPtr.pu16[0]; 6364 pCtx->XState.x87.FSW = uPtr.pu16[1]; 6365 pCtx->XState.x87.FTW = uPtr.pu16[2]; 6362 6366 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) 6363 6367 { 6364 pCtx-> fpu.FPUIP = uPtr.pu16[3] | ((uint32_t)(uPtr.pu16[4] & UINT16_C(0xf000)) << 4);6365 pCtx-> fpu.FPUDP = uPtr.pu16[5] | ((uint32_t)(uPtr.pu16[6] & UINT16_C(0xf000)) << 4);6366 pCtx-> fpu.FOP = uPtr.pu16[4] & UINT16_C(0x07ff);6367 pCtx-> fpu.CS = 0;6368 pCtx-> fpu.Rsrvd1= 0;6369 pCtx-> fpu.DS = 0;6370 pCtx-> fpu.Rsrvd2= 0;6368 pCtx->XState.x87.FPUIP = uPtr.pu16[3] | ((uint32_t)(uPtr.pu16[4] & UINT16_C(0xf000)) << 4); 6369 pCtx->XState.x87.FPUDP = uPtr.pu16[5] | ((uint32_t)(uPtr.pu16[6] & UINT16_C(0xf000)) << 4); 6370 pCtx->XState.x87.FOP = uPtr.pu16[4] & UINT16_C(0x07ff); 6371 pCtx->XState.x87.CS = 0; 6372 pCtx->XState.x87.Rsrvd1= 0; 6373 pCtx->XState.x87.DS = 0; 6374 pCtx->XState.x87.Rsrvd2= 0; 6371 6375 } 6372 6376 else 6373 6377 { 6374 pCtx-> fpu.FPUIP = uPtr.pu16[3];6375 pCtx-> fpu.CS = uPtr.pu16[4];6376 pCtx-> fpu.Rsrvd1= 0;6377 pCtx-> fpu.FPUDP = uPtr.pu16[5];6378 pCtx-> fpu.DS = uPtr.pu16[6];6379 pCtx-> fpu.Rsrvd2= 0;6378 pCtx->XState.x87.FPUIP = uPtr.pu16[3]; 6379 pCtx->XState.x87.CS = uPtr.pu16[4]; 6380 pCtx->XState.x87.Rsrvd1= 0; 6381 pCtx->XState.x87.FPUDP = uPtr.pu16[5]; 6382 pCtx->XState.x87.DS = uPtr.pu16[6]; 6383 pCtx->XState.x87.Rsrvd2= 0; 6380 6384 /** @todo Testcase: Is FOP cleared when doing 16-bit protected mode fldenv? */ 6381 6385 } … … 6383 6387 else 6384 6388 { 6385 pCtx-> fpu.FCW = uPtr.pu16[0*2];6386 pCtx-> fpu.FSW = uPtr.pu16[1*2];6387 pCtx-> fpu.FTW = uPtr.pu16[2*2];6389 pCtx->XState.x87.FCW = uPtr.pu16[0*2]; 6390 pCtx->XState.x87.FSW = uPtr.pu16[1*2]; 6391 pCtx->XState.x87.FTW = uPtr.pu16[2*2]; 6388 6392 if (IEM_IS_REAL_OR_V86_MODE(pIemCpu)) 6389 6393 { 6390 pCtx-> fpu.FPUIP = uPtr.pu16[3*2] | ((uPtr.pu32[4] & UINT32_C(0x0ffff000)) << 4);6391 pCtx-> fpu.FOP = uPtr.pu32[4] & UINT16_C(0x07ff);6392 pCtx-> fpu.FPUDP = uPtr.pu16[5*2] | ((uPtr.pu32[6] & UINT32_C(0x0ffff000)) << 4);6393 pCtx-> fpu.CS = 0;6394 pCtx-> fpu.Rsrvd1= 0;6395 pCtx-> fpu.DS = 0;6396 pCtx-> fpu.Rsrvd2= 0;6394 pCtx->XState.x87.FPUIP = uPtr.pu16[3*2] | ((uPtr.pu32[4] & UINT32_C(0x0ffff000)) << 4); 6395 pCtx->XState.x87.FOP = uPtr.pu32[4] & UINT16_C(0x07ff); 6396 pCtx->XState.x87.FPUDP = uPtr.pu16[5*2] | ((uPtr.pu32[6] & UINT32_C(0x0ffff000)) << 4); 6397 pCtx->XState.x87.CS = 0; 6398 pCtx->XState.x87.Rsrvd1= 0; 6399 pCtx->XState.x87.DS = 0; 6400 pCtx->XState.x87.Rsrvd2= 0; 6397 6401 } 6398 6402 else 6399 6403 { 6400 pCtx-> fpu.FPUIP = uPtr.pu32[3];6401 pCtx-> fpu.CS = uPtr.pu16[4*2];6402 pCtx-> fpu.Rsrvd1= 0;6403 pCtx-> fpu.FOP = uPtr.pu16[4*2+1];6404 pCtx-> fpu.FPUDP = uPtr.pu32[5];6405 pCtx-> fpu.DS = uPtr.pu16[6*2];6406 pCtx-> fpu.Rsrvd2= 0;6404 pCtx->XState.x87.FPUIP = uPtr.pu32[3]; 6405 pCtx->XState.x87.CS = uPtr.pu16[4*2]; 6406 pCtx->XState.x87.Rsrvd1= 0; 6407 pCtx->XState.x87.FOP = uPtr.pu16[4*2+1]; 6408 pCtx->XState.x87.FPUDP = uPtr.pu32[5]; 6409 pCtx->XState.x87.DS = uPtr.pu16[6*2]; 6410 pCtx->XState.x87.Rsrvd2= 0; 6407 6411 } 6408 6412 } 6409 6413 6410 6414 /* Make adjustments. */ 6411 pCtx-> fpu.FTW = iemFpuCompressFtw(pCtx->fpu.FTW);6412 pCtx-> fpu.FCW &= ~X86_FCW_ZERO_MASK;6415 pCtx->XState.x87.FTW = iemFpuCompressFtw(pCtx->XState.x87.FTW); 6416 pCtx->XState.x87.FCW &= ~X86_FCW_ZERO_MASK; 6413 6417 iemFpuRecalcExceptionStatus(pCtx); 6414 6418 /** @todo Testcase: Check if ES and/or B are automatically cleared if no … … 6462 6466 iemCImplCommonFpuStoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx); 6463 6467 PRTFLOAT80U paRegs = (PRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28)); 6464 for (uint32_t i = 0; i < RT_ELEMENTS(pCtx-> fpu.aRegs); i++)6465 { 6466 paRegs[i].au32[0] = pCtx-> fpu.aRegs[i].au32[0];6467 paRegs[i].au32[1] = pCtx-> fpu.aRegs[i].au32[1];6468 paRegs[i].au16[4] = pCtx-> fpu.aRegs[i].au16[4];6468 for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->XState.x87.aRegs); i++) 6469 { 6470 paRegs[i].au32[0] = pCtx->XState.x87.aRegs[i].au32[0]; 6471 paRegs[i].au32[1] = pCtx->XState.x87.aRegs[i].au32[1]; 6472 paRegs[i].au16[4] = pCtx->XState.x87.aRegs[i].au16[4]; 6469 6473 } 6470 6474 … … 6474 6478 6475 6479 /* 6476 * Re-initialize the FPU.6477 */ 6478 pCtx-> fpu.FCW = 0x37f;6479 pCtx-> fpu.FSW = 0;6480 pCtx-> fpu.FTW = 0x00; /* 0 - empty */6481 pCtx-> fpu.FPUDP = 0;6482 pCtx-> fpu.DS = 0;6483 pCtx-> fpu.Rsrvd2= 0;6484 pCtx-> fpu.FPUIP = 0;6485 pCtx-> fpu.CS = 0;6486 pCtx-> fpu.Rsrvd1= 0;6487 pCtx-> fpu.FOP = 0;6480 * Re-initialize the XState.x87. 6481 */ 6482 pCtx->XState.x87.FCW = 0x37f; 6483 pCtx->XState.x87.FSW = 0; 6484 pCtx->XState.x87.FTW = 0x00; /* 0 - empty */ 6485 pCtx->XState.x87.FPUDP = 0; 6486 pCtx->XState.x87.DS = 0; 6487 pCtx->XState.x87.Rsrvd2= 0; 6488 pCtx->XState.x87.FPUIP = 0; 6489 pCtx->XState.x87.CS = 0; 6490 pCtx->XState.x87.Rsrvd1= 0; 6491 pCtx->XState.x87.FOP = 0; 6488 6492 6489 6493 iemHlpUsedFpu(pIemCpu); … … 6539 6543 iemCImplCommonFpuRestoreEnv(pIemCpu, enmEffOpSize, uPtr, pCtx); 6540 6544 PCRTFLOAT80U paRegs = (PCRTFLOAT80U)(uPtr.pu8 + (enmEffOpSize == IEMMODE_16BIT ? 14 : 28)); 6541 for (uint32_t i = 0; i < RT_ELEMENTS(pCtx-> fpu.aRegs); i++)6542 { 6543 pCtx-> fpu.aRegs[i].au32[0] = paRegs[i].au32[0];6544 pCtx-> fpu.aRegs[i].au32[1] = paRegs[i].au32[1];6545 pCtx-> fpu.aRegs[i].au32[2] = paRegs[i].au16[4];6546 pCtx-> fpu.aRegs[i].au32[3] = 0;6545 for (uint32_t i = 0; i < RT_ELEMENTS(pCtx->XState.x87.aRegs); i++) 6546 { 6547 pCtx->XState.x87.aRegs[i].au32[0] = paRegs[i].au32[0]; 6548 pCtx->XState.x87.aRegs[i].au32[1] = paRegs[i].au32[1]; 6549 pCtx->XState.x87.aRegs[i].au32[2] = paRegs[i].au16[4]; 6550 pCtx->XState.x87.aRegs[i].au32[3] = 0; 6547 6551 } 6548 6552 … … 6571 6575 /** @todo Testcase: Test that it raises and loweres the FPU exception bits 6572 6576 * according to FSW. (This is was is currently implemented.) */ 6573 pCtx-> fpu.FCW = u16Fcw & ~X86_FCW_ZERO_MASK;6577 pCtx->XState.x87.FCW = u16Fcw & ~X86_FCW_ZERO_MASK; 6574 6578 iemFpuRecalcExceptionStatus(pCtx); 6575 6579 … … 6591 6595 PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx); 6592 6596 6593 unsigned const iReg1 = X86_FSW_TOP_GET(pCtx-> fpu.FSW);6597 unsigned const iReg1 = X86_FSW_TOP_GET(pCtx->XState.x87.FSW); 6594 6598 unsigned const iReg2 = (iReg1 + iStReg) & X86_FSW_TOP_SMASK; 6595 Assert(!(RT_BIT(iReg1) & pCtx-> fpu.FTW) || !(RT_BIT(iReg2) & pCtx->fpu.FTW));6599 Assert(!(RT_BIT(iReg1) & pCtx->XState.x87.FTW) || !(RT_BIT(iReg2) & pCtx->XState.x87.FTW)); 6596 6600 6597 6601 /** @todo Testcase: fxch underflow. Making assumptions that underflowed 6598 6602 * registers are read as QNaN and then exchanged. This could be 6599 6603 * wrong... */ 6600 if (pCtx-> fpu.FCW & X86_FCW_IM)6601 { 6602 if (RT_BIT(iReg1) & pCtx-> fpu.FTW)6603 { 6604 if (RT_BIT(iReg2) & pCtx-> fpu.FTW)6605 iemFpuStoreQNan(&pCtx-> fpu.aRegs[0].r80);6604 if (pCtx->XState.x87.FCW & X86_FCW_IM) 6605 { 6606 if (RT_BIT(iReg1) & pCtx->XState.x87.FTW) 6607 { 6608 if (RT_BIT(iReg2) & pCtx->XState.x87.FTW) 6609 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80); 6606 6610 else 6607 pCtx-> fpu.aRegs[0].r80 = pCtx->fpu.aRegs[iStReg].r80;6608 iemFpuStoreQNan(&pCtx-> fpu.aRegs[iStReg].r80);6611 pCtx->XState.x87.aRegs[0].r80 = pCtx->XState.x87.aRegs[iStReg].r80; 6612 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[iStReg].r80); 6609 6613 } 6610 6614 else 6611 6615 { 6612 pCtx-> fpu.aRegs[iStReg].r80 = pCtx->fpu.aRegs[0].r80;6613 iemFpuStoreQNan(&pCtx-> fpu.aRegs[0].r80);6614 } 6615 pCtx-> fpu.FSW &= ~X86_FSW_C_MASK;6616 pCtx-> fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF;6616 pCtx->XState.x87.aRegs[iStReg].r80 = pCtx->XState.x87.aRegs[0].r80; 6617 iemFpuStoreQNan(&pCtx->XState.x87.aRegs[0].r80); 6618 } 6619 pCtx->XState.x87.FSW &= ~X86_FSW_C_MASK; 6620 pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF; 6617 6621 } 6618 6622 else 6619 6623 { 6620 6624 /* raise underflow exception, don't change anything. */ 6621 pCtx-> fpu.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_XCPT_MASK);6622 pCtx-> fpu.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;6625 pCtx->XState.x87.FSW &= ~(X86_FSW_TOP_MASK | X86_FSW_XCPT_MASK); 6626 pCtx->XState.x87.FSW |= X86_FSW_C1 | X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 6623 6627 } 6624 6628 … … 6645 6649 if (pCtx->cr0 & (X86_CR0_EM | X86_CR0_TS)) 6646 6650 return iemRaiseDeviceNotAvailable(pIemCpu); 6647 uint16_t u16Fsw = pCtx-> fpu.FSW;6651 uint16_t u16Fsw = pCtx->XState.x87.FSW; 6648 6652 if (u16Fsw & X86_FSW_ES) 6649 6653 return iemRaiseMathFault(pIemCpu); … … 6654 6658 unsigned const iReg1 = X86_FSW_TOP_GET(u16Fsw); 6655 6659 unsigned const iReg2 = (iReg1 + iStReg) & X86_FSW_TOP_SMASK; 6656 if ((pCtx->fpu.FTW & (RT_BIT(iReg1) | RT_BIT(iReg2))) == (RT_BIT(iReg1) | RT_BIT(iReg2))) 6657 { 6658 uint32_t u32Eflags = pfnAImpl(&pCtx->fpu, &u16Fsw, &pCtx->fpu.aRegs[0].r80, &pCtx->fpu.aRegs[iStReg].r80); 6660 if ((pCtx->XState.x87.FTW & (RT_BIT(iReg1) | RT_BIT(iReg2))) == (RT_BIT(iReg1) | RT_BIT(iReg2))) 6661 { 6662 uint32_t u32Eflags = pfnAImpl(&pCtx->XState.x87, &u16Fsw, 6663 &pCtx->XState.x87.aRegs[0].r80, &pCtx->XState.x87.aRegs[iStReg].r80); 6659 6664 NOREF(u32Eflags); 6660 6665 6661 pCtx-> fpu.FSW &= ~X86_FSW_C1;6662 pCtx-> fpu.FSW |= u16Fsw & ~X86_FSW_TOP_MASK;6666 pCtx->XState.x87.FSW &= ~X86_FSW_C1; 6667 pCtx->XState.x87.FSW |= u16Fsw & ~X86_FSW_TOP_MASK; 6663 6668 if ( !(u16Fsw & X86_FSW_IE) 6664 || (pCtx-> fpu.FCW & X86_FCW_IM) )6669 || (pCtx->XState.x87.FCW & X86_FCW_IM) ) 6665 6670 { 6666 6671 pCtx->eflags.u &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF); … … 6668 6673 } 6669 6674 } 6670 else if (pCtx-> fpu.FCW & X86_FCW_IM)6675 else if (pCtx->XState.x87.FCW & X86_FCW_IM) 6671 6676 { 6672 6677 /* Masked underflow. */ 6673 pCtx-> fpu.FSW &= ~X86_FSW_C1;6674 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF;6678 pCtx->XState.x87.FSW &= ~X86_FSW_C1; 6679 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF; 6675 6680 pCtx->eflags.u &= ~(X86_EFL_OF | X86_EFL_SF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF); 6676 6681 pCtx->eflags.u |= X86_EFL_ZF | X86_EFL_PF | X86_EFL_CF; … … 6679 6684 { 6680 6685 /* Raise underflow - don't touch EFLAGS or TOP. */ 6681 pCtx-> fpu.FSW &= ~X86_FSW_C1;6682 pCtx-> fpu.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B;6686 pCtx->XState.x87.FSW &= ~X86_FSW_C1; 6687 pCtx->XState.x87.FSW |= X86_FSW_IE | X86_FSW_SF | X86_FSW_ES | X86_FSW_B; 6683 6688 fPop = false; 6684 6689 } … … 6689 6694 if (fPop) 6690 6695 { 6691 pCtx-> fpu.FTW &= ~RT_BIT(iReg1);6692 pCtx-> fpu.FSW &= X86_FSW_TOP_MASK;6693 pCtx-> fpu.FSW |= ((iReg1 + 7) & X86_FSW_TOP_SMASK) << X86_FSW_TOP_SHIFT;6696 pCtx->XState.x87.FTW &= ~RT_BIT(iReg1); 6697 pCtx->XState.x87.FSW &= X86_FSW_TOP_MASK; 6698 pCtx->XState.x87.FSW |= ((iReg1 + 7) & X86_FSW_TOP_SMASK) << X86_FSW_TOP_SHIFT; 6694 6699 } 6695 6700 -
trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp
r54862 r54898 488 488 * We could just all this in assembly. */ 489 489 uint128_t aGuestXmmRegs[16]; 490 memcpy(&aGuestXmmRegs[0], &pVCpu->cpum.s.Guest. fpu.aXMM[0], sizeof(aGuestXmmRegs));490 memcpy(&aGuestXmmRegs[0], &pVCpu->cpum.s.Guest.XState.x87.aXMM[0], sizeof(aGuestXmmRegs)); 491 491 #endif 492 492 … … 511 511 512 512 #ifdef VBOX_WITH_KERNEL_USING_XMM 513 memcpy(&pVCpu->cpum.s.Guest. fpu.aXMM[0], &aGuestXmmRegs[0], sizeof(aGuestXmmRegs));513 memcpy(&pVCpu->cpum.s.Guest.XState.x87.aXMM[0], &aGuestXmmRegs[0], sizeof(aGuestXmmRegs)); 514 514 #endif 515 515 } -
trunk/src/VBox/VMM/VMMR0/CPUMR0A.asm
r54674 r54898 90 90 ffree st7 ; Clear FPU stack register(7)'s tag entry to prevent overflow if a wraparound occurs 91 91 ; for the upcoming push (load) 92 fild dword [xDX + CPUMCPU.Guest. fpu] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.92 fild dword [xDX + CPUMCPU.Guest.XState] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU. 93 93 94 94 .nothing_to_clean: … … 101 101 ; @remarks Requires CPUMCPU pointer in RDX 102 102 %macro SAVE_32_OR_64_FPU 0 103 o64 fxsave [rdx + CPUMCPU.Guest. fpu]103 o64 fxsave [rdx + CPUMCPU.Guest.XState] 104 104 105 105 ; Shouldn't be necessary to check if the entire 64-bit FIP is 0 (i.e. guest hasn't used its FPU yet) because it should 106 106 ; be taken care of by the calling code, i.e. hmR0[Vmx|Svm]LoadSharedCR0() and hmR0[Vmx|Svm]ExitXcptNm() which ensure 107 107 ; we swap the guest FPU state when it starts using it (#NM). In any case it's only a performance optimization. 108 ; cmp qword [rdx + CPUMCPU.Guest. fpu+ IP_OFF_IN_X86FXSTATE], 0108 ; cmp qword [rdx + CPUMCPU.Guest.XState + IP_OFF_IN_X86FXSTATE], 0 109 109 ; je short %%save_done 110 110 111 cmp dword [rdx + CPUMCPU.Guest. fpu+ CS_OFF_IN_X86FXSTATE], 0111 cmp dword [rdx + CPUMCPU.Guest.XState + CS_OFF_IN_X86FXSTATE], 0 112 112 jne short %%save_done 113 113 sub rsp, 20h ; Only need 1ch bytes but keep stack aligned otherwise we #GP(0) 114 114 fnstenv [rsp] 115 115 movzx eax, word [rsp + 10h] 116 mov [rdx + CPUMCPU.Guest. fpu+ CS_OFF_IN_X86FXSTATE], eax116 mov [rdx + CPUMCPU.Guest.XState + CS_OFF_IN_X86FXSTATE], eax 117 117 movzx eax, word [rsp + 18h] 118 mov [rdx + CPUMCPU.Guest. fpu+ DS_OFF_IN_X86FXSTATE], eax118 mov [rdx + CPUMCPU.Guest.XState + DS_OFF_IN_X86FXSTATE], eax 119 119 add rsp, 20h 120 mov dword [rdx + CPUMCPU.Guest. fpu+ X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC120 mov dword [rdx + CPUMCPU.Guest.XState + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC 121 121 %%save_done: 122 122 %endmacro … … 127 127 ; @remarks Requires CPUMCPU pointer in RDX 128 128 %macro RESTORE_32_OR_64_FPU 0 129 cmp dword [rdx + CPUMCPU.Guest. fpu+ X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC129 cmp dword [rdx + CPUMCPU.Guest.XState + X86_OFF_FXSTATE_RSVD], X86_FXSTATE_RSVD_32BIT_MAGIC 130 130 jne short %%restore_64bit_fpu 131 fxrstor [rdx + CPUMCPU.Guest. fpu]131 fxrstor [rdx + CPUMCPU.Guest.XState] 132 132 jmp short %%restore_fpu_done 133 133 %%restore_64bit_fpu: 134 o64 fxrstor [rdx + CPUMCPU.Guest. fpu]134 o64 fxrstor [rdx + CPUMCPU.Guest.XState] 135 135 %%restore_fpu_done: 136 136 %endmacro … … 201 201 %ifdef RT_ARCH_AMD64 202 202 ; Use explicit REX prefix. See @bugref{6398}. 203 o64 fxsave [rdx + CPUMCPU.Host. fpu]; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)203 o64 fxsave [rdx + CPUMCPU.Host.XState] ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption) 204 204 205 205 ; Restore the guest FPU (32-bit or 64-bit), preserves existing broken state. See @bugref{7138}. 206 206 test dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE 207 207 jnz short .fpu_load_32_or_64 208 fxrstor [rdx + CPUMCPU.Guest. fpu]208 fxrstor [rdx + CPUMCPU.Guest.XState] 209 209 jmp short .fpu_load_done 210 210 .fpu_load_32_or_64: … … 212 212 .fpu_load_done: 213 213 %else 214 fxsave [edx + CPUMCPU.Host. fpu]; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption)215 fxrstor [edx + CPUMCPU.Guest. fpu]214 fxsave [edx + CPUMCPU.Host.XState] ; ASSUMES that all VT-x/AMD-V boxes sports fxsave/fxrstor (safe assumption) 215 fxrstor [edx + CPUMCPU.Guest.XState] 216 216 %endif 217 217 218 218 %ifdef VBOX_WITH_KERNEL_USING_XMM 219 219 ; Restore the non-volatile xmm registers. ASSUMING 64-bit windows 220 lea r11, [xDX + CPUMCPU.Host. fpu+ XMM_OFF_IN_X86FXSTATE]220 lea r11, [xDX + CPUMCPU.Host.XState + XMM_OFF_IN_X86FXSTATE] 221 221 movdqa xmm6, [r11 + 060h] 222 222 movdqa xmm7, [r11 + 070h] … … 243 243 .sixtyfourbit_mode: 244 244 and edx, 0ffffffffh 245 o64 fxsave [rdx + CPUMCPU.Host. fpu]245 o64 fxsave [rdx + CPUMCPU.Host.XState] 246 246 247 247 ; Restore the guest FPU (32-bit or 64-bit), preserves existing broken state. See @bugref{7138}. 248 248 test dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE 249 249 jnz short .fpu_load_32_or_64_darwin 250 fxrstor [rdx + CPUMCPU.Guest. fpu]250 fxrstor [rdx + CPUMCPU.Guest.XState] 251 251 jmp short .fpu_load_done_darwin 252 252 .fpu_load_32_or_64_darwin: … … 284 284 ; Do NOT use xCX from this point! 285 285 286 fxsave [xDX + CPUMCPU.Host. fpu]; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)286 fxsave [xDX + CPUMCPU.Host.XState] ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption) 287 287 288 288 ; Restore CR0 from xCX if it was saved previously. … … 340 340 test dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE 341 341 jnz short .fpu_save_32_or_64 342 fxsave [rdx + CPUMCPU.Guest. fpu]342 fxsave [rdx + CPUMCPU.Guest.XState] 343 343 jmp short .fpu_save_done 344 344 .fpu_save_32_or_64: … … 347 347 348 348 ; Use explicit REX prefix. See @bugref{6398}. 349 o64 fxrstor [rdx + CPUMCPU.Host. fpu]350 %else 351 fxsave [edx + CPUMCPU.Guest. fpu]; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption)352 fxrstor [edx + CPUMCPU.Host. fpu]349 o64 fxrstor [rdx + CPUMCPU.Host.XState] 350 %else 351 fxsave [edx + CPUMCPU.Guest.XState] ; ASSUMES that all VT-x/AMD-V boxes support fxsave/fxrstor (safe assumption) 352 fxrstor [edx + CPUMCPU.Host.XState] 353 353 %endif 354 354 … … 371 371 test dword [rdx + CPUMCPU.fUseFlags], CPUM_USE_SUPPORTS_LONGMODE 372 372 jnz short .fpu_save_32_or_64_darwin 373 fxsave [rdx + CPUMCPU.Guest. fpu]373 fxsave [rdx + CPUMCPU.Guest.XState] 374 374 jmp short .fpu_save_done_darwin 375 375 .fpu_save_32_or_64_darwin: … … 377 377 .fpu_save_done_darwin: 378 378 379 o64 fxrstor [rdx + CPUMCPU.Host. fpu]379 o64 fxrstor [rdx + CPUMCPU.Host.XState] 380 380 jmp far [.fpret wrt rip] 381 381 .fpret: ; 16:32 Pointer to .the_end. … … 425 425 426 426 %ifdef RT_ARCH_AMD64 427 o64 fxrstor [xDX + CPUMCPU.Host. fpu]428 %else 429 fxrstor [xDX + CPUMCPU.Host. fpu]427 o64 fxrstor [xDX + CPUMCPU.Host.XState] 428 %else 429 fxrstor [xDX + CPUMCPU.Host.XState] 430 430 %endif 431 431 … … 444 444 .sixtyfourbit_mode: 445 445 and edx, 0ffffffffh 446 o64 fxrstor [rdx + CPUMCPU.Host. fpu]446 o64 fxrstor [rdx + CPUMCPU.Host.XState] 447 447 jmp far [.fpret wrt rip] 448 448 .fpret: ; 16:32 Pointer to .the_end. -
trunk/src/VBox/VMM/VMMR0/HMR0.cpp
r54712 r54898 1976 1976 "FPUDP=%04x DS=%04x Rsvrd2=%04x MXCSR=%08x MXCSR_MASK=%08x\n" 1977 1977 , 1978 pCtx-> fpu.FCW, pCtx->fpu.FSW, pCtx->fpu.FTW,1979 pCtx-> fpu.FOP, pCtx->fpu.FPUIP, pCtx->fpu.CS, pCtx->fpu.Rsrvd1,1980 pCtx-> fpu.FPUDP, pCtx->fpu.DS, pCtx->fpu.Rsrvd2,1981 pCtx-> fpu.MXCSR, pCtx->fpu.MXCSR_MASK));1978 pCtx->XState.x87.FCW, pCtx->XState.x87.FSW, pCtx->XState.x87.FTW, 1979 pCtx->XState.x87.FOP, pCtx->XState.x87.FPUIP, pCtx->XState.x87.CS, pCtx->XState.x87.Rsrvd1, 1980 pCtx->XState.x87.FPUDP, pCtx->XState.x87.DS, pCtx->XState.x87.Rsrvd2, 1981 pCtx->XState.x87.MXCSR, pCtx->XState.x87.MXCSR_MASK)); 1982 1982 1983 1983 Log(("MSR:\n" -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r54862 r54898 114 114 static const SSMFIELD g_aCpumCtxFields[] = 115 115 { 116 SSMFIELD_ENTRY( CPUMCTX, fpu.FCW),117 SSMFIELD_ENTRY( CPUMCTX, fpu.FSW),118 SSMFIELD_ENTRY( CPUMCTX, fpu.FTW),119 SSMFIELD_ENTRY( CPUMCTX, fpu.FOP),120 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUIP),121 SSMFIELD_ENTRY( CPUMCTX, fpu.CS),122 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd1),123 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUDP),124 SSMFIELD_ENTRY( CPUMCTX, fpu.DS),125 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd2),126 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR),127 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR_MASK),128 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[0]),129 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[1]),130 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[2]),131 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[3]),132 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[4]),133 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[5]),134 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[6]),135 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[7]),136 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[0]),137 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[1]),138 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[2]),139 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[3]),140 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[4]),141 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[5]),142 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[6]),143 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[7]),144 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[8]),145 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[9]),146 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[10]),147 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[11]),148 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[12]),149 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[13]),150 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[14]),151 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[15]),116 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FCW), 117 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FSW), 118 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FTW), 119 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FOP), 120 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUIP), 121 SSMFIELD_ENTRY( CPUMCTX, XState.x87.CS), 122 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd1), 123 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUDP), 124 SSMFIELD_ENTRY( CPUMCTX, XState.x87.DS), 125 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd2), 126 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR), 127 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR_MASK), 128 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[0]), 129 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[1]), 130 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[2]), 131 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[3]), 132 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[4]), 133 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[5]), 134 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[6]), 135 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[7]), 136 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[0]), 137 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[1]), 138 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[2]), 139 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[3]), 140 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[4]), 141 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[5]), 142 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[6]), 143 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[7]), 144 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[8]), 145 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[9]), 146 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[10]), 147 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[11]), 148 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[12]), 149 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[13]), 150 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[14]), 151 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[15]), 152 152 SSMFIELD_ENTRY( CPUMCTX, rdi), 153 153 SSMFIELD_ENTRY( CPUMCTX, rsi), … … 248 248 static const SSMFIELD g_aCpumCtxFieldsMem[] = 249 249 { 250 SSMFIELD_ENTRY( CPUMCTX, fpu.FCW),251 SSMFIELD_ENTRY( CPUMCTX, fpu.FSW),252 SSMFIELD_ENTRY( CPUMCTX, fpu.FTW),253 SSMFIELD_ENTRY( CPUMCTX, fpu.FOP),254 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUIP),255 SSMFIELD_ENTRY( CPUMCTX, fpu.CS),256 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd1),257 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUDP),258 SSMFIELD_ENTRY( CPUMCTX, fpu.DS),259 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd2),260 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR),261 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR_MASK),262 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[0]),263 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[1]),264 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[2]),265 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[3]),266 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[4]),267 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[5]),268 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[6]),269 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[7]),270 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[0]),271 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[1]),272 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[2]),273 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[3]),274 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[4]),275 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[5]),276 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[6]),277 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[7]),278 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[8]),279 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[9]),280 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[10]),281 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[11]),282 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[12]),283 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[13]),284 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[14]),285 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[15]),286 SSMFIELD_ENTRY_IGNORE( CPUMCTX, fpu.au32RsrvdRest),250 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FCW), 251 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FSW), 252 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FTW), 253 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FOP), 254 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUIP), 255 SSMFIELD_ENTRY( CPUMCTX, XState.x87.CS), 256 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd1), 257 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUDP), 258 SSMFIELD_ENTRY( CPUMCTX, XState.x87.DS), 259 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd2), 260 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR), 261 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR_MASK), 262 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[0]), 263 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[1]), 264 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[2]), 265 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[3]), 266 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[4]), 267 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[5]), 268 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[6]), 269 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[7]), 270 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[0]), 271 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[1]), 272 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[2]), 273 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[3]), 274 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[4]), 275 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[5]), 276 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[6]), 277 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[7]), 278 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[8]), 279 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[9]), 280 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[10]), 281 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[11]), 282 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[12]), 283 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[13]), 284 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[14]), 285 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[15]), 286 SSMFIELD_ENTRY_IGNORE( CPUMCTX, XState.x87.au32RsrvdRest), 287 287 SSMFIELD_ENTRY( CPUMCTX, rdi), 288 288 SSMFIELD_ENTRY( CPUMCTX, rsi), … … 378 378 static const SSMFIELD g_aCpumCtxFieldsV16[] = 379 379 { 380 SSMFIELD_ENTRY( CPUMCTX, fpu.FCW),381 SSMFIELD_ENTRY( CPUMCTX, fpu.FSW),382 SSMFIELD_ENTRY( CPUMCTX, fpu.FTW),383 SSMFIELD_ENTRY( CPUMCTX, fpu.FOP),384 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUIP),385 SSMFIELD_ENTRY( CPUMCTX, fpu.CS),386 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd1),387 SSMFIELD_ENTRY( CPUMCTX, fpu.FPUDP),388 SSMFIELD_ENTRY( CPUMCTX, fpu.DS),389 SSMFIELD_ENTRY( CPUMCTX, fpu.Rsrvd2),390 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR),391 SSMFIELD_ENTRY( CPUMCTX, fpu.MXCSR_MASK),392 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[0]),393 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[1]),394 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[2]),395 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[3]),396 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[4]),397 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[5]),398 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[6]),399 SSMFIELD_ENTRY( CPUMCTX, fpu.aRegs[7]),400 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[0]),401 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[1]),402 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[2]),403 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[3]),404 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[4]),405 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[5]),406 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[6]),407 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[7]),408 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[8]),409 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[9]),410 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[10]),411 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[11]),412 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[12]),413 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[13]),414 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[14]),415 SSMFIELD_ENTRY( CPUMCTX, fpu.aXMM[15]),416 SSMFIELD_ENTRY_IGNORE( CPUMCTX, fpu.au32RsrvdRest),380 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FCW), 381 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FSW), 382 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FTW), 383 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FOP), 384 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUIP), 385 SSMFIELD_ENTRY( CPUMCTX, XState.x87.CS), 386 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd1), 387 SSMFIELD_ENTRY( CPUMCTX, XState.x87.FPUDP), 388 SSMFIELD_ENTRY( CPUMCTX, XState.x87.DS), 389 SSMFIELD_ENTRY( CPUMCTX, XState.x87.Rsrvd2), 390 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR), 391 SSMFIELD_ENTRY( CPUMCTX, XState.x87.MXCSR_MASK), 392 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[0]), 393 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[1]), 394 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[2]), 395 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[3]), 396 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[4]), 397 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[5]), 398 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[6]), 399 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aRegs[7]), 400 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[0]), 401 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[1]), 402 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[2]), 403 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[3]), 404 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[4]), 405 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[5]), 406 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[6]), 407 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[7]), 408 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[8]), 409 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[9]), 410 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[10]), 411 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[11]), 412 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[12]), 413 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[13]), 414 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[14]), 415 SSMFIELD_ENTRY( CPUMCTX, XState.x87.aXMM[15]), 416 SSMFIELD_ENTRY_IGNORE( CPUMCTX, XState.x87.au32RsrvdRest), 417 417 SSMFIELD_ENTRY( CPUMCTX, rdi), 418 418 SSMFIELD_ENTRY( CPUMCTX, rsi), … … 842 842 pCtx->dr[7] = X86_DR7_INIT_VAL; 843 843 844 pCtx-> fpu.FTW= 0x00; /* All empty (abbridged tag reg edition). */845 pCtx-> fpu.FCW= 0x37f;844 pCtx->XState.x87.FTW = 0x00; /* All empty (abbridged tag reg edition). */ 845 pCtx->XState.x87.FCW = 0x37f; 846 846 847 847 /* Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3A, Table 8-1. 848 848 IA-32 Processor States Following Power-up, Reset, or INIT */ 849 pCtx-> fpu.MXCSR= 0x1F80;850 pCtx-> fpu.MXCSR_MASK= 0xffff; /** @todo REM always changed this for us. Should probably check if the HW really849 pCtx->XState.x87.MXCSR = 0x1F80; 850 pCtx->XState.x87.MXCSR_MASK = 0xffff; /** @todo REM always changed this for us. Should probably check if the HW really 851 851 supports all bits, since a zero value here should be read as 0xffbf. */ 852 852 … … 1521 1521 "%sFPUIP=%08x %sCS=%04x %sRsrvd1=%04x %sFPUDP=%08x %sDS=%04x %sRsvrd2=%04x\n" 1522 1522 , 1523 pszPrefix, pCtx-> fpu.FCW, pszPrefix, pCtx->fpu.FSW, pszPrefix, pCtx->fpu.FTW, pszPrefix, pCtx->fpu.FOP,1524 pszPrefix, pCtx-> fpu.MXCSR, pszPrefix, pCtx->fpu.MXCSR_MASK,1525 pszPrefix, pCtx-> fpu.FPUIP, pszPrefix, pCtx->fpu.CS, pszPrefix, pCtx->fpu.Rsrvd1,1526 pszPrefix, pCtx-> fpu.FPUDP, pszPrefix, pCtx->fpu.DS, pszPrefix, pCtx->fpu.Rsrvd21523 pszPrefix, pCtx->XState.x87.FCW, pszPrefix, pCtx->XState.x87.FSW, pszPrefix, pCtx->XState.x87.FTW, pszPrefix, pCtx->XState.x87.FOP, 1524 pszPrefix, pCtx->XState.x87.MXCSR, pszPrefix, pCtx->XState.x87.MXCSR_MASK, 1525 pszPrefix, pCtx->XState.x87.FPUIP, pszPrefix, pCtx->XState.x87.CS, pszPrefix, pCtx->XState.x87.Rsrvd1, 1526 pszPrefix, pCtx->XState.x87.FPUDP, pszPrefix, pCtx->XState.x87.DS, pszPrefix, pCtx->XState.x87.Rsrvd2 1527 1527 ); 1528 unsigned iShift = (pCtx-> fpu.FSW >> 11) & 7;1529 for (unsigned iST = 0; iST < RT_ELEMENTS(pCtx-> fpu.aRegs); iST++)1528 unsigned iShift = (pCtx->XState.x87.FSW >> 11) & 7; 1529 for (unsigned iST = 0; iST < RT_ELEMENTS(pCtx->XState.x87.aRegs); iST++) 1530 1530 { 1531 unsigned iFPR = (iST + iShift) % RT_ELEMENTS(pCtx-> fpu.aRegs);1532 unsigned uTag = pCtx-> fpu.FTW & (1 << iFPR) ? 1 : 0;1533 char chSign = pCtx-> fpu.aRegs[0].au16[4] & 0x8000 ? '-' : '+';1534 unsigned iInteger = (unsigned)(pCtx-> fpu.aRegs[0].au64[0] >> 63);1535 uint64_t u64Fraction = pCtx-> fpu.aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff);1536 unsigned uExponent = pCtx-> fpu.aRegs[0].au16[4] & 0x7fff;1531 unsigned iFPR = (iST + iShift) % RT_ELEMENTS(pCtx->XState.x87.aRegs); 1532 unsigned uTag = pCtx->XState.x87.FTW & (1 << iFPR) ? 1 : 0; 1533 char chSign = pCtx->XState.x87.aRegs[0].au16[4] & 0x8000 ? '-' : '+'; 1534 unsigned iInteger = (unsigned)(pCtx->XState.x87.aRegs[0].au64[0] >> 63); 1535 uint64_t u64Fraction = pCtx->XState.x87.aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff); 1536 unsigned uExponent = pCtx->XState.x87.aRegs[0].au16[4] & 0x7fff; 1537 1537 /** @todo This isn't entirenly correct and needs more work! */ 1538 1538 pHlp->pfnPrintf(pHlp, 1539 1539 "%sST(%u)=%sFPR%u={%04RX16'%08RX32'%08RX32} t%d %c%u.%022llu ^ %u", 1540 1540 pszPrefix, iST, pszPrefix, iFPR, 1541 pCtx-> fpu.aRegs[0].au16[4], pCtx->fpu.aRegs[0].au32[1], pCtx->fpu.aRegs[0].au32[0],1541 pCtx->XState.x87.aRegs[0].au16[4], pCtx->XState.x87.aRegs[0].au32[1], pCtx->XState.x87.aRegs[0].au32[0], 1542 1542 uTag, chSign, iInteger, u64Fraction, uExponent); 1543 if (pCtx-> fpu.aRegs[0].au16[5] || pCtx->fpu.aRegs[0].au16[6] || pCtx->fpu.aRegs[0].au16[7])1543 if (pCtx->XState.x87.aRegs[0].au16[5] || pCtx->XState.x87.aRegs[0].au16[6] || pCtx->XState.x87.aRegs[0].au16[7]) 1544 1544 pHlp->pfnPrintf(pHlp, " res={%04RX16,%04RX16,%04RX16}\n", 1545 pCtx-> fpu.aRegs[0].au16[5], pCtx->fpu.aRegs[0].au16[6], pCtx->fpu.aRegs[0].au16[7]);1545 pCtx->XState.x87.aRegs[0].au16[5], pCtx->XState.x87.aRegs[0].au16[6], pCtx->XState.x87.aRegs[0].au16[7]); 1546 1546 else 1547 1547 pHlp->pfnPrintf(pHlp, "\n"); 1548 1548 } 1549 for (unsigned iXMM = 0; iXMM < RT_ELEMENTS(pCtx-> fpu.aXMM); iXMM++)1549 for (unsigned iXMM = 0; iXMM < RT_ELEMENTS(pCtx->XState.x87.aXMM); iXMM++) 1550 1550 pHlp->pfnPrintf(pHlp, 1551 1551 iXMM & 1 … … 1553 1553 : "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32 ", 1554 1554 pszPrefix, iXMM, iXMM < 10 ? " " : "", 1555 pCtx-> fpu.aXMM[iXMM].au32[3],1556 pCtx-> fpu.aXMM[iXMM].au32[2],1557 pCtx-> fpu.aXMM[iXMM].au32[1],1558 pCtx-> fpu.aXMM[iXMM].au32[0]);1559 for (unsigned i = 0; i < RT_ELEMENTS(pCtx-> fpu.au32RsrvdRest); i++)1560 if (pCtx-> fpu.au32RsrvdRest[i])1555 pCtx->XState.x87.aXMM[iXMM].au32[3], 1556 pCtx->XState.x87.aXMM[iXMM].au32[2], 1557 pCtx->XState.x87.aXMM[iXMM].au32[1], 1558 pCtx->XState.x87.aXMM[iXMM].au32[0]); 1559 for (unsigned i = 0; i < RT_ELEMENTS(pCtx->XState.x87.au32RsrvdRest); i++) 1560 if (pCtx->XState.x87.au32RsrvdRest[i]) 1561 1561 pHlp->pfnPrintf(pHlp, "%sRsrvdRest[i]=%RX32 (offset=%#x)\n", 1562 pszPrefix, i, pCtx-> fpu.au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) );1562 pszPrefix, i, pCtx->XState.x87.au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) ); 1563 1563 1564 1564 pHlp->pfnPrintf(pHlp, -
trunk/src/VBox/VMM/VMMR3/CPUMDbg.cpp
r54862 r54898 513 513 if (cpumR3RegIsFxSaveFormat(pVCpu)) 514 514 { 515 unsigned iReg = (pVCpu->cpum.s.Guest. fpu.FSW >> 11) & 7;515 unsigned iReg = (pVCpu->cpum.s.Guest.XState.x87.FSW >> 11) & 7; 516 516 iReg += pDesc->offRegister; 517 517 iReg &= 7; 518 pValue->r80Ex = pVCpu->cpum.s.Guest. fpu.aRegs[iReg].r80Ex;518 pValue->r80Ex = pVCpu->cpum.s.Guest.XState.x87.aRegs[iReg].r80Ex; 519 519 } 520 520 else 521 521 { 522 PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest. fpu;522 PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.XState.x87; 523 523 524 524 unsigned iReg = (pOldFpu->FSW >> 11) & 7; … … 677 677 if (cpumR3RegIsFxSaveFormat(pVCpu)) 678 678 { 679 unsigned iReg = (pVCpu->cpum.s.Guest. fpu.FSW >> 11) & 7;679 unsigned iReg = (pVCpu->cpum.s.Guest.XState.x87.FSW >> 11) & 7; 680 680 iReg += pDesc->offRegister; 681 681 iReg &= 7; 682 pValue->r80Ex = pVCpu->cpum.s.Guest. fpu.aRegs[iReg].r80Ex;682 pValue->r80Ex = pVCpu->cpum.s.Guest.XState.x87.aRegs[iReg].r80Ex; 683 683 } 684 684 else 685 685 { 686 PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest. fpu;686 PCX86FPUSTATE pOldFpu = (PCX86FPUSTATE)&pVCpu->cpum.s.Guest.XState.x87; 687 687 688 688 unsigned iReg = (pOldFpu->FSW >> 11) & 7; … … 1079 1079 1080 1080 #define CPU_REG_MM(n) \ 1081 CPU_REG_RW_AS("mm" #n, MM##n, U64, fpu.aRegs[n].mmx,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mmN)1081 CPU_REG_RW_AS("mm" #n, MM##n, U64, XState.x87.aRegs[n].mmx, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mmN) 1082 1082 1083 1083 #define CPU_REG_XMM(n) \ 1084 CPU_REG_RW_AS("xmm" #n, XMM##n, U128, fpu.aXMM[n].xmm,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_xmmN)1084 CPU_REG_RW_AS("xmm" #n, XMM##n, U128, XState.x87.aXMM[n].xmm, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_xmmN) 1085 1085 /** @} */ 1086 1086 … … 1124 1124 CPU_REG_REG(RIP, rip), 1125 1125 CPU_REG_RW_AS("rflags", RFLAGS, U64, rflags, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_rflags, g_aCpumRegFields_rflags ), 1126 CPU_REG_RW_AS("fcw", FCW, U16, fpu.FCW,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fcw ),1127 CPU_REG_RW_AS("fsw", FSW, U16, fpu.FSW,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fsw ),1128 CPU_REG_RO_AS("ftw", FTW, U16, fpu,cpumR3RegGet_ftw, cpumR3RegSet_ftw, NULL, g_aCpumRegFields_ftw ),1129 CPU_REG_RW_AS("fop", FOP, U16, fpu.FOP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1130 CPU_REG_RW_AS("fpuip", FPUIP, U32, fpu.FPUIP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpuip, NULL ),1131 CPU_REG_RW_AS("fpucs", FPUCS, U16, fpu.CS,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1132 CPU_REG_RW_AS("fpudp", FPUDP, U32, fpu.FPUDP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpudp, NULL ),1133 CPU_REG_RW_AS("fpuds", FPUDS, U16, fpu.DS,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1134 CPU_REG_RW_AS("mxcsr", MXCSR, U32, fpu.MXCSR,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ),1135 CPU_REG_RW_AS("mxcsr_mask", MXCSR_MASK, U32, fpu.MXCSR_MASK,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ),1126 CPU_REG_RW_AS("fcw", FCW, U16, XState.x87.FCW, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fcw ), 1127 CPU_REG_RW_AS("fsw", FSW, U16, XState.x87.FSW, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fsw ), 1128 CPU_REG_RO_AS("ftw", FTW, U16, XState.x87, cpumR3RegGet_ftw, cpumR3RegSet_ftw, NULL, g_aCpumRegFields_ftw ), 1129 CPU_REG_RW_AS("fop", FOP, U16, XState.x87.FOP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1130 CPU_REG_RW_AS("fpuip", FPUIP, U32, XState.x87.FPUIP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpuip, NULL ), 1131 CPU_REG_RW_AS("fpucs", FPUCS, U16, XState.x87.CS, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1132 CPU_REG_RW_AS("fpudp", FPUDP, U32, XState.x87.FPUDP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpudp, NULL ), 1133 CPU_REG_RW_AS("fpuds", FPUDS, U16, XState.x87.DS, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1134 CPU_REG_RW_AS("mxcsr", MXCSR, U32, XState.x87.MXCSR, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ), 1135 CPU_REG_RW_AS("mxcsr_mask", MXCSR_MASK, U32, XState.x87.MXCSR_MASK, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ), 1136 1136 CPU_REG_ST(0), 1137 1137 CPU_REG_ST(1), … … 1252 1252 CPU_REG_REG(RIP, rip), 1253 1253 CPU_REG_RW_AS("rflags", RFLAGS, U64, rflags, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_rflags, g_aCpumRegFields_rflags ), 1254 CPU_REG_RW_AS("fcw", FCW, U16, fpu.FCW,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fcw ),1255 CPU_REG_RW_AS("fsw", FSW, U16, fpu.FSW,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fsw ),1256 CPU_REG_RO_AS("ftw", FTW, U16, fpu,cpumR3RegGet_ftw, cpumR3RegSet_ftw, NULL, g_aCpumRegFields_ftw ),1257 CPU_REG_RW_AS("fop", FOP, U16, fpu.FOP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1258 CPU_REG_RW_AS("fpuip", FPUIP, U32, fpu.FPUIP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpuip, NULL ),1259 CPU_REG_RW_AS("fpucs", FPUCS, U16, fpu.CS,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1260 CPU_REG_RW_AS("fpudp", FPUDP, U32, fpu.FPUDP,cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpudp, NULL ),1261 CPU_REG_RW_AS("fpuds", FPUDS, U16, fpu.DS,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ),1262 CPU_REG_RW_AS("mxcsr", MXCSR, U32, fpu.MXCSR,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ),1263 CPU_REG_RW_AS("mxcsr_mask", MXCSR_MASK, U32, fpu.MXCSR_MASK,cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ),1254 CPU_REG_RW_AS("fcw", FCW, U16, XState.x87.FCW, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fcw ), 1255 CPU_REG_RW_AS("fsw", FSW, U16, XState.x87.FSW, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_fsw ), 1256 CPU_REG_RO_AS("ftw", FTW, U16, XState.x87, cpumR3RegGet_ftw, cpumR3RegSet_ftw, NULL, g_aCpumRegFields_ftw ), 1257 CPU_REG_RW_AS("fop", FOP, U16, XState.x87.FOP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1258 CPU_REG_RW_AS("fpuip", FPUIP, U32, XState.x87.FPUIP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpuip, NULL ), 1259 CPU_REG_RW_AS("fpucs", FPUCS, U16, XState.x87.CS, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1260 CPU_REG_RW_AS("fpudp", FPUDP, U32, XState.x87.FPUDP, cpumR3RegGet_Generic, cpumR3RegSet_Generic, g_aCpumRegAliases_fpudp, NULL ), 1261 CPU_REG_RW_AS("fpuds", FPUDS, U16, XState.x87.DS, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, NULL ), 1262 CPU_REG_RW_AS("mxcsr", MXCSR, U32, XState.x87.MXCSR, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ), 1263 CPU_REG_RW_AS("mxcsr_mask", MXCSR_MASK, U32, XState.x87.MXCSR_MASK, cpumR3RegGet_Generic, cpumR3RegSet_Generic, NULL, g_aCpumRegFields_mxcsr ), 1264 1264 CPU_REG_ST(0), 1265 1265 CPU_REG_ST(1), -
trunk/src/VBox/VMM/VMMRC/CPUMRCA.asm
r54674 r54898 65 65 ffree st7 ; Clear FPU stack register(7)'s tag entry to prevent overflow if a wraparound occurs 66 66 ; for the upcoming push (load) 67 fild dword [xDX + CPUMCPU.Guest. fpu] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU.67 fild dword [xDX + CPUMCPU.Guest.XState] ; Explicit FPU load to overwrite FIP, FOP, FDP registers in the FPU. 68 68 69 69 .nothing_to_clean: … … 197 197 %ifdef RT_ARCH_AMD64 198 198 ; Use explicit REX prefix. See @bugref{6398}. 199 o64 fxsave [xDX + CPUMCPU.Host. fpu]199 o64 fxsave [xDX + CPUMCPU.Host.XState] 200 200 %else 201 fxsave [xDX + CPUMCPU.Host. fpu]201 fxsave [xDX + CPUMCPU.Host.XState] 202 202 %endif 203 203 or dword [xDX + CPUMCPU.fUseFlags], (CPUM_USED_FPU | CPUM_USED_FPU_SINCE_REM) 204 fxrstor [xDX + CPUMCPU.Guest. fpu]; raw-mode guest is always 32-bit. See @bugref{7138}.204 fxrstor [xDX + CPUMCPU.Guest.XState] ; raw-mode guest is always 32-bit. See @bugref{7138}. 205 205 206 206 hlfpua_finished_switch: … … 217 217 ; legacy support. 218 218 hlfpua_no_fxsave: 219 fnsave [xDX + CPUMCPU.Host. fpu]219 fnsave [xDX + CPUMCPU.Host.XState] 220 220 or dword [xDX + CPUMCPU.fUseFlags], dword (CPUM_USED_FPU | CPUM_USED_FPU_SINCE_REM) ; yasm / nasm 221 mov eax, [xDX + CPUMCPU.Guest. fpu]; control word221 mov eax, [xDX + CPUMCPU.Guest.XState] ; control word 222 222 not eax ; 1 means exception ignored (6 LS bits) 223 223 and eax, byte 03Fh ; 6 LS bits only 224 test eax, [xDX + CPUMCPU.Guest. fpu + 4]; status word224 test eax, [xDX + CPUMCPU.Guest.XState + 4] ; status word 225 225 jz short hlfpua_no_exceptions_pending 226 226 ; technically incorrect, but we certainly don't want any exceptions now!! 227 and dword [xDX + CPUMCPU.Guest. fpu+ 4], ~03Fh227 and dword [xDX + CPUMCPU.Guest.XState + 4], ~03Fh 228 228 hlfpua_no_exceptions_pending: 229 frstor [xDX + CPUMCPU.Guest. fpu]229 frstor [xDX + CPUMCPU.Guest.XState] 230 230 jmp near hlfpua_finished_switch 231 231 %endif ; !RT_ARCH_AMD64 -
trunk/src/VBox/VMM/VMMSwitcher/AMD64andLegacy.mac
r54707 r54898 1144 1144 mov cr0, rcx 1145 1145 1146 fxsave [rdx + r8 + CPUMCPU.Guest. fpu]1147 o64 fxrstor [rdx + r8 + CPUMCPU.Host. fpu]; Restore 64-bit host FPU state. See @bugref{7138}1146 fxsave [rdx + r8 + CPUMCPU.Guest.XState] 1147 o64 fxrstor [rdx + r8 + CPUMCPU.Host.XState] ; Restore 64-bit host FPU state. See @bugref{7138} 1148 1148 jmp short gth_fpu_no 1149 1149 -
trunk/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
r54862 r54898 665 665 mov cr0, rax 666 666 ; Use explicit REX prefix. See @bugref{6398}. 667 o64 fxrstor [rdx + CPUMCPU.Guest. fpu]667 o64 fxrstor [rdx + CPUMCPU.Guest.XState] 668 668 mov cr0, rcx ; and restore old CR0 again 669 669 … … 725 725 ; parameter for all helper functions (pCtx) 726 726 DEBUG64_CHAR('9') 727 lea rsi, [rdx + CPUMCPU.Guest. fpu]727 lea rsi, [rdx + CPUMCPU.Guest.XState] 728 728 lea rax, [htg_return wrt rip] 729 729 push rax ; return address … … 1259 1259 1260 1260 ; Use explicit REX prefix. See @bugref{6398}. 1261 o64 fxsave [rsi + CPUMCTX. fpu]1261 o64 fxsave [rsi + CPUMCTX.XState] 1262 1262 1263 1263 mov cr0, rcx ; and restore old CR0 again -
trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac
r54546 r54898 991 991 992 992 FIXUP FIX_NO_FXSAVE_JMP, 0, gth_no_fxsave - NAME(Start) ; this will insert a jmp gth_no_fxsave if fxsave isn't supported. 993 fxsave [edx + CPUMCPU.Guest. fpu]994 fxrstor [edx + CPUMCPU.Host. fpu]993 fxsave [edx + CPUMCPU.Guest.XState] 994 fxrstor [edx + CPUMCPU.Host.XState] 995 995 jmp near gth_fpu_no 996 996 997 997 gth_no_fxsave: 998 fnsave [edx + CPUMCPU.Guest. fpu]999 mov eax, [edx + CPUMCPU.Host. fpu]; control word998 fnsave [edx + CPUMCPU.Guest.XState] 999 mov eax, [edx + CPUMCPU.Host.XState] ; control word 1000 1000 not eax ; 1 means exception ignored (6 LS bits) 1001 1001 and eax, byte 03Fh ; 6 LS bits only 1002 test eax, [edx + CPUMCPU.Host. fpu+ 4] ; status word1002 test eax, [edx + CPUMCPU.Host.XState + 4] ; status word 1003 1003 jz gth_no_exceptions_pending 1004 1004 1005 1005 ; technically incorrect, but we certainly don't want any exceptions now!! 1006 and dword [edx + CPUMCPU.Host. fpu+ 4], ~03Fh1006 and dword [edx + CPUMCPU.Host.XState + 4], ~03Fh 1007 1007 1008 1008 gth_no_exceptions_pending: 1009 frstor [edx + CPUMCPU.Host. fpu]1009 frstor [edx + CPUMCPU.Host.XState] 1010 1010 jmp short gth_fpu_no 1011 1011 -
trunk/src/VBox/VMM/include/CPUMInternal.h
r54897 r54898 288 288 /** FPU state. (16-byte alignment) 289 289 * @remark On x86, the format isn't necessarily X86FXSTATE (not important). */ 290 X86 FXSTATE fpu;290 X86XSAVEAREA XState; 291 291 292 292 /** General purpose register, selectors, flags and more -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r54897 r54898 17 17 18 18 %include "VBox/asmdefs.mac" 19 %include "VBox/vmm/cpum.mac" 19 20 20 21 ;; … … 64 65 %define VMMGCRET_USED_FPU 040000000h 65 66 66 %define FPUSTATE_SIZE 51267 67 68 68 ;; if anyone figures how to do %if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL) in … … 127 127 ; 128 128 alignb 64 129 .Guest. fpu resb 512129 .Guest.XState resb XSTATE_SIZE 130 130 .Guest.eax resq 1 131 131 .Guest.ecx resq 1 … … 256 256 ; 257 257 alignb 64 258 .Host. fpu resb FPUSTATE_SIZE258 .Host.XState resb XSTATE_SIZE 259 259 260 260 %if HC_ARCH_BITS == 64 || fVBOX_WITH_HYBRID_32BIT_KERNEL … … 368 368 ; 369 369 alignb 64 370 .Hyper. fpu resb 512370 .Hyper.XState resb XSTATE_SIZE 371 371 .Hyper.eax resq 1 372 372 .Hyper.ecx resq 1 -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r54737 r54898 63 63 64 64 GEN_CHECK_SIZE(CPUMHOSTCTX); 65 GEN_CHECK_OFF(CPUMHOSTCTX, fpu);65 GEN_CHECK_OFF(CPUMHOSTCTX, XState); 66 66 #if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL) 67 67 GEN_CHECK_OFF(CPUMHOSTCTX, rbx); … … 132 132 133 133 GEN_CHECK_SIZE(CPUMCTX); 134 GEN_CHECK_OFF(CPUMCTX, fpu);134 GEN_CHECK_OFF(CPUMCTX, XState); 135 135 GEN_CHECK_OFF(CPUMCTX, rdi); 136 136 GEN_CHECK_OFF(CPUMCTX, rsi); -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r51643 r54898 298 298 299 299 /* cpumctx */ 300 CHECK_MEMBER_ALIGNMENT(CPUMCTX, fpu, 32);300 CHECK_MEMBER_ALIGNMENT(CPUMCTX, XState, 64); 301 301 CHECK_MEMBER_ALIGNMENT(CPUMCTX, rax, 32); 302 302 CHECK_MEMBER_ALIGNMENT(CPUMCTX, idtr.pIdt, 8); -
trunk/src/recompiler/VBoxRecompiler.c
r54737 r54898 2352 2352 /* Sync FPU state after CR4, CPUID and EFER (!). */ 2353 2353 if (fFlags & CPUM_CHANGED_FPU_REM) 2354 save_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx-> fpu); /* 'save' is an excellent name. */2354 save_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87); /* 'save' is an excellent name. */ 2355 2355 } 2356 2356 … … 2545 2545 2546 2546 /** @todo check if FPU/XMM was actually used in the recompiler */ 2547 restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx-> fpu);2547 restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87); 2548 2548 //// dprintf2(("FPU state CW=%04X TT=%04X SW=%04X (%04X)\n", env->fpuc, env->fpstt, env->fpus, pVMCtx->fpu.FSW)); 2549 2549 … … 2816 2816 /** @todo DS */ 2817 2817 /** @todo Fix MXCSR support in QEMU so we don't overwrite MXCSR with 0 when we shouldn't! */ 2818 pCtx-> fpu.MXCSR= 0;2819 pCtx-> fpu.MXCSR_MASK= 0;2818 pCtx->XState.x87.MXCSR = 0; 2819 pCtx->XState.x87.MXCSR_MASK = 0; 2820 2820 2821 2821 /** @todo check if FPU/XMM was actually used in the recompiler */ 2822 restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx-> fpu);2822 restore_raw_fp_state(&pVM->rem.s.Env, (uint8_t *)&pCtx->XState.x87); 2823 2823 //// dprintf2(("FPU state CW=%04X TT=%04X SW=%04X (%04X)\n", env->fpuc, env->fpstt, env->fpus, pVMCtx->fpu.FSW)); 2824 2824
Note:
See TracChangeset
for help on using the changeset viewer.