VirtualBox

Ignore:
Timestamp:
Apr 26, 2024 10:30:39 AM (10 months ago)
Author:
vboxsync
Message:

ValidationKit/bootsectors: Implement testcases for maskmovq, [v]maskmovdqu instructions, bugref:9898

  • facility to prefix assembled instruction-test-functions with 'FS' instruction
  • facility to test instructions with implicit [ ER]DI memory pointers ('type 1' test worker only)
  • facility to allow a range of valid CR2 addresses ('type 1' test worker only)
  • bodge regarding FTW results on paging & alignment faults ('type 1' test worker only)
Location:
trunk/src/VBox/ValidationKit/bootsectors
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3-template.mac

    r104370 r104440  
    6767        db      BS3_CMN_NM(%1).again - BS3_CMN_NM(%1)
    6868BS3_PROC_BEGIN_CMN %1, BS3_PBC_NEAR
     69   %ifdef EMIT_FS_PREFIX
     70        fs
     71   %endif
    6972  %endmacro
    7073 %endif ; !BS3CPUINSTR3_PROC_BEGIN_CMN_DEFINED
     
    31993202EMIT_INSTR_PLUS_ICEBP_YMM_890  vpmaddwd
    32003203
     3204;
     3205; MASKMOVQ
     3206;
     3207%define EMIT_FS_PREFIX
     3208EMIT_INSTR_PLUS_ICEBP           maskmovq,    MM0,   MM1
     3209%undef EMIT_FS_PREFIX
     3210
     3211;
     3212; [V]MASKMOVDQU
     3213;
     3214%define EMIT_FS_PREFIX
     3215EMIT_INSTR_PLUS_ICEBP           maskmovdqu,  XMM0,  XMM1
     3216EMIT_INSTR_PLUS_ICEBP_C64       maskmovdqu,  XMM8,  XMM9
     3217
     3218EMIT_INSTR_PLUS_ICEBP           vmaskmovdqu, XMM0,  XMM1
     3219EMIT_INSTR_PLUS_ICEBP_C64       vmaskmovdqu, XMM8,  XMM9
     3220%undef EMIT_FS_PREFIX
     3221
    32013222%endif ; BS3_INSTANTIATING_CMN
    32023223
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3.c32

    r104370 r104440  
    9191    RM_REG = 0,
    9292    RM_MEM,
    93     RM_MEM8,  /**< Memory operand is  8 bits.  Hack for movss and similar. */
    94     RM_MEM16, /**< Memory operand is 16 bits.  Hack for movss and similar. */
    95     RM_MEM32, /**< Memory operand is 32 bits.  Hack for movss and similar. */
    96     RM_MEM64  /**< Memory operand is 64 bits.  Hack for movss and similar. */
     93    RM_MEM_DI, /**< Memory operand pointer is implicitly RDI.  Hack for maskmovq, [v]maskmovdqu. */
     94    RM_MEM8,   /**< Memory operand is  8 bits.  Hack for movss and similar. */
     95    RM_MEM16,  /**< Memory operand is 16 bits.  Hack for movss and similar. */
     96    RM_MEM32,  /**< Memory operand is 32 bits.  Hack for movss and similar. */
     97    RM_MEM64   /**< Memory operand is 64 bits.  Hack for movss and similar. */
    9798};
    9899
     
    558559DECLINLINE(uint8_t) bs3CpuInstr3MemOpSize(uint8_t cbOperand, uint8_t enmRm)
    559560{
    560     if (enmRm <= RM_MEM)
     561    if (enmRm <= RM_MEM_DI)
    561562        return cbOperand;
    562563    if (enmRm == RM_MEM8)
     
    603604#undef  BS3_SKIPIT_DO_SKIP
    604605#undef  BS3_SKIPIT_DO_ARGS
     606#define BS3_SKIPIT_DO_SKIP
     607#undef  BS3_SKIPIT_AVG_SKIP
     608#define BS3_SKIPIT_AVG_SKIP 91
    605609
    606610#ifndef BS3_SKIPIT_DO_SKIP
     
    859863                                           || paTests[iTest].iRegSrc1 == UINT8_MAX
    860864                                           || paTests[iTest].iRegSrc2 == UINT8_MAX);
    861                                 Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, &Ctx.fs, puMemOp);
     865                                if (paTests[iTest].enmRm != RM_MEM_DI)
     866                                    Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rbx, &Ctx.fs, puMemOp);
     867                                else
     868                                    Bs3RegCtxSetGrpSegFromCurPtr(&Ctx, &Ctx.rdi, &Ctx.fs, puMemOp);
    862869                            }
    863870
     
    867874                            g_uBs3TrapEipHint = Ctx.rip.u32 + (bXcptExpect == X86_XCPT_DB ? cbInstr + 1 : 0);
    868875                            Bs3TrapSetJmpAndRestoreWithExtCtxAndRm(&Ctx, pExtCtx, &TrapFrame, pExtCtxOut);
     876
     877                            /* CPUs are inconsistent about FTW modification during these exceptions */
     878                            if (bXcptExpect == X86_XCPT_PF || bXcptExpect == X86_XCPT_AC)
     879                                Bs3ExtCtxSetAbridgedFtw(pExtCtx, Bs3ExtCtxGetAbridgedFtw(pExtCtxOut));
    869880
    870881                            /*
     
    907918                            if (bXcptExpect == X86_XCPT_PF)
    908919                                Ctx.cr2.u = (uintptr_t)puMemOp;
     920                            if (paTests[iTest].enmRm == RM_MEM_DI)
     921                            {
     922                                Ctx.cr2Range = cbMemOp;
     923                            }
    909924                            Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &Ctx, bXcptExpect == X86_XCPT_DB ? cbInstr + 1 : 0, 0,
    910925                                                 bXcptExpect == X86_XCPT_DB || BS3_MODE_IS_16BIT_SYS(bMode) ? 0 : X86_EFL_RF,
    911926                                                 pszMode, idTestStep);
    912927                            Ctx.cr2.u = 0;
     928                            if (paTests[iTest].enmRm == RM_MEM_DI)
     929                            {
     930                                Ctx.cr2Range = 0;
     931                            }
    913932
    914933                            if (   paTests[iTest].enmRm >= RM_MEM
     
    94179436}
    94189437
     9438
     9439/*
     9440 * MASKMOVQ, [V]MASKMOVDQU - move selected bytes
     9441 */
     9442BS3_DECL_FAR(uint8_t) bs3CpuInstr3_maskmovq_v_maskmovdqu(uint8_t bMode)
     9443{
     9444    static BS3CPUINSTR3_TEST1_VALUES_T const s_aValues[] =
     9445    {
     9446        {   /*src2*/ RTUINT256_INIT_C(0, 0, 0x0000000000000000, 0x0000000000000000),   /* mask */
     9447            /*src1*/ RTUINT256_INIT_C(0, 0, 0x9192939495969798, 0xfedcba9876543210),   /*  src */
     9448            /* => */ RTUINT256_INIT_C(0, 0, 0xcccccccccccccccc, 0xcccccccccccccccc) }, /* dest */
     9449        {   /*src2*/ RTUINT256_INIT_C(0, 0, 0x89abcdeffedcba98, 0xffeeddccbbaa9988),
     9450            /*src1*/ RTUINT256_INIT_C(0, 0, 0x9192939495969798, 0xfedcba9876543210),
     9451            /* => */ RTUINT256_INIT_C(0, 0, 0x9192939495969798, 0xfedcba9876543210) },
     9452        {   /*src2*/ RTUINT256_INIT_C(0, 0, 0x10204080c0e0f0ff, 0x8000800080008000),
     9453            /*src1*/ RTUINT256_INIT_C(0, 0, 0x9192939495969798, 0xfedcba9876543210),
     9454            /* => */ RTUINT256_INIT_C(0, 0, 0xcccccc9495969798, 0xfeccbacc76cc32cc) },
     9455    };
     9456
     9457    static BS3CPUINSTR3_TEST1_T const s_aTests16[] =
     9458    {
     9459        {  bs3CpuInstr3_maskmovq_MM0_MM1_icebp_c16,      255,         RM_MEM_DI, T_MMX_SSE, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9460        {  bs3CpuInstr3_maskmovdqu_XMM0_XMM1_icebp_c16,  255,         RM_MEM_DI, T_SSE2,    255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9461        {  bs3CpuInstr3_vmaskmovdqu_XMM0_XMM1_icebp_c16, X86_XCPT_AC, RM_MEM_DI, T_AVX_128, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9462    };
     9463    static BS3CPUINSTR3_TEST1_T const s_aTests32[] =
     9464    {
     9465        {  bs3CpuInstr3_maskmovq_MM0_MM1_icebp_c32,      255,         RM_MEM_DI, T_MMX_SSE, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9466        {  bs3CpuInstr3_maskmovdqu_XMM0_XMM1_icebp_c32,  255,         RM_MEM_DI, T_SSE2,    255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9467        {  bs3CpuInstr3_vmaskmovdqu_XMM0_XMM1_icebp_c32, X86_XCPT_AC, RM_MEM_DI, T_AVX_128, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9468    };
     9469    static BS3CPUINSTR3_TEST1_T const s_aTests64[] =
     9470    {
     9471        {  bs3CpuInstr3_maskmovq_MM0_MM1_icebp_c64,      255,         RM_MEM_DI, T_MMX_SSE, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9472        {  bs3CpuInstr3_maskmovdqu_XMM0_XMM1_icebp_c64,  255,         RM_MEM_DI, T_SSE2,    255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9473        {  bs3CpuInstr3_vmaskmovdqu_XMM0_XMM1_icebp_c64, X86_XCPT_AC, RM_MEM_DI, T_AVX_128, 255, 0, 1, RT_ELEMENTS(s_aValues), s_aValues },
     9474
     9475        {  bs3CpuInstr3_maskmovdqu_XMM8_XMM9_icebp_c64,  255,         RM_MEM_DI, T_SSE2,    255, 8, 9, RT_ELEMENTS(s_aValues), s_aValues },
     9476        {  bs3CpuInstr3_vmaskmovdqu_XMM8_XMM9_icebp_c64, X86_XCPT_AC, RM_MEM_DI, T_AVX_128, 255, 8, 9, RT_ELEMENTS(s_aValues), s_aValues },
     9477    };
     9478    static BS3CPUINSTR3_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR3_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64);
     9479    unsigned const                         iTest       = BS3CPUINSTR3_TEST_MODES_INDEX(bMode);
     9480    return bs3CpuInstr3_WorkerTestType1(bMode, s_aTests[iTest].paTests, s_aTests[iTest].cTests,
     9481                                        g_aXcptConfig5, RT_ELEMENTS(g_aXcptConfig5));
     9482}
    94199483
    94209484
     
    1459314657        { "[v]pmaddwd",                                     bs3CpuInstr3_v_pmaddwd, 0 },
    1459414658#endif
     14659#if defined(ALL_TESTS)
     14660        { "maskmovq/[v]maskmovdqu",                         bs3CpuInstr3_maskmovq_v_maskmovdqu, 0 },
     14661#endif
    1459514662    };
    1459614663    Bs3TestInit("bs3-cpu-instr-3");
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-TestCheckRegCtxEx.c

    r98103 r104440  
    9696    if (!(fbFlags & BS3REG_CTX_F_NO_CR2_CR3))
    9797    {
    98         CHECK_MEMBER("cr2", "%08RX64",  pActualCtx->cr2.u,    pExpectedCtx->cr2.u);
     98        /* cr2Range is always zero except if changed by the test worker */
     99        if ((pActualCtx->cr2.u < pExpectedCtx->cr2.u ||
     100             pActualCtx->cr2.u > pExpectedCtx->cr2.u + pExpectedCtx->cr2Range))
     101        {
     102            CHECK_MEMBER("cr2", "%08RX64",  pActualCtx->cr2.u,    pExpectedCtx->cr2.u);
     103        }
    99104        CHECK_MEMBER("cr3", "%08RX64",  pActualCtx->cr3.u,    pExpectedCtx->cr3.u);
    100105    }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r104071 r104440  
    26932693    uint8_t     bCpl;                   /**< 0xa1: 0-3, 0 is used for real mode. */
    26942694    uint8_t     fbFlags;                /**< 0xa2: BS3REG_CTX_F_XXX  */
    2695     uint8_t     abPadding[5];           /**< 0xa3  */
     2695    uint8_t     abPadding[3];           /**< 0xa3  */
     2696    uint16_t    cr2Range;               /**< 0xa6  */
    26962697    BS3REG      cr0;                    /**< 0xa8  */
    26972698    BS3REG      cr2;                    /**< 0xb0  */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.mac

    r102277 r104440  
    14141414        .bCpl       resb 1              ; uint8_t     bCpl;                   /**< 0xa1: 0-3, 0 is used for real mode. */
    14151415        .fbFlags    resb 1              ; uint8_t     fbFlags;                /**< 0xa2: BS3REG_CTX_F_XXX  */
    1416         .abPadding  resb 5              ; uint8_t     abPadding[5];           /**< 0xa4  */
     1416        .abPadding  resb 3              ; uint8_t     abPadding[3];           /**< 0xa3  */
     1417        .cr2Range   resw 1              ; uint16_t    cr2Range;               /**< 0xa6  */
    14171418        .cr0        resq 1              ; BS3REG      cr0;                    /**< 0xa8  */
    14181419        .cr2        resq 1              ; BS3REG      cr2;                    /**< 0xb0  */
Note: See TracChangeset for help on using the changeset viewer.

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