- Timestamp:
- Feb 5, 2024 5:36:09 PM (13 months ago)
- svn:sync-xref-src-repo-rev:
- 161475
- Location:
- trunk/src/VBox/ValidationKit/bootsectors
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.c
r102898 r103208 226 226 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_adox_RAX_RBX_icebp); 227 227 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_adox_RAX_qword_FSxBX_icebp); 228 229 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_cmpxchg8b_FSxDI_icebp); 230 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp); 231 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp); 232 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp); 233 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp); 234 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp); 235 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp); 236 extern FNBS3FAR BS3_CMN_NM(bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp); 228 237 229 238 # if ARCH_BITS == 64 … … 2953 2962 } 2954 2963 Ctx.rflags.u16 &= ~X86_EFL_STATUS_BITS; 2964 } 2965 2966 return 0; 2967 } 2968 2969 2970 2971 /* 2972 * CMPXCHG8B 2973 */ 2974 BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_cmpxchg8b)(uint8_t bMode) 2975 { 2976 2977 BS3REGCTX Ctx; 2978 BS3REGCTX ExpectCtx; 2979 BS3TRAPFRAME TrapFrame; 2980 RTUINT64U au64[3]; 2981 PRTUINT64U pau64 = RT_ALIGN_PT(&au64[0], sizeof(RTUINT64U), PRTUINT64U); 2982 bool const fSupportCX8 = RT_BOOL(ASMCpuId_EDX(1) & X86_CPUID_FEATURE_EDX_CX8); 2983 unsigned iFlags; 2984 unsigned offBuf; 2985 unsigned iMatch; 2986 unsigned iWorker; 2987 static struct 2988 { 2989 bool fLocked; 2990 uint8_t offIcebp; 2991 FNBS3FAR *pfnWorker; 2992 } const s_aWorkers[] = 2993 { 2994 { false, 5, BS3_CMN_NM(bs3CpuInstr2_cmpxchg8b_FSxDI_icebp) }, 2995 #if TMPL_MODE == BS3_MODE_RM || TMPL_MODE == BS3_MODE_PP16 2996 { false, 5, BS3_CMN_NM(bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp) }, 2997 #else 2998 { false, 6, BS3_CMN_NM(bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp) }, 2999 #endif 3000 { false, 6, BS3_CMN_NM(bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp) }, 3001 { false, 6, BS3_CMN_NM(bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp) }, 3002 { true, 1+5, BS3_CMN_NM(bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp) }, 3003 { true, 1+6, BS3_CMN_NM(bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp) }, 3004 { true, 1+6, BS3_CMN_NM(bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp) }, 3005 { true, 1+6, BS3_CMN_NM(bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp) }, 3006 }; 3007 3008 /* Ensure the structures are allocated before we sample the stack pointer. */ 3009 Bs3MemSet(&Ctx, 0, sizeof(Ctx)); 3010 Bs3MemSet(&ExpectCtx, 0, sizeof(ExpectCtx)); 3011 Bs3MemSet(&TrapFrame, 0, sizeof(TrapFrame)); 3012 Bs3MemSet(pau64, 0, sizeof(pau64[0]) * 2); 3013 3014 /* 3015 * Create test context. 3016 */ 3017 Bs3RegCtxSaveEx(&Ctx, bMode, 512); 3018 if (!fSupportCX8) 3019 Bs3TestPrintf("Note! CMPXCHG8B is not supported by the CPU!\n"); 3020 3021 /* 3022 * One loop with the normal variant and one with the locked one 3023 */ 3024 g_usBs3TestStep = 0; 3025 for (iWorker = 0; iWorker < RT_ELEMENTS(s_aWorkers); iWorker++) 3026 { 3027 Bs3RegCtxSetRipCsFromCurPtr(&Ctx, s_aWorkers[iWorker].pfnWorker); 3028 3029 /* 3030 * One loop with all status flags set, and one with them clear. 3031 */ 3032 Ctx.rflags.u16 |= X86_EFL_STATUS_BITS; 3033 for (iFlags = 0; iFlags < 2; iFlags++) 3034 { 3035 Bs3MemCpy(&ExpectCtx, &Ctx, sizeof(ExpectCtx)); 3036 3037 for (offBuf = 0; offBuf < sizeof(RTUINT64U); offBuf++) 3038 { 3039 # define CX8_OLD_LO UINT32_C(0xcc9c4bbd) 3040 # define CX8_OLD_HI UINT32_C(0x749549ab) 3041 # define CX8_MISMATCH_LO UINT32_C(0x90f18981) 3042 # define CX8_MISMATCH_HI UINT32_C(0xfd5b4000) 3043 # define CX8_STORE_LO UINT32_C(0x51f6559b) 3044 # define CX8_STORE_HI UINT32_C(0xd1b54963) 3045 3046 PRTUINT64U pBuf = (PRTUINT64U)&pau64->au8[offBuf]; 3047 3048 ExpectCtx.rax.u = Ctx.rax.u = CX8_MISMATCH_LO; 3049 ExpectCtx.rdx.u = Ctx.rdx.u = CX8_MISMATCH_HI; 3050 3051 Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rdi, &Ctx.fs, pBuf); 3052 Bs3RegCtxSetGrpSegFromCurPtr(&ExpectCtx, &ExpectCtx.rdi, &ExpectCtx.fs, pBuf); 3053 3054 for (iMatch = 0; iMatch < 2; iMatch++) 3055 { 3056 uint8_t bExpectXcpt; 3057 pBuf->s.Lo = CX8_OLD_LO; 3058 pBuf->s.Hi = CX8_OLD_HI; 3059 3060 Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame); 3061 g_usBs3TestStep++; 3062 //Bs3TestPrintf("Test: iFlags=%d offBuf=%d iMatch=%u iWorker=%u\n", iFlags, offBuf, iMatch, iWorker); 3063 bExpectXcpt = X86_XCPT_DB; 3064 if (fSupportCX8) 3065 { 3066 ExpectCtx.rax.u = CX8_OLD_LO; 3067 ExpectCtx.rdx.u = CX8_OLD_HI; 3068 if (iMatch & 1) 3069 ExpectCtx.rflags.u32 = Ctx.rflags.u32 | X86_EFL_ZF; 3070 else 3071 ExpectCtx.rflags.u32 = Ctx.rflags.u32 & ~X86_EFL_ZF; 3072 ExpectCtx.rip.u = Ctx.rip.u + s_aWorkers[iWorker].offIcebp; 3073 3074 /** @todo r=aeichner RF (Resume Flag) gets always cleared on my i7-6700K. */ 3075 ExpectCtx.rflags.u32 &= ~X86_EFL_RF; 3076 } 3077 if ( !Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &ExpectCtx, 0 /*cbPcAdjust*/, 0 /*cbSpAdjust*/, 3078 0 /*fExtraEfl*/, "mode", 0 /*idTestStep*/) 3079 || TrapFrame.bXcpt != bExpectXcpt) 3080 { 3081 if (TrapFrame.bXcpt != bExpectXcpt) 3082 Bs3TestFailedF("Expected bXcpt=#%x, got %#x (%#x)", bExpectXcpt, TrapFrame.bXcpt, TrapFrame.uErrCd); 3083 Bs3TestFailedF("^^^ iWorker=%d iFlags=%d offBuf=%d iMatch=%u\n", iWorker, iFlags, offBuf, iMatch); 3084 ASMHalt(); 3085 } 3086 3087 ExpectCtx.rax.u = Ctx.rax.u = CX8_OLD_LO; 3088 ExpectCtx.rdx.u = Ctx.rdx.u = CX8_OLD_HI; 3089 } 3090 } 3091 Ctx.rflags.u16 &= ~X86_EFL_STATUS_BITS; 3092 } 2955 3093 } 2956 3094 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.mac
r98828 r103208 713 713 714 714 ; 715 ; CMPXCHG8B 716 ; 717 BS3_PROC_BEGIN_CMN bs3CpuInstr2_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 718 cmpxchg8b [fs:xDI] 719 .again: 720 icebp 721 jmp .again 722 BS3_PROC_END_CMN bs3CpuInstr2_cmpxchg8b_FSxDI_icebp 723 724 BS3_PROC_BEGIN_CMN bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 725 lock cmpxchg8b [fs:xDI] 726 .again: 727 icebp 728 jmp .again 729 BS3_PROC_END_CMN bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp 730 731 BS3_PROC_BEGIN_CMN bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 732 o16 cmpxchg8b [fs:xDI] 733 .again: 734 icebp 735 jmp .again 736 BS3_PROC_END_CMN bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp 737 738 BS3_PROC_BEGIN_CMN bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 739 db 0f0h, 066h 740 cmpxchg8b [fs:xDI] 741 .again: 742 icebp 743 jmp .again 744 BS3_PROC_END_CMN bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp 745 746 BS3_PROC_BEGIN_CMN bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 747 repz cmpxchg8b [fs:xDI] 748 .again: 749 icebp 750 jmp .again 751 BS3_PROC_END_CMN bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp 752 753 BS3_PROC_BEGIN_CMN bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 754 db 0f0h, 0f3h 755 cmpxchg8b [fs:xDI] 756 .again: 757 icebp 758 jmp .again 759 BS3_PROC_END_CMN bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp 760 761 BS3_PROC_BEGIN_CMN bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 762 repnz cmpxchg8b [fs:xDI] 763 .again: 764 icebp 765 jmp .again 766 BS3_PROC_END_CMN bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp 767 768 BS3_PROC_BEGIN_CMN bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR 769 db 0f0h, 0f2h 770 cmpxchg8b [fs:xDI] 771 .again: 772 icebp 773 jmp .again 774 BS3_PROC_END_CMN bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp 775 776 777 ; 715 778 ; CMPXCHG16B 716 779 ; -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2.c
r98828 r103208 67 67 BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_crc32); 68 68 BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_adcx_adox); 69 BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_cmpxchg8b); 69 70 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_cmpxchg16b); 70 71 BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_wrfsbase); … … 110 111 BS3TESTMODEENTRY_CMN("crc32", bs3CpuInstr2_crc32), /* SSE4.2 */ 111 112 BS3TESTMODEENTRY_CMN("adcx/adox", bs3CpuInstr2_adcx_adox), /* ADX */ 113 BS3TESTMODEENTRY_CMN("cmpxchg8b", bs3CpuInstr2_cmpxchg8b), 112 114 #endif 113 115 #if 1
Note:
See TracChangeset
for help on using the changeset viewer.