Changeset 95526 in vbox for trunk/src/VBox/ValidationKit/bootsectors
- Timestamp:
- Jul 6, 2022 10:26:10 AM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 152149
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3.c32
r95525 r95526 123 123 * Global Variables * 124 124 *********************************************************************************************************************************/ 125 static bool g_ fGlobalInitialized = false;125 static bool g_afTypeSupports[T_MAX] = { false, false, false, false, false, false, false, false, false }; 126 126 static bool g_fAmdMisalignedSse = false; 127 static bool g_afTypeSupports[T_MAX] = { false, false, false, false, false, false, false, false, false }; 127 128 /** Size of g_pbBuf - at least three pages. */ 129 static uint32_t g_cbBuf; 130 /** Buffer of g_cbBuf size. */ 131 static uint8_t BS3_FAR *g_pbBuf; 128 132 129 133 /** Exception type \#4 test configurations. */ … … 432 436 PCBS3CPUINSTR3_CONFIG_T paConfigs, unsigned cConfigs) 433 437 { 434 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode);435 438 BS3REGCTX Ctx; 436 439 BS3TRAPFRAME TrapFrame; 437 uint8_t bRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; 440 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode); 441 uint8_t bRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; 442 uint8_t BS3_FAR *pbBuf = g_pbBuf; 443 uint32_t cbBuf = g_cbBuf; 438 444 PBS3EXTCTX pExtCtxOut; 439 445 PBS3EXTCTX pExtCtx = bs3CpuInstr3AllocExtCtxs(&pExtCtxOut); … … 451 457 bs3CpuInstr3SetupSseAndAvx(&Ctx, pExtCtx); 452 458 //Bs3TestPrintf("FTW=%#x mm1/st1=%.16Rhxs\n", pExtCtx->Ctx.x87.FTW, &pExtCtx->Ctx.x87.aRegs[1]); 459 460 /* 461 * Prep the buffer for tail guard if we're in paging mode. 462 */ 463 if (BS3_MODE_IS_PAGED(bMode)) 464 { 465 Bs3PagingProtectPtr(&pbBuf[0], X86_PAGE_SIZE, 0, X86_PTE_P); 466 Bs3PagingProtectPtr(&pbBuf[cbBuf - X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 467 pbBuf += X86_PAGE_SIZE; 468 cbBuf -= X86_PAGE_SIZE * 2; 469 } 453 470 454 471 /* … … 479 496 uint8_t const cbOperand = paTests[iTest].enmType < T_128BITS ? 64/8 480 497 : paTests[iTest].enmType < T_256BITS ? 128/8 : 256/8; 481 uint8_t const cbAlign = RT_MIN(cbOperand, 16); 498 uint8_t const cbMemOp = cbOperand; 499 PRTUINT256U puMemOp = (PRTUINT256U)&pbBuf[cbBuf - cbMemOp - !paConfigs[iCfg].fAligned]; 482 500 uint8_t bXcptExpect = !g_afTypeSupports[paTests[iTest].enmType] ? X86_XCPT_UD 483 501 : fMmxInstr ? paConfigs[iCfg].bXcptMmx … … 486 504 uint16_t idTestStep = bRing * 10000 + iCfg * 100 + iTest * 10; 487 505 unsigned iVal; 488 uint8_t abPadding[sizeof(RTUINT256U) * 2];489 unsigned const offPadding = (BS3_FP_OFF(&abPadding[sizeof(RTUINT256U)]) & ~(size_t)(cbAlign - 1))490 - BS3_FP_OFF(&abPadding[0]);491 PRTUINT256U puMemOp = (PRTUINT256U)&abPadding[offPadding - !paConfigs[iCfg].fAligned];492 BS3_ASSERT((uint8_t BS3_FAR *)puMemOp - &abPadding[0] <= sizeof(RTUINT256U));493 506 494 507 /* If testing unaligned memory accesses, skip register-only tests. This allows … … 524 537 { 525 538 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 526 Bs3MemSet(puMemOp, 0xcc, sizeof(*puMemOp));539 Bs3MemSet(puMemOp, 0xcc, cbMemOp); 527 540 if (bXcptExpect == X86_XCPT_DB) 528 541 uMemOpExpect = paValues[iVal].uDstOut; 529 542 else 530 uMemOpExpect = *puMemOp;543 Bs3MemSet(&uMemOpExpect, 0xcc, sizeof(uMemOpExpect)); 531 544 } 532 545 else if (fMmxInstr) … … 537 550 { 538 551 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 539 *puMemOp = paValues[iVal].uSrc1;552 Bs3MemCpy(puMemOp, &paValues[iVal].uSrc1, cbMemOp); 540 553 if (paTests[iTest].iRegDst == UINT8_MAX) 541 554 BS3_ASSERT(fSseInstr); … … 555 568 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 556 569 BS3_ASSERT(paTests[iTest].iRegDst != UINT8_MAX && paTests[iTest].iRegSrc1 != UINT8_MAX); 557 *puMemOp = uMemOpExpect = paValues[iVal].uSrc2;570 Bs3MemCpy(puMemOp, &paValues[iVal].uSrc2, cbMemOp); 558 571 uMemOpExpect = paValues[iVal].uSrc2; 559 572 } … … 615 628 616 629 if ( paTests[iTest].enmRm == RM_MEM 617 && Bs3MemCmp(puMemOp, &uMemOpExpect, cb Operand) != 0)618 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cb Operand, &uMemOpExpect, cbOperand, puMemOp);630 && Bs3MemCmp(puMemOp, &uMemOpExpect, cbMemOp) != 0) 631 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cbMemOp, &uMemOpExpect, cbMemOp, puMemOp); 619 632 620 633 if (cErrors != Bs3TestSubErrorCount()) … … 649 662 * Cleanup. 650 663 */ 664 if (BS3_MODE_IS_PAGED(bMode)) 665 { 666 Bs3PagingProtectPtr(&pbBuf[-X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 667 Bs3PagingProtectPtr(&pbBuf[cbBuf], X86_PAGE_SIZE, 0, X86_PTE_P); 668 } 651 669 bs3CpuInstr3FreeExtCtxs(pExtCtx, pExtCtxOut); 652 670 return 0; … … 3276 3294 PCBS3CPUINSTR3_CONFIG_T paConfigs, unsigned cConfigs) 3277 3295 { 3278 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode);3279 3296 BS3REGCTX Ctx; 3280 3297 BS3TRAPFRAME TrapFrame; 3281 uint8_t bRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; 3298 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode); 3299 uint8_t BS3_FAR *pbBuf = g_pbBuf; 3300 uint32_t cbBuf = g_cbBuf; 3301 uint8_t bRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; 3282 3302 PBS3EXTCTX pExtCtxOut; 3283 3303 PBS3EXTCTX pExtCtx = bs3CpuInstr3AllocExtCtxs(&pExtCtxOut); … … 3297 3317 3298 3318 /* 3319 * Prep the buffer for tail guard if we're in paging mode. 3320 */ 3321 if (BS3_MODE_IS_PAGED(bMode)) 3322 { 3323 Bs3PagingProtectPtr(&pbBuf[0], X86_PAGE_SIZE, 0, X86_PTE_P); 3324 Bs3PagingProtectPtr(&pbBuf[cbBuf - X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 3325 pbBuf += X86_PAGE_SIZE; 3326 cbBuf -= X86_PAGE_SIZE * 2; 3327 } 3328 3329 /* 3299 3330 * Run the tests in all rings since alignment issues may behave 3300 3331 * differently in ring-3 compared to ring-0. … … 3306 3337 { 3307 3338 unsigned iTest; 3339 bool const fCfgAlignCheck = paConfigs[iCfg].fAlignCheck; 3340 bool const fCfgAligned = paConfigs[iCfg].fAligned; 3308 3341 BS3CPUINSTR3_CONFIG_SAVED_T SavedCfg; 3309 3342 if (!bs3CpuInstr3ConfigReconfigure(&SavedCfg, &Ctx, pExtCtx, &paConfigs[iCfg], bMode)) … … 3323 3356 uint8_t const cbOperand = paTests[iTest].enmType < T_128BITS ? 64/8 3324 3357 : paTests[iTest].enmType < T_256BITS ? 128/8 : 256/8; 3358 uint8_t const cbMemOp = cbOperand; 3325 3359 uint8_t const cbAlign = RT_MIN(cbOperand, 16); 3360 PRTUINT256U puMemOp = (PRTUINT256U)&pbBuf[cbBuf - cbMemOp 3361 - (fCfgAligned && fCfgAlignCheck ? cbAlign : !fCfgAligned)]; 3326 3362 uint8_t bXcptExpect = !g_afTypeSupports[paTests[iTest].enmType] 3327 3363 || paTests[iTest].fInvalidEncoding ? X86_XCPT_UD … … 3333 3369 uint16_t idTestStep = bRing * 10000 + iCfg * 100 + iTest * 10; 3334 3370 unsigned iVal; 3335 uint8_t abPadding[sizeof(RTUINT256U) * 2];3336 unsigned const offPadding = (BS3_FP_OFF(&abPadding[sizeof(RTUINT256U)]) & ~(size_t)(cbAlign - 1))3337 - BS3_FP_OFF(&abPadding[0]);3338 PRTUINT256U puMemOp = (PRTUINT256U)&abPadding[offPadding - !paConfigs[iCfg].fAligned];3339 BS3_ASSERT((uint8_t BS3_FAR *)puMemOp - &abPadding[0] <= sizeof(RTUINT256U));3340 3371 3341 3372 /* If testing unaligned memory accesses, skip register-only tests. This allows … … 3371 3402 { 3372 3403 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 3373 Bs3MemSet(puMemOp, 0xcc, sizeof(*puMemOp));3374 uMemOpExpect = *puMemOp;3404 Bs3MemSet(puMemOp, 0xcc, cbMemOp); 3405 Bs3MemSet(&uMemOpExpect, 0xcc, sizeof(uMemOpExpect)); 3375 3406 if (bXcptExpect == X86_XCPT_DB) 3376 3407 switch (paTests[iTest].cbDst) … … 3389 3420 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 3390 3421 BS3_ASSERT(paTests[iTest].iRegDst != UINT8_MAX); 3391 *puMemOp = uMemOpExpect = paValues[iVal].uSrc;3422 Bs3MemCpy(puMemOp, &paValues[iVal].uSrc, cbMemOp); 3392 3423 uMemOpExpect = paValues[iVal].uSrc; 3393 3424 } … … 3441 3472 if ( paTests[iTest].enmRm == RM_MEM 3442 3473 && Bs3MemCmp(puMemOp, &uMemOpExpect, cbOperand) != 0) 3443 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cb Operand, &uMemOpExpect, cbOperand, puMemOp);3474 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cbMemOp, &uMemOpExpect, cbMemOp, puMemOp); 3444 3475 3445 3476 if (cErrors != Bs3TestSubErrorCount()) … … 3474 3505 * Cleanup. 3475 3506 */ 3507 if (BS3_MODE_IS_PAGED(bMode)) 3508 { 3509 Bs3PagingProtectPtr(&pbBuf[-X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 3510 Bs3PagingProtectPtr(&pbBuf[cbBuf], X86_PAGE_SIZE, 0, X86_PTE_P); 3511 } 3476 3512 bs3CpuInstr3FreeExtCtxs(pExtCtx, pExtCtxOut); 3477 3513 return 0; … … 3584 3620 PCBS3CPUINSTR3_CONFIG_T paConfigs, unsigned cConfigs, uint8_t cbMaxAlign) 3585 3621 { 3586 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode);3587 3622 BS3REGCTX Ctx; 3588 3623 BS3TRAPFRAME TrapFrame; 3624 const char BS3_FAR * const pszMode = Bs3GetModeName(bMode); 3625 uint8_t BS3_FAR *pbBuf = g_pbBuf; 3626 uint32_t cbBuf = g_cbBuf; 3589 3627 uint8_t bRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; 3590 3628 PBS3EXTCTX pExtCtxOut; … … 3604 3642 3605 3643 /* 3644 * Prep the buffer for tail guard if we're in paging mode. 3645 */ 3646 if (BS3_MODE_IS_PAGED(bMode)) 3647 { 3648 Bs3PagingProtectPtr(&pbBuf[0], X86_PAGE_SIZE, 0, X86_PTE_P); 3649 Bs3PagingProtectPtr(&pbBuf[cbBuf - X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 3650 pbBuf += X86_PAGE_SIZE; 3651 cbBuf -= X86_PAGE_SIZE * 2; 3652 } 3653 3654 /* 3606 3655 * Run the tests in all rings since alignment issues may behave 3607 3656 * differently in ring-3 compared to ring-0. … … 3613 3662 { 3614 3663 unsigned iTest; 3664 bool const fCfgAlignCheck = paConfigs[iCfg].fAlignCheck; 3665 bool const fCfgAligned = paConfigs[iCfg].fAligned; 3615 3666 BS3CPUINSTR3_CONFIG_SAVED_T SavedCfg; 3616 3667 if (!bs3CpuInstr3ConfigReconfigure(&SavedCfg, &Ctx, pExtCtx, &paConfigs[iCfg], bMode)) … … 3630 3681 uint8_t const cbOperand = paTests[iTest].enmType < T_128BITS ? 64/8 3631 3682 : paTests[iTest].enmType < T_256BITS ? 128/8 : 256/8; 3683 uint8_t const cbMemOp = cbOperand; 3632 3684 uint8_t const cbAlign = RT_MIN(cbOperand, !cbMaxAlign ? 16 : cbMaxAlign); 3685 PRTUINT256U puMemOp = (PRTUINT256U)&pbBuf[cbBuf - cbMemOp 3686 - (fCfgAligned && fCfgAlignCheck ? cbAlign : !fCfgAligned)]; 3633 3687 uint8_t bXcptExpect = !g_afTypeSupports[paTests[iTest].enmType] ? X86_XCPT_UD 3634 3688 : fMmxInstr ? paConfigs[iCfg].bXcptMmx … … 3637 3691 uint16_t idTestStep = bRing * 10000 + iCfg * 100 + iTest * 10; 3638 3692 unsigned iVal; 3639 uint8_t abPadding[sizeof(RTUINT256U) * 2];3640 unsigned const offPadding = (BS3_FP_OFF(&abPadding[sizeof(RTUINT256U)]) & ~(size_t)(cbAlign - 1))3641 - BS3_FP_OFF(&abPadding[0]);3642 PRTUINT256U puMemOp = (PRTUINT256U)&abPadding[offPadding - !paConfigs[iCfg].fAligned];3643 BS3_ASSERT((uint8_t BS3_FAR *)puMemOp - &abPadding[0] <= sizeof(RTUINT256U));3644 3693 3645 3694 /* If testing unaligned memory accesses, skip register-only tests. This allows … … 3675 3724 { 3676 3725 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 3677 Bs3MemSet(puMemOp, 0xcc, sizeof(*puMemOp));3726 Bs3MemSet(puMemOp, 0xcc, cbMemOp); 3678 3727 if (bXcptExpect == X86_XCPT_DB) 3679 3728 uMemOpExpect = paValues[iVal].uDstOut; 3680 3729 else 3681 uMemOpExpect = *puMemOp;3730 Bs3MemSet(&uMemOpExpect, 0xcc, sizeof(uMemOpExpect)); 3682 3731 } 3683 3732 else if (fMmxInstr) … … 3689 3738 BS3_ASSERT(paTests[iTest].enmRm == RM_MEM); 3690 3739 BS3_ASSERT(paTests[iTest].iRegDst != UINT8_MAX); 3691 *puMemOp = uMemOpExpect = paValues[iVal].uSrc;3740 Bs3MemCpy(puMemOp, &paValues[iVal].uSrc, cbMemOp); 3692 3741 uMemOpExpect = paValues[iVal].uSrc; 3693 3742 } … … 3748 3797 3749 3798 if ( paTests[iTest].enmRm == RM_MEM 3750 && Bs3MemCmp(puMemOp, &uMemOpExpect, cb Operand) != 0)3751 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cb Operand, &uMemOpExpect, cbOperand, puMemOp);3799 && Bs3MemCmp(puMemOp, &uMemOpExpect, cbMemOp) != 0) 3800 Bs3TestFailedF("Expected uMemOp %*.Rhxs, got %*.Rhxs", cbMemOp, &uMemOpExpect, cbMemOp, puMemOp); 3752 3801 3753 3802 if (cErrors != Bs3TestSubErrorCount()) … … 3782 3831 * Cleanup. 3783 3832 */ 3833 if (BS3_MODE_IS_PAGED(bMode)) 3834 { 3835 Bs3PagingProtectPtr(&pbBuf[-X86_PAGE_SIZE], X86_PAGE_SIZE, 0, X86_PTE_P); 3836 Bs3PagingProtectPtr(&pbBuf[cbBuf], X86_PAGE_SIZE, 0, X86_PTE_P); 3837 } 3784 3838 bs3CpuInstr3FreeExtCtxs(pExtCtx, pExtCtxOut); 3785 3839 return 0; … … 4496 4550 4497 4551 /* 4498 * Do the tests.4552 * Allocate a buffer for testing. 4499 4553 */ 4500 Bs3TestDoModesByOne_pe32(g_aTests, RT_ELEMENTS(g_aTests), BS3TESTMODEBYONEENTRY_F_REAL_MODE_READY); 4554 g_cbBuf = X86_PAGE_SIZE * 4; 4555 g_pbBuf = (uint8_t BS3_FAR *)Bs3MemAlloc(BS3MEMKIND_REAL, g_cbBuf); 4556 if (g_pbBuf) 4557 { 4558 /* 4559 * Do the tests. 4560 */ 4561 Bs3TestDoModesByOne_pe32(g_aTests, RT_ELEMENTS(g_aTests), BS3TESTMODEBYONEENTRY_F_REAL_MODE_READY); 4562 } 4563 else 4564 Bs3TestFailed("Failed to allocate 16K buffer"); 4501 4565 4502 4566 Bs3TestTerm();
Note:
See TracChangeset
for help on using the changeset viewer.