Changeset 70651 in vbox for trunk/src/VBox/ValidationKit/bootsectors
- Timestamp:
- Jan 19, 2018 4:00:42 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 120382
- Location:
- trunk/src/VBox/ValidationKit/bootsectors
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.c
r69111 r70651 39 39 *********************************************************************************************************************************/ 40 40 #ifdef BS3_INSTANTIATING_CMN 41 # if ARCH_BITS == 64 42 typedef struct BS3CI2FSGSBASE 43 { 44 const char *pszDesc; 45 bool f64BitOperand; 46 FPFNBS3FAR pfnWorker; 47 uint8_t offWorkerUd2; 48 FPFNBS3FAR pfnVerifyWorker; 49 uint8_t offVerifyWorkerUd2; 50 } BS3CI2FSGSBASE; 51 # endif 41 52 #endif 42 53 … … 60 71 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_repnz_cmpxchg16b_rdi_ud2); 61 72 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_lock_repnz_cmpxchg16b_rdi_ud2); 73 74 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrfsbase_rbx_ud2); 75 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrfsbase_ebx_ud2); 76 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrfsbase_rbx_rdfsbase_rcx_ud2); 77 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrfsbase_ebx_rdfsbase_ecx_ud2); 78 79 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrgsbase_rbx_ud2); 80 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrgsbase_ebx_ud2); 81 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrgsbase_rbx_rdgsbase_rcx_ud2); 82 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_wrgsbase_ebx_rdgsbase_ecx_ud2); 83 84 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_rdfsbase_rbx_ud2); 85 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_rdfsbase_ebx_ud2); 86 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_rdgsbase_rbx_ud2); 87 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_rdgsbase_ebx_ud2); 62 88 # endif 63 89 #endif … … 68 94 *********************************************************************************************************************************/ 69 95 #ifdef BS3_INSTANTIATING_CMN 70 96 # if ARCH_BITS == 64 97 static BS3CI2FSGSBASE const s_aWrFsBaseWorkers[] = 98 { 99 { "wrfsbase rbx", true, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_rbx_ud2), 5, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_rbx_rdfsbase_rcx_ud2), 10 }, 100 { "wrfsbase ebx", false, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_ebx_ud2), 4, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_ebx_rdfsbase_ecx_ud2), 8 }, 101 }; 102 103 static BS3CI2FSGSBASE const s_aWrGsBaseWorkers[] = 104 { 105 { "wrgsbase rbx", true, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_rbx_ud2), 5, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_rbx_rdgsbase_rcx_ud2), 10 }, 106 { "wrgsbase ebx", false, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_ebx_ud2), 4, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_ebx_rdgsbase_ecx_ud2), 8 }, 107 }; 108 109 static BS3CI2FSGSBASE const s_aRdFsBaseWorkers[] = 110 { 111 { "rdfsbase rbx", true, BS3_CMN_NM(bs3CpuInstr2_rdfsbase_rbx_ud2), 5, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_rbx_rdfsbase_rcx_ud2), 10 }, 112 { "rdfsbase ebx", false, BS3_CMN_NM(bs3CpuInstr2_rdfsbase_ebx_ud2), 4, BS3_CMN_NM(bs3CpuInstr2_wrfsbase_ebx_rdfsbase_ecx_ud2), 8 }, 113 }; 114 115 static BS3CI2FSGSBASE const s_aRdGsBaseWorkers[] = 116 { 117 { "rdgsbase rbx", true, BS3_CMN_NM(bs3CpuInstr2_rdgsbase_rbx_ud2), 5, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_rbx_rdgsbase_rcx_ud2), 10 }, 118 { "rdgsbase ebx", false, BS3_CMN_NM(bs3CpuInstr2_rdgsbase_ebx_ud2), 4, BS3_CMN_NM(bs3CpuInstr2_wrgsbase_ebx_rdgsbase_ecx_ud2), 8 }, 119 }; 120 # endif 71 121 #endif /* BS3_INSTANTIATING_CMN - global */ 72 122 … … 669 719 return 0; 670 720 } 721 722 723 static void bs3CpuInstr2_fsgsbase_ExpectUD(uint8_t bMode, PBS3REGCTX pCtx, PBS3REGCTX pExpectCtx, PBS3TRAPFRAME pTrapFrame) 724 { 725 pCtx->rbx.u = 0; 726 Bs3MemCpy(pExpectCtx, pCtx, sizeof(*pExpectCtx)); 727 Bs3TrapSetJmpAndRestore(pCtx, pTrapFrame); 728 pExpectCtx->rip.u = pCtx->rip.u; 729 pExpectCtx->rflags.u32 |= X86_EFL_RF; 730 if ( !Bs3TestCheckRegCtxEx(&pTrapFrame->Ctx, pExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 0 /*fExtraEfl*/, "lm64", 731 0 /*idTestStep*/) 732 || pTrapFrame->bXcpt != X86_XCPT_UD) 733 { 734 Bs3TestFailedF("Expected #UD, got %#x (%#x)", pTrapFrame->bXcpt, pTrapFrame->uErrCd); 735 ASMHalt(); 736 } 737 } 738 739 740 static bool bs3CpuInstr2_fsgsbase_VerifyWorker(uint8_t bMode, PBS3REGCTX pCtx, PBS3REGCTX pExpectCtx, PBS3TRAPFRAME pTrapFrame, 741 BS3CI2FSGSBASE const *pFsGsBaseWorker, unsigned *puIter) 742 { 743 bool fPassed = true; 744 unsigned iValue = 0; 745 static const struct 746 { 747 bool fGP; 748 uint64_t u64Base; 749 } s_aValues64[] = 750 { 751 { false, UINT64_C(0x0000000000000000) }, 752 { false, UINT64_C(0x0000000000000001) }, 753 { false, UINT64_C(0x0000000000000010) }, 754 { false, UINT64_C(0x0000000000000123) }, 755 { false, UINT64_C(0x0000000000001234) }, 756 { false, UINT64_C(0x0000000000012345) }, 757 { false, UINT64_C(0x0000000000123456) }, 758 { false, UINT64_C(0x0000000001234567) }, 759 { false, UINT64_C(0x0000000012345678) }, 760 { false, UINT64_C(0x0000000123456789) }, 761 { false, UINT64_C(0x000000123456789a) }, 762 { false, UINT64_C(0x00000123456789ab) }, 763 { false, UINT64_C(0x0000123456789abc) }, 764 { false, UINT64_C(0x00007ffffeefefef) }, 765 { false, UINT64_C(0x00007fffffffffff) }, 766 { true, UINT64_C(0x0000800000000000) }, 767 { true, UINT64_C(0x0000800000000000) }, 768 { true, UINT64_C(0x0000800000000333) }, 769 { true, UINT64_C(0x0001000000000000) }, 770 { true, UINT64_C(0x0012000000000000) }, 771 { true, UINT64_C(0x0123000000000000) }, 772 { true, UINT64_C(0x1234000000000000) }, 773 { true, UINT64_C(0xffff300000000000) }, 774 { true, UINT64_C(0xffff7fffffffffff) }, 775 { true, UINT64_C(0xffff7fffffffffff) }, 776 { false, UINT64_C(0xffff800000000000) }, 777 { false, UINT64_C(0xffffffffffeefefe) }, 778 { false, UINT64_C(0xffffffffffffffff) }, 779 { false, UINT64_C(0xffffffffffffffff) }, 780 { false, UINT64_C(0x00000000efefefef) }, 781 { false, UINT64_C(0x0000000080204060) }, 782 { false, UINT64_C(0x00000000ddeeffaa) }, 783 { false, UINT64_C(0x00000000fdecdbca) }, 784 { false, UINT64_C(0x000000006098456b) }, 785 { false, UINT64_C(0x0000000098506099) }, 786 { false, UINT64_C(0x00000000206950bc) }, 787 { false, UINT64_C(0x000000009740395d) }, 788 { false, UINT64_C(0x0000000064a9455e) }, 789 { false, UINT64_C(0x00000000d20b6eff) }, 790 { false, UINT64_C(0x0000000085296d46) }, 791 { false, UINT64_C(0x0000000007000039) }, 792 { false, UINT64_C(0x000000000007fe00) }, 793 }; 794 795 Bs3RegCtxSetRipCsFromCurPtr(pCtx, pFsGsBaseWorker->pfnVerifyWorker); 796 if (pFsGsBaseWorker->f64BitOperand) 797 { 798 for (iValue = 0; iValue < RT_ELEMENTS(s_aValues64); iValue++) 799 { 800 bool const fGP = s_aValues64[iValue].fGP; 801 802 pCtx->rbx.u = s_aValues64[iValue].u64Base; 803 pCtx->rcx.u = 0; 804 pCtx->cr4.u |= X86_CR4_FSGSBASE; 805 Bs3MemCpy(pExpectCtx, pCtx, sizeof(*pExpectCtx)); 806 Bs3TrapSetJmpAndRestore(pCtx, pTrapFrame); 807 pExpectCtx->rip.u = pCtx->rip.u + (!fGP ? pFsGsBaseWorker->offVerifyWorkerUd2 : 0); 808 pExpectCtx->rcx.u = !fGP ? s_aValues64[iValue].u64Base : 0; 809 pExpectCtx->rflags.u32 |= X86_EFL_RF; 810 if ( !Bs3TestCheckRegCtxEx(&pTrapFrame->Ctx, pExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 811 0 /*fExtraEfl*/, "lm64", 0 /*idTestStep*/) 812 || (fGP && pTrapFrame->bXcpt != X86_XCPT_GP)) 813 { 814 if (fGP && pTrapFrame->bXcpt != X86_XCPT_GP) 815 Bs3TestFailedF("Expected #GP, got %#x (%#x)", pTrapFrame->bXcpt, pTrapFrame->uErrCd); 816 fPassed = false; 817 break; 818 } 819 } 820 } 821 else 822 { 823 for (iValue = 0; iValue < RT_ELEMENTS(s_aValues64); iValue++) 824 { 825 pCtx->rbx.u = s_aValues64[iValue].u64Base; 826 pCtx->rcx.u = ~s_aValues64[iValue].u64Base; 827 pCtx->cr4.u |= X86_CR4_FSGSBASE; 828 Bs3MemCpy(pExpectCtx, pCtx, sizeof(*pExpectCtx)); 829 Bs3TrapSetJmpAndRestore(pCtx, pTrapFrame); 830 pExpectCtx->rip.u = pCtx->rip.u + pFsGsBaseWorker->offVerifyWorkerUd2; 831 pExpectCtx->rcx.u = s_aValues64[iValue].u64Base & UINT64_C(0x00000000ffffffff); 832 pExpectCtx->rflags.u32 |= X86_EFL_RF; 833 if (!Bs3TestCheckRegCtxEx(&pTrapFrame->Ctx, pExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 834 0 /*fExtraEfl*/, "lm64", 0 /*idTestStep*/)) 835 { 836 fPassed = false; 837 break; 838 } 839 } 840 } 841 842 *puIter = iValue; 843 return fPassed; 844 } 845 846 847 static void bs3CpuInstr2_rdfsbase_rdgsbase_Common(uint8_t bMode, bool fSupportsFsGsBase, 848 BS3CI2FSGSBASE const *paFsGsBaseWorkers, unsigned cFsGsBaseWorkers) 849 { 850 BS3REGCTX Ctx; 851 BS3REGCTX ExpectCtx; 852 BS3TRAPFRAME TrapFrame; 853 unsigned iWorker; 854 unsigned iIter; 855 856 /* Ensure the structures are allocated before we sample the stack pointer. */ 857 Bs3MemSet(&Ctx, 0, sizeof(Ctx)); 858 Bs3MemSet(&ExpectCtx, 0, sizeof(ExpectCtx)); 859 Bs3MemSet(&TrapFrame, 0, sizeof(TrapFrame)); 860 861 /* 862 * Create test context. 863 */ 864 Bs3RegCtxSaveEx(&Ctx, bMode, 512); 865 866 for (iWorker = 0; iWorker < cFsGsBaseWorkers; iWorker++) 867 { 868 Bs3RegCtxSetRipCsFromCurPtr(&Ctx, paFsGsBaseWorkers[iWorker].pfnWorker); 869 if (fSupportsFsGsBase) 870 { 871 /* CR4.FSGSBASE disabled -> #UD. */ 872 Ctx.cr4.u &= ~X86_CR4_FSGSBASE; 873 bs3CpuInstr2_fsgsbase_ExpectUD(bMode, &Ctx, &ExpectCtx, &TrapFrame); 874 875 /* Read null base address. */ 876 Ctx.rbx.u = 0xa0000; 877 Ctx.cr4.u |= X86_CR4_FSGSBASE; 878 Bs3MemCpy(&ExpectCtx, &Ctx, sizeof(ExpectCtx)); 879 Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame); 880 ExpectCtx.rip.u = Ctx.rip.u + paFsGsBaseWorkers[iWorker].offWorkerUd2; 881 ExpectCtx.rbx.u = 0; 882 ExpectCtx.rflags.u32 |= X86_EFL_RF; 883 if (!Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &ExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 0 /*fExtraEfl*/, "lm64", 884 0 /*idTestStep*/)) 885 { 886 ASMHalt(); 887 } 888 889 /* Write and read back the address. */ 890 if (!bs3CpuInstr2_fsgsbase_VerifyWorker(bMode, &Ctx, &ExpectCtx, &TrapFrame, &paFsGsBaseWorkers[iWorker], &iIter)) 891 { 892 Bs3TestFailedF("^^^ %s: iWorker=%u iIter=%u\n", paFsGsBaseWorkers[iWorker].pszDesc, iWorker, iIter); 893 ASMHalt(); 894 } 895 896 /* Clean used GPRs. */ 897 Ctx.rbx.u = 0; 898 Ctx.rcx.u = 0; 899 } 900 else 901 { 902 /* Unsupported by CPUID -> #UD. */ 903 Bs3TestPrintf("Note! FSGSBASE is not supported by the CPU!\n"); 904 bs3CpuInstr2_fsgsbase_ExpectUD(bMode, &Ctx, &ExpectCtx, &TrapFrame); 905 } 906 } 907 } 908 909 910 static void bs3CpuInstr2_wrfsbase_wrgsbase_Common(uint8_t bMode, bool fSupportsFsGsBase, 911 BS3CI2FSGSBASE const *paFsGsBaseWorkers, unsigned cFsGsBaseWorkers) 912 { 913 BS3REGCTX Ctx; 914 BS3REGCTX ExpectCtx; 915 BS3TRAPFRAME TrapFrame; 916 unsigned iWorker; 917 unsigned iIter; 918 919 /* Ensure the structures are allocated before we sample the stack pointer. */ 920 Bs3MemSet(&Ctx, 0, sizeof(Ctx)); 921 Bs3MemSet(&ExpectCtx, 0, sizeof(ExpectCtx)); 922 Bs3MemSet(&TrapFrame, 0, sizeof(TrapFrame)); 923 924 /* 925 * Create test context. 926 */ 927 Bs3RegCtxSaveEx(&Ctx, bMode, 512); 928 929 for (iWorker = 0; iWorker < cFsGsBaseWorkers; iWorker++) 930 { 931 Bs3RegCtxSetRipCsFromCurPtr(&Ctx, paFsGsBaseWorkers[iWorker].pfnWorker); 932 if (fSupportsFsGsBase) 933 { 934 /* CR4.FSGSBASE disabled -> #UD. */ 935 Ctx.cr4.u &= ~X86_CR4_FSGSBASE; 936 bs3CpuInstr2_fsgsbase_ExpectUD(bMode, &Ctx, &ExpectCtx, &TrapFrame); 937 938 /* Write the base address. */ 939 Ctx.rbx.u = 0xa0000; 940 Ctx.cr4.u |= X86_CR4_FSGSBASE; 941 Bs3MemCpy(&ExpectCtx, &Ctx, sizeof(ExpectCtx)); 942 Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame); 943 ExpectCtx.rip.u = Ctx.rip.u + paFsGsBaseWorkers[iWorker].offWorkerUd2; 944 ExpectCtx.rflags.u32 |= X86_EFL_RF; 945 if (!Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &ExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 0 /*fExtraEfl*/, "lm64", 946 0 /*idTestStep*/)) 947 { 948 ASMHalt(); 949 } 950 951 /* Write and read back the address. */ 952 if (!bs3CpuInstr2_fsgsbase_VerifyWorker(bMode, &Ctx, &ExpectCtx, &TrapFrame, &paFsGsBaseWorkers[iWorker], &iIter)) 953 { 954 Bs3TestFailedF("^^^ %s: iWorker=%u iIter=%u\n", paFsGsBaseWorkers[iWorker].pszDesc, iWorker, iIter); 955 ASMHalt(); 956 } 957 958 /* Clean used GPRs. */ 959 Ctx.rbx.u = 0; 960 Ctx.rcx.u = 0; 961 } 962 else 963 { 964 /* Unsupported by CPUID -> #UD. */ 965 Bs3TestPrintf("Note! FSGSBASE is not supported by the CPU!\n"); 966 bs3CpuInstr2_fsgsbase_ExpectUD(bMode, &Ctx, &ExpectCtx, &TrapFrame); 967 } 968 } 969 } 970 971 972 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_wrfsbase)(uint8_t bMode) 973 { 974 bool const fSupportFsGsBase = RT_BOOL(ASMCpuId_EBX(7) & X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE); 975 bs3CpuInstr2_wrfsbase_wrgsbase_Common(bMode, fSupportFsGsBase, s_aWrFsBaseWorkers, RT_ELEMENTS(s_aWrFsBaseWorkers)); 976 return 0; 977 } 978 979 980 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_wrgsbase)(uint8_t bMode) 981 { 982 bool const fSupportFsGsBase = RT_BOOL(ASMCpuId_EBX(7) & X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE); 983 bs3CpuInstr2_wrfsbase_wrgsbase_Common(bMode, fSupportFsGsBase, s_aWrGsBaseWorkers, RT_ELEMENTS(s_aWrGsBaseWorkers)); 984 return 0; 985 } 986 987 988 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_rdfsbase)(uint8_t bMode) 989 { 990 bool const fSupportFsGsBase = RT_BOOL(ASMCpuId_EBX(7) & X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE); 991 bs3CpuInstr2_rdfsbase_rdgsbase_Common(bMode, fSupportFsGsBase, s_aRdFsBaseWorkers, RT_ELEMENTS(s_aRdFsBaseWorkers)); 992 return 0; 993 } 994 995 996 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_rdgsbase)(uint8_t bMode) 997 { 998 bool const fSupportFsGsBase = RT_BOOL(ASMCpuId_EBX(7) & X86_CPUID_STEXT_FEATURE_EBX_FSGSBASE); 999 bs3CpuInstr2_rdfsbase_rdgsbase_Common(bMode, fSupportFsGsBase, s_aRdGsBaseWorkers, RT_ELEMENTS(s_aRdGsBaseWorkers)); 1000 return 0; 1001 } 671 1002 # endif /* ARCH_BITS == 64 */ 672 1003 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.mac
r69222 r70651 158 158 BS3_PROC_END_CMN bs3CpuInstr2_lock_repnz_cmpxchg16b_rdi_ud2 159 159 160 161 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrfsbase_rbx_ud2, BS3_PBC_NEAR 162 wrfsbase rbx 163 .again: 164 ud2 165 jmp .again 166 AssertCompile(.again - BS3_LAST_LABEL == 5) 167 BS3_PROC_END_CMN bs3CpuInstr2_wrfsbase_rbx_ud2 168 169 170 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrfsbase_ebx_ud2, BS3_PBC_NEAR 171 wrfsbase ebx 172 .again: 173 ud2 174 jmp .again 175 AssertCompile(.again - BS3_LAST_LABEL == 4) 176 BS3_PROC_END_CMN bs3CpuInstr2_wrfsbase_ebx_ud2 177 178 179 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrgsbase_rbx_ud2, BS3_PBC_NEAR 180 wrgsbase rbx 181 .again: 182 ud2 183 jmp .again 184 AssertCompile(.again - BS3_LAST_LABEL == 5) 185 BS3_PROC_END_CMN bs3CpuInstr2_wrgsbase_rbx_ud2 186 187 188 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrgsbase_ebx_ud2, BS3_PBC_NEAR 189 wrgsbase ebx 190 .again: 191 ud2 192 jmp .again 193 AssertCompile(.again - BS3_LAST_LABEL == 4) 194 BS3_PROC_END_CMN bs3CpuInstr2_wrgsbase_ebx_ud2 195 196 197 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrfsbase_rbx_rdfsbase_rcx_ud2, BS3_PBC_NEAR 198 wrfsbase rbx 199 rdfsbase rcx 200 .again: 201 ud2 202 jmp .again 203 AssertCompile(.again - BS3_LAST_LABEL == 10) 204 BS3_PROC_END_CMN bs3CpuInstr2_wrfsbase_rbx_rdfsbase_rcx_ud2 205 206 207 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrfsbase_ebx_rdfsbase_ecx_ud2, BS3_PBC_NEAR 208 wrfsbase ebx 209 rdfsbase ecx 210 .again: 211 ud2 212 jmp .again 213 AssertCompile(.again - BS3_LAST_LABEL == 8) 214 BS3_PROC_END_CMN bs3CpuInstr2_wrfsbase_ebx_rdfsbase_ecx_ud2 215 216 217 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrgsbase_rbx_rdgsbase_rcx_ud2, BS3_PBC_NEAR 218 wrgsbase rbx 219 rdgsbase rcx 220 .again: 221 ud2 222 jmp .again 223 AssertCompile(.again - BS3_LAST_LABEL == 10) 224 BS3_PROC_END_CMN bs3CpuInstr2_wrgsbase_rbx_rdgsbase_rcx_ud2 225 226 227 BS3_PROC_BEGIN_CMN bs3CpuInstr2_wrgsbase_ebx_rdgsbase_ecx_ud2, BS3_PBC_NEAR 228 wrgsbase ebx 229 rdgsbase ecx 230 .again: 231 ud2 232 jmp .again 233 AssertCompile(.again - BS3_LAST_LABEL == 8) 234 BS3_PROC_END_CMN bs3CpuInstr2_wrfgbase_ebx_rdgsbase_ecx_ud2 235 236 237 BS3_PROC_BEGIN_CMN bs3CpuInstr2_rdfsbase_rbx_ud2, BS3_PBC_NEAR 238 rdfsbase rbx 239 .again: 240 ud2 241 jmp .again 242 AssertCompile(.again - BS3_LAST_LABEL == 5) 243 BS3_PROC_END_CMN bs3CpuInstr2_rdfsbase_rbx_ud2 244 245 246 BS3_PROC_BEGIN_CMN bs3CpuInstr2_rdfsbase_ebx_ud2, BS3_PBC_NEAR 247 rdfsbase ebx 248 .again: 249 ud2 250 jmp .again 251 AssertCompile(.again - BS3_LAST_LABEL == 4) 252 BS3_PROC_END_CMN bs3CpuInstr2_rdfsbase_ebx_ud2 253 254 255 BS3_PROC_BEGIN_CMN bs3CpuInstr2_rdgsbase_rbx_ud2, BS3_PBC_NEAR 256 rdgsbase rbx 257 .again: 258 ud2 259 jmp .again 260 AssertCompile(.again - BS3_LAST_LABEL == 5) 261 BS3_PROC_END_CMN bs3CpuInstr2_rdgsbase_rbx_ud2 262 263 264 BS3_PROC_BEGIN_CMN bs3CpuInstr2_rdgsbase_ebx_ud2, BS3_PBC_NEAR 265 rdgsbase ebx 266 .again: 267 ud2 268 jmp .again 269 AssertCompile(.again - BS3_LAST_LABEL == 4) 270 BS3_PROC_END_CMN bs3CpuInstr2_rdgsbase_ebx_ud2 271 272 160 273 ;; @todo figure out this fudge. sigh. 161 274 times (348) db 0cch ; fudge to avoid 'rderr' during boot. -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2.c
r69111 r70651 40 40 BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_idiv); 41 41 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_cmpxchg16b); 42 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_wrfsbase); 43 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_wrgsbase); 44 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_rdfsbase); 45 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_rdgsbase); 42 46 43 47 … … 52 56 BS3TESTMODEENTRY_CMN("idiv", bs3CpuInstr2_idiv), 53 57 BS3TESTMODEENTRY_CMN_64("cmpxchg16b", bs3CpuInstr2_cmpxchg16b), 58 BS3TESTMODEENTRY_CMN_64("wrfsbase", bs3CpuInstr2_wrfsbase), 59 BS3TESTMODEENTRY_CMN_64("wrgsbase", bs3CpuInstr2_wrgsbase), 60 BS3TESTMODEENTRY_CMN_64("rdfsbase", bs3CpuInstr2_rdfsbase), 61 BS3TESTMODEENTRY_CMN_64("rdgsbase", bs3CpuInstr2_rdgsbase), 54 62 }; 55 63
Note:
See TracChangeset
for help on using the changeset viewer.