Changeset 106470 in vbox for trunk/src/VBox/ValidationKit
- Timestamp:
- Oct 18, 2024 11:34:00 AM (4 months ago)
- svn:sync-xref-src-repo-rev:
- 165297
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-4.c32
r106390 r106470 482 482 uint16_t fXcr0Sse : 1; 483 483 uint16_t fXcr0Avx : 1; 484 uint16_t fX87XcptPending : 1; /** unmasked x87 exception pending. */ 484 485 uint16_t fAligned : 1; /**< Aligned mem operands. If 0, they will be misaligned and tests w/o mem operands skipped. */ 485 486 uint16_t fAlignCheck : 1; … … 487 488 uint8_t bXcptSse; 488 489 uint8_t bXcptAvx; 490 char *const pszCfgName; 489 491 } BS3CPUINSTR4_CONFIG_T; 490 492 /** Pointer to an execution environment configuration. */ … … 622 624 static uint8_t BS3_FAR *g_pbBufAliasAlloc; 623 625 624 /** Exception type \#2 test configurations (>=16 byte memory reference, unaligned). */ 626 /** Exceptions type 2 (>=16 Byte Memory Reference, not explicitly aligned) test configurations. */ 627 /** Intel 64 & IA-32 Architecture SDM Vol 2A Table 2-19, "Type 2 Class Exception Conditions." */ 625 628 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig2[] = 626 629 { 627 /* 628 * X87 SSE SSE SSE AVX SSE AVX AVX SSE AVX AMD/SSE <-- applies to 629 * +AVX +AVX +AMD/SSE +AMD/SSE 630 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 MXCSR 631 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 632 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #0 */ 633 { 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #1 */ 634 { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #2 */ 635 { 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #3 */ 636 { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM }, /* #4 */ 637 { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM }, /* #5 */ 638 { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #6 */ 639 { 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #7 */ 640 { 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #8 */ 641 { 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #9 */ 630 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 631 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 632 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 633 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 634 { 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "!MMEXCPT" }, /* #1 - CR4:OSXMMEXCPT: #UD instead of #XF for SIMD exceptions */ 635 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #2 - CR0:MP: no effect by itself */ 636 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #3 - CR0:EM: MMX/SSE => #UD */ 637 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #4 - CR0:TS: MMX/SSE/AVX => #NM */ 638 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #5 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 639 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #6 - CR4:OSFXSR=0: SSE => #UD */ 640 { 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "!OSXSAVE" }, /* #7 - CR4:OSXSAVE=0: AVX => #UD */ 641 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!AVX" }, /* #8 - XCR0:AVX=0: AVX => #UD */ 642 { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!SSE" }, /* #9 - XCR0:SSE+AVX=0: AVX => #UD */ 642 643 /* Memory misalignment and alignment checks: */ 643 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB }, /* #10*/644 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB }, /* #11*/645 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #12*/644 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: SSE => #GP */ 645 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: SSE => #GP */ 646 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 646 647 /* AMD only: */ 647 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP}, /* #13 */648 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP}, /* #14 */648 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #13 */ 649 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #14 */ 649 650 }; 650 651 651 /** Exception type \#3 test configurations (< 16-byte memory argument). */ 652 /** Exceptions type 3 (<16 Byte Memory Reference) test configurations. */ 653 /** Intel 64 & IA-32 Architecture SDM Vol 2A Table 2-20, "Type 3 Class Exception Conditions." */ 652 654 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig3[] = 653 655 { 654 /* 655 * X87 SSE SSE SSE AVX SSE AVX AVX SSE AVX AMD/SSE <-- applies to 656 * +AVX +AVX +AMD/SSE +AMD/SSE 657 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 MXCSR 658 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 659 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #0 */ 660 { 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #1 */ 661 { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #2 */ 662 { 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #3 */ 663 { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM }, /* #4 */ 664 { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM }, /* #5 */ 665 { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #6 */ 666 { 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #7 */ 667 { 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #8 */ 668 { 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #9 */ 656 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 657 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 658 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 659 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 660 { 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "!MMEXCPT" }, /* #1 - CR4:OSXMMEXCPT: #UD instead of #XF for SIMD exceptions */ 661 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #2 - CR0:MP: no effect by itself */ 662 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #3 - CR0:EM: MMX/SSE => #UD */ 663 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #4 - CR0:TS: MMX/SSE/AVX => #NM */ 664 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #5 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 665 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #6 - CR4:OSFXSR=0: SSE => #UD */ 666 { 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "!OSXSAVE" }, /* #7 - CR4:OSXSAVE=0: AVX => #UD */ 667 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!AVX" }, /* #8 - XCR0:AVX=0: AVX => #UD */ 668 { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!SSE" }, /* #9 - XCR0:SSE+AVX=0: AVX => #UD */ 669 669 /* Memory misalignment and alignment checks: */ 670 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #10 */ /* [Avx]:DB*/671 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC }, /* #11 */ /* [Avx]:AC */672 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #12*/670 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: no effect */ 671 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC */ 672 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 673 673 /* AMD only: */ 674 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP}, /* #13 */675 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP}, /* #14 */674 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #13 */ 675 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #14 */ 676 676 }; 677 677 678 /** Exception type \#4 test configurations (>=16 byte memory arguments, no alignment, no floating-point exceptions). */ 678 /** Exceptions type 4 (>=16 Byte Memory Reference, not explicitly aligned, No Floating-point Exceptions) test configurations. */ 679 /** Intel 64 & IA-32 Architecture SDM Vol 2A Table 2-21, "Type 4 Class Exception Conditions." */ 680 /** Identical to g_aXcptConfig2 except no '!MMEXCPT' test for instructions which cannot raise SIMD exceptions */ 679 681 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig4[] = 680 682 { 681 /* 682 * X87 SSE SSE SSE AVX SSE AVX AVX SSE AVX AMD/SSE <-- applies to 683 * +AVX +AVX +AMD/SSE +AMD/SSE 684 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 MXCSR 685 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 686 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #0 */ 687 { 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #1 */ 688 { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #2 */ 689 { 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #3 */ 690 { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM }, /* #4 */ 691 { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM }, /* #5 */ 692 { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #6 */ 693 { 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #7 */ 694 { 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #8 */ 695 { 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #9 */ 683 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 684 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 685 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 686 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 687 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #1 - CR0:MP: no effect by itself */ 688 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #2 - CR0:EM: MMX/SSE => #UD */ 689 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #3 - CR0:TS: MMX/SSE/AVX => #NM */ 690 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #4 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 691 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #5 - CR4:OSFXSR=0: SSE => #UD */ 692 { 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "!OSXSAVE" }, /* #6 - CR4:OSXSAVE=0: AVX => #UD */ 693 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!AVX" }, /* #7 - XCR0:AVX=0: AVX => #UD */ 694 { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!SSE" }, /* #8 - XCR0:SSE+AVX=0: AVX => #UD */ 696 695 /* Memory misalignment and alignment checks: */ 697 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB }, /* #10*/698 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB }, /* #11*/699 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #12*/696 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB, "Misalign" }, /* #9 - misaligned data: SSE => #GP */ 697 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB, "AlChkMis" }, /* #10 - misaligned data + CR0:AM + fl:AC: SSE => #GP */ 698 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #11 - aligned data + CR0:AM + fl:AC: no effect */ 700 699 /* AMD only: */ 701 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP }, /* #13*/702 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, X86_XCPT_AC, X86_XCPT_GP }, /* #14*/700 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #12 */ 701 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #1j */ 703 702 }; 704 703 705 /** Exceptions type 5 (<16 byte memory arguments and not floating-point exceptions). */ 704 /** Exceptions type 5 (<16 Byte Memory Reference, No Floating-point Exceptions) test configurations. */ 705 /** Intel 64 & IA-32 Architecture SDM Vol 2A Table 2-22, "Type 5 Class Exception Conditions." */ 706 /** Identical to g_aXcptConfig3 except no '!MMEXCPT' test for instructions which cannot raise SIMD exceptions */ 706 707 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig5[] = 707 708 { 708 /* 709 * X87 SSE SSE SSE AVX SSE AVX AVX SSE AVX AMD/SSE <-- applies to 710 * +AVX +AVX +AMD/SSE +AMD/SSE 711 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 MXCSR 712 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 713 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #0 */ 714 { 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #1 */ 715 { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #2 */ 716 { 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #3 */ 717 { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM }, /* #4 */ 718 { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM }, /* #5 */ 719 { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB }, /* #6 */ 720 { 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #7 */ 721 { 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #8 */ 722 { 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD }, /* #9 */ 709 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 710 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 711 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 712 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 713 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #1 - CR0:MP: no effect by itself */ 714 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #2 - CR0:EM: MMX/SSE => #UD */ 715 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #3 - CR0:TS: MMX/SSE/AVX => #NM */ 716 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #4 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 717 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #5 - CR4:OSFXSR=0: SSE => #UD */ 718 { 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "!OSXSAVE" }, /* #6 - CR4:OSXSAVE=0: AVX => #UD */ 719 { 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!AVX" }, /* #7 - XCR0:AVX=0: AVX => #UD */ 720 { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_UD, "XCR0!SSE" }, /* #8 - XCR0:SSE+AVX=0: AVX => #UD */ 723 721 /* Memory misalignment and alignment checks: */ 724 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #10*/725 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC }, /* #11*/726 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB }, /* #12*/722 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "Misalign" }, /* #9 - misaligned data: no effect */ 723 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC, "AlChkMis" }, /* #10 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC */ 724 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #11 - aligned data + CR0:AM + fl:AC: no effect */ 727 725 /* AMD only: */ 728 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP }, /* #13 */ 729 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, X86_XCPT_AC, X86_XCPT_GP }, /* #14 */ 726 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #12 */ 727 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #13 */ 728 }; 729 730 /** Exceptions type 23_4 test configurations. */ 731 /** Intel 64 & IA-32 Architecture SDM Vol 3B Table 23-4, "Exception Conditions for Legacy SIMD/MMX Instructions with FP Exception and 16-Byte Alignment" */ 732 /** For our purposes: same as g_aXcptConfig3 except drop the OSXSAVE & XCR0 tests, add pending x87 exception test */ 733 /** Instructions: cvtpd2pi, cvttpd2pi */ 734 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig23_4[] = 735 { 736 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 737 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 738 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 739 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 740 { 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "!MMEXCPT" }, /* #1 - CR4:OSXMMEXCPT: #UD instead of #XF for SIMD exceptions */ 741 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #2 - CR0:MP: no effect by itself */ 742 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #3 - CR0:EM: MMX/SSE => #UD */ 743 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #4 - CR0:TS: MMX/SSE/AVX => #NM */ 744 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #5 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 745 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #6 - CR4:OSFXSR=0: SSE => #UD */ 746 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_MF, X86_XCPT_DB, "x87Excpt" }, /* #7 - pending x87 exception */ 747 /* AMD only: */ 748 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #8 */ 749 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #9 */ 750 /* Memory misalignment and alignment checks: */ 751 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: no effect */ 752 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_AC, X86_XCPT_AC, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: MMX/SSE/AVX => #AC */ 753 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 754 }; 755 756 /** Exceptions type 23_5 test configurations. */ 757 /** Intel 64 & IA-32 Architecture SDM Vol 3B Table 23-5, "Exception Conditions for Legacy SIMD/MMX Instructions with XMM and FP Exception" */ 758 /** For our purposes: same as g_aXcptConfig4 except drop the OSXSAVE & XCR0 tests, add pending x87 exception test */ 759 /** Instructions: cvtpi2ps, cvtps2pi, cvttps2pi */ 760 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig23_5[] = 761 { 762 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 763 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 764 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 765 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 766 { 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "!MMEXCPT" }, /* #1 - CR4:OSXMMEXCPT: #UD instead of #XF for SIMD exceptions */ 767 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #2 - CR0:MP: no effect by itself */ 768 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #3 - CR0:EM: MMX/SSE => #UD */ 769 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #4 - CR0:TS: MMX/SSE/AVX => #NM */ 770 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #5 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 771 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #6 - CR4:OSFXSR=0: SSE => #UD */ 772 { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, X86_XCPT_MF, X86_XCPT_DB, "x87Excpt" }, /* #7 - pending x87 exception */ 773 /* AMD only: */ 774 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #8 */ 775 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #9 */ 776 /* Memory misalignment and alignment checks: */ 777 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB, "Misalign" }, /* #10 - misaligned data: SSE => #GP */ 778 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB, "AlChkMis" }, /* #11 - misaligned data + CR0:AM + fl:AC: SSE => #GP */ 779 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #12 - aligned data + CR0:AM + fl:AC: no effect */ 780 }; 781 782 /** Exceptions type 23_6 test configurations. */ 783 /** Intel 64 & IA-32 Architecture SDM Vol 3B Table 23-6, "Exception Conditions for Legacy SIMD/MMX Instructions with XMM and without FP Exception" */ 784 /** For our purposes: same as g_aXcptConfig4 except drop the OSXSAVE, OSXMMEXCPT, XCR0 tests */ 785 /** Instructions: cvtpi2pd */ 786 static const BS3CPUINSTR4_CONFIG_T g_aXcptConfig23_6[] = 787 { 788 /* X87 SSE SSE SSE AVX SSE+AVX AVX AVX MMX(SSE) SSE AVX+ AMD/SSE <-- applies to 789 * CR0 CR0 CR0 CR4 CR4 CR4 XCR0 XCR0 FCW AMD/SSE MXCSR 790 * MP, EM, TS, OSFXSR, OSXSAVE, OSXMMEXCPT SSE, AVX, ES+, fAligned, AC/AM, MM, bXcptSse, bXcptAvx */ 791 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "(Normal)" }, /* #0 - normal */ 792 { 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_DB, X86_XCPT_DB, "CR0:MP=1" }, /* #1 - CR0:MP: no effect by itself */ 793 { 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "CR0:EM=1" }, /* #2 - CR0:EM: MMX/SSE => #UD */ 794 { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_NM, X86_XCPT_NM, "CR0:TS=1" }, /* #3 - CR0:TS: MMX/SSE/AVX => #NM */ 795 { 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_NM, "CR0:EMTS" }, /* #4 - CR0:EM+TS: MMX/SSE => #UD, AVX => #NM */ 796 { 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, X86_XCPT_UD, X86_XCPT_DB, "OSFXSR=0" }, /* #5 - CR4:OSFXSR=0: SSE => #UD */ 797 /* Memory misalignment and alignment checks: */ 798 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, X86_XCPT_GP, X86_XCPT_DB, "Misalign" }, /* #6 - misaligned data: SSE => #GP */ 799 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, X86_XCPT_GP, X86_XCPT_DB, "AlChkMis" }, /* #7 - misaligned data + CR0:AM + fl:AC: SSE => #GP */ 800 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, X86_XCPT_DB, X86_XCPT_DB, "AlChkAli" }, /* #8 - aligned data + CR0:AM + fl:AC: no effect */ 801 /* AMD only: */ 802 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, X86_XCPT_DB, X86_XCPT_GP, "AMDmm-AC" }, /* #9 */ 803 { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, X86_XCPT_AC, X86_XCPT_GP, "AMDmm+AC" }, /* #10 */ 730 804 }; 731 805 … … 1974 2048 return false; 1975 2049 2050 /* Currently we skip pending x87 exceptions in real mode as they cannot be 2051 caught, given that we preserve the bios int10h. */ 2052 if (pConfig->fX87XcptPending && BS3_MODE_IS_RM_OR_V86(bMode)) 2053 return false; 2054 1976 2055 /* 1977 2056 * Modify the test context. … … 2030 2109 } 2031 2110 2032 /** @todo Can we remove this? x87 FPU and SIMD are independent. */ 2033 Bs3ExtCtxSetFsw(pExtCtx, pSavedCfg->uFsw & ~(X86_FSW_ES | X86_FSW_B)); 2111 if (!pConfig->fX87XcptPending) 2112 Bs3ExtCtxSetFsw(pExtCtx, pSavedCfg->uFsw & ~(X86_FSW_ES | X86_FSW_B)); 2113 else 2114 { 2115 Bs3ExtCtxSetFcw(pExtCtx, pSavedCfg->uFcw & ~X86_FCW_ZM); 2116 Bs3ExtCtxSetFsw(pExtCtx, pSavedCfg->uFsw | X86_FSW_ZE | X86_FSW_ES | X86_FSW_B); 2117 pCtx->cr0.u32 |= X86_CR0_NE; 2118 } 2034 2119 2035 2120 if (pConfig->fMxCsrMM) … … 2965 3050 : fSseInstr ? paConfigs[iCfg].bXcptSse 2966 3051 : BS3_MODE_IS_RM_OR_V86(bMode) ? X86_XCPT_UD : paConfigs[iCfg].bXcptAvx; 3052 /** @todo puts bRing[0..3] in 1xxxx digit, iCfg[0..14] in 11xx digits, iTest[0..80+] in 1x digit, and max(cRecompRuns, cValues)[0..80+] in 1 digit -- needs 32 bits */ 2967 3053 uint16_t idTestStep = bRing * 10000 + iCfg * 100 + iTest * 10; 2968 3054 unsigned cRecompRuns = 0; … … 3029 3115 if (cErrors != Bs3TestSubErrorCount()) 3030 3116 { 3031 if (paConfigs[iCfg].fAligned) 3032 Bs3TestFailedF("%s: ring-%d/cfg#%u/test#%u/value#%u failed (bXcptExpect=%u %s, %s %u-bit)", 3033 Bs3GetModeName(bMode), bRing, iCfg, iTest, iVal, 3034 bXcptExpect, bs3CpuInstr4XcptName(bXcptExpect), fSseInstr ? "SSE" : "AVX", cbOperand * 8); 3035 else 3036 Bs3TestFailedF("%s: ring-%d/cfg#%u/test#%u/value#%u failed (bXcptExpect=%u %s, puMemOp=%p, EFLAGS=%#RX32, %s %u-bit)", 3037 Bs3GetModeName(bMode), bRing, iCfg, iTest, iVal, 3038 bXcptExpect, bs3CpuInstr4XcptName(bXcptExpect), puMemOp, 3039 TrapFrame.Ctx.rflags.u32, fSseInstr ? "SSE" : "AVX", cbOperand * 8); 3117 #define PUMEMOP_MAXLEN sizeof("puMemOp=0x0123456789abcdef, EFLAGS=0x01234567, ") 3118 char szPuMemOpStr[PUMEMOP_MAXLEN] = ""; 3119 3120 if (!paConfigs[iCfg].fAligned) 3121 Bs3StrPrintf(szPuMemOpStr, PUMEMOP_MAXLEN, "puMemOp=%p, EFLAGS=%#RX32, ", puMemOp, TrapFrame.Ctx.rflags.u32); 3122 Bs3TestFailedF("%s: ring-%d/%u:%s/tst#%u/val#%u failed (bXcptExpect=%u %s, %s%s-%u)", 3123 Bs3GetModeName(bMode), bRing, iCfg, paConfigs[iCfg].pszCfgName, iTest, iVal, bXcptExpect, 3124 bs3CpuInstr4XcptName(bXcptExpect), szPuMemOpStr, fSseInstr ? "SSE" : "AVX", cbOperand * 8); 3040 3125 Bs3TestPrintf("\n"); 3041 3126 } … … 12599 12684 static BS3CPUINSTR4_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR4_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64); 12600 12685 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 12686 /** Note: Intel 64 & IA-32 Architecture SDM Vol 2B says Table 2-19, "Type 2 Class Exception Conditions."; testing says Type 3 */ 12601 12687 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 12602 12688 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); … … 15212 15298 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 15213 15299 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 15214 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));15300 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); 15215 15301 } 15216 15302 … … 15642 15728 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 15643 15729 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 15644 g_aXcptConfig 5, RT_ELEMENTS(g_aXcptConfig5));15730 g_aXcptConfig3, RT_ELEMENTS(g_aXcptConfig3)); 15645 15731 } 15646 15732 … … 15898 15984 unsigned const iTest = BS3CPUINSTR4_TEST_MODES_INDEX(bMode); 15899 15985 return bs3CpuInstr4_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests, 15900 g_aXcptConfig 2, RT_ELEMENTS(g_aXcptConfig2));15986 g_aXcptConfig4, RT_ELEMENTS(g_aXcptConfig4)); 15901 15987 } 15902 15988
Note:
See TracChangeset
for help on using the changeset viewer.