VirtualBox

Changeset 103208 in vbox for trunk/src


Ignore:
Timestamp:
Feb 5, 2024 5:36:09 PM (13 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
161475
Message:

ValidationKit/bootsectors/bs3-cpu-instr-2: A basic compxchg8b testcase, bugref:9898

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  
    226226extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_adox_RAX_RBX_icebp);
    227227extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_adox_RAX_qword_FSxBX_icebp);
     228
     229extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_cmpxchg8b_FSxDI_icebp);
     230extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp);
     231extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp);
     232extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp);
     233extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp);
     234extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp);
     235extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp);
     236extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp);
    228237
    229238# if ARCH_BITS == 64
     
    29532962        }
    29542963        Ctx.rflags.u16 &= ~X86_EFL_STATUS_BITS;
     2964    }
     2965
     2966    return 0;
     2967}
     2968
     2969
     2970
     2971/*
     2972 * CMPXCHG8B
     2973 */
     2974BS3_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        }
    29553093    }
    29563094
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.mac

    r98828 r103208  
    713713
    714714;
     715; CMPXCHG8B
     716;
     717BS3_PROC_BEGIN_CMN bs3CpuInstr2_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR
     718        cmpxchg8b [fs:xDI]
     719.again:
     720        icebp
     721        jmp     .again
     722BS3_PROC_END_CMN   bs3CpuInstr2_cmpxchg8b_FSxDI_icebp
     723
     724BS3_PROC_BEGIN_CMN bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR
     725        lock cmpxchg8b [fs:xDI]
     726.again:
     727        icebp
     728        jmp     .again
     729BS3_PROC_END_CMN   bs3CpuInstr2_lock_cmpxchg8b_FSxDI_icebp
     730
     731BS3_PROC_BEGIN_CMN bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR
     732        o16 cmpxchg8b [fs:xDI]
     733.again:
     734        icebp
     735        jmp     .again
     736BS3_PROC_END_CMN   bs3CpuInstr2_o16_cmpxchg8b_FSxDI_icebp
     737
     738BS3_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
     744BS3_PROC_END_CMN   bs3CpuInstr2_lock_o16_cmpxchg8b_FSxDI_icebp
     745
     746BS3_PROC_BEGIN_CMN bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR
     747        repz cmpxchg8b [fs:xDI]
     748.again:
     749        icebp
     750        jmp     .again
     751BS3_PROC_END_CMN   bs3CpuInstr2_repz_cmpxchg8b_FSxDI_icebp
     752
     753BS3_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
     759BS3_PROC_END_CMN   bs3CpuInstr2_lock_repz_cmpxchg8b_FSxDI_icebp
     760
     761BS3_PROC_BEGIN_CMN bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp, BS3_PBC_NEAR
     762        repnz cmpxchg8b [fs:xDI]
     763.again:
     764        icebp
     765        jmp     .again
     766BS3_PROC_END_CMN   bs3CpuInstr2_repnz_cmpxchg8b_FSxDI_icebp
     767
     768BS3_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
     774BS3_PROC_END_CMN   bs3CpuInstr2_lock_repnz_cmpxchg8b_FSxDI_icebp
     775
     776
     777;
    715778; CMPXCHG16B
    716779;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2.c

    r98828 r103208  
    6767BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_crc32);
    6868BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_adcx_adox);
     69BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_cmpxchg8b);
    6970BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_cmpxchg16b);
    7071BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_wrfsbase);
     
    110111    BS3TESTMODEENTRY_CMN("crc32",  bs3CpuInstr2_crc32),          /* SSE4.2 */
    111112    BS3TESTMODEENTRY_CMN("adcx/adox", bs3CpuInstr2_adcx_adox),   /* ADX */
     113    BS3TESTMODEENTRY_CMN("cmpxchg8b", bs3CpuInstr2_cmpxchg8b),
    112114#endif
    113115#if 1
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette