VirtualBox

Changeset 95397 in vbox


Ignore:
Timestamp:
Jun 27, 2022 5:49:40 PM (2 years ago)
Author:
vboxsync
Message:

ValKit/bs3kit,bs3-cpu-instr-3: 128 and 256 bit wide vxorps, alignment checks. bugref:9898

Location:
trunk/src/VBox/ValidationKit/bootsectors
Files:
8 edited
2 copied

Legend:

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

    r95379 r95397  
    112112BS3_FNBS3FAR_PROTOTYPES_CMN(bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp);
    113113BS3_FNBS3FAR_PROTOTYPES_CMN(bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp);
     114BS3_FNBS3FAR_PROTOTYPES_CMN(bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp);
     115BS3_FNBS3FAR_PROTOTYPES_CMN(bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp);
    114116#endif
    115117
     
    134136    { 1, 0,  0,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_DB, X86_XCPT_DB, X86_XCPT_DB }, /* #1 */
    135137    { 0, 1,  0,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_UD, X86_XCPT_UD, X86_XCPT_DB }, /* #2 */
    136     { 0, 0,  1,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_NM, X86_XCPT_NM, X86_XCPT_DB }, /* #3 */
    137     { 0, 1,  1,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_UD, X86_XCPT_UD, X86_XCPT_DB }, /* #4 */
     138    { 0, 0,  1,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_NM, X86_XCPT_NM, X86_XCPT_NM }, /* #3 */
     139    { 0, 1,  1,  1,      1,       1,   1,    1,        0,           0,        X86_XCPT_UD, X86_XCPT_UD, X86_XCPT_NM }, /* #4 */
    138140    { 0, 0,  0,  0,      1,       1,   1,    1,        0,           0,        X86_XCPT_UD, X86_XCPT_UD, X86_XCPT_DB }, /* #5 */
    139141    { 0, 0,  0,  1,      0,       1,   1,    1,        0,           0,        X86_XCPT_DB, X86_XCPT_DB, X86_XCPT_UD }, /* #6 */
     
    371373{
    372374    FPFNBS3FAR      pfnWorker;
     375    uint8_t         bAvxMisalignXcpt;
    373376    uint8_t         enmRm;
    374377    uint8_t         enmType;
    375     uint8_t         cbInstr;
    376378    uint8_t         iRegDst;
    377379    uint8_t         iRegSrc1;
     
    453455            {
    454456                BS3CPUINSTR3_TEST1_VALUES_T const BS3_FAR *paValues = paTests[iTest].paValues;
     457                uint8_t const   cbInstr     = ((uint8_t const BS3_FAR *)(uintptr_t)paTests[iTest].pfnWorker)[-1];
    455458                unsigned const  cValues     = paTests[iTest].cValues;
    456459                bool const      fMmxInstr   = paTests[iTest].enmType < T_SSE;
    457460                bool const      fSseInstr   = paTests[iTest].enmType >= T_SSE && paTests[iTest].enmType < T_AVX_128;
     461                bool const      fAvxInstr   = paTests[iTest].enmType >= T_AVX_128;
    458462                uint8_t const   cbOperand   = paTests[iTest].enmType < T_128BITS ? 64/8
    459463                                            : paTests[iTest].enmType < T_256BITS ? 128/8 : 256/8;
     
    461465                uint8_t         bXcptExpect = !g_afTypeSupports[paTests[iTest].enmType] ? X86_XCPT_UD
    462466                                            : fMmxInstr ? paConfigs[iCfg].bXcptMmx
    463                                             : fSseInstr ? paConfigs[iCfg].bXcptSse : paConfigs[iCfg].bXcptAvx;
     467                                            : fSseInstr ? paConfigs[iCfg].bXcptSse
     468                                            : BS3_MODE_IS_RM_OR_V86(bMode) ? X86_XCPT_UD : paConfigs[iCfg].bXcptAvx;
    464469                uint16_t        idTestStep  = bRing * 10000 + iCfg * 100 + iTest * 10;
    465470                unsigned        iVal;
     
    475480                    continue;
    476481
    477                 /* #AC is only raised in ring-3: */
    478                 if (bXcptExpect == X86_XCPT_AC && bRing != 3)
    479                     bXcptExpect = X86_XCPT_DB;
     482                /* #AC is only raised in ring-3.: */
     483                if (bXcptExpect == X86_XCPT_AC)
     484                {
     485                    if (bRing != 3)
     486                        bXcptExpect = X86_XCPT_DB;
     487                    else if (fAvxInstr)
     488                        bXcptExpect = paTests[iTest].bAvxMisalignXcpt; /* they generally don't raise #AC */
     489                }
    480490
    481491                Bs3RegCtxSetRipCsFromCurPtr(&Ctx, paTests[iTest].pfnWorker);
     
    515525                    else if (fMmxInstr)
    516526                        Bs3ExtCtxSetMm(pExtCtx, paTests[iTest].iRegSrc1, paValues[iVal].uSrc1.QWords.qw0);
     527                    else if (fSseInstr)
     528                        Bs3ExtCtxSetXmm(pExtCtx, paTests[iTest].iRegSrc1, &paValues[iVal].uSrc1.DQWords.dqw0);
    517529                    else
    518                         Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegSrc1, &paValues[iVal].uSrc1, fSseInstr);
     530                        Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegSrc1, &paValues[iVal].uSrc1, 32);
    519531
    520532                    /* source #2 */
     
    528540                    else if (fMmxInstr)
    529541                        Bs3ExtCtxSetMm(pExtCtx, paTests[iTest].iRegSrc2, paValues[iVal].uSrc2.QWords.qw0);
     542                    else if (fSseInstr)
     543                        Bs3ExtCtxSetXmm(pExtCtx, paTests[iTest].iRegSrc2, &paValues[iVal].uSrc2.DQWords.dqw0);
    530544                    else
    531                         Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegSrc2, &paValues[iVal].uSrc2, fSseInstr);
     545                        Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegSrc2, &paValues[iVal].uSrc2, 32);
    532546
    533547                    /* Memory pointer. */
     
    556570                        if (fMmxInstr)
    557571                            Bs3ExtCtxSetMm(pExtCtx, paTests[iTest].iRegDst, paValues[iVal].uDstOut.QWords.qw0);
     572                        else if (fSseInstr)
     573                            Bs3ExtCtxSetXmm(pExtCtx, paTests[iTest].iRegDst, &paValues[iVal].uDstOut.DQWords.dqw0);
    558574                        else
    559                             Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegDst, &paValues[iVal].uDstOut, fSseInstr);
     575                            Bs3ExtCtxSetYmm(pExtCtx, paTests[iTest].iRegDst, &paValues[iVal].uDstOut, cbOperand);
    560576                    }
    561577                    Bs3TestCheckExtCtx(pExtCtxOut, pExtCtx, 0 /*fFlags*/, pszMode, idTestStep);
     
    571587                        TrapFrame.Ctx.rflags.u32 |= X86_EFL_AC;
    572588                    }
    573                     Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &Ctx, bXcptExpect == X86_XCPT_DB ? paTests[iTest].cbInstr + 1 : 0, 0,
     589                    Bs3TestCheckRegCtxEx(&TrapFrame.Ctx, &Ctx, bXcptExpect == X86_XCPT_DB ? cbInstr + 1 : 0, 0,
    574590                                         bXcptExpect == X86_XCPT_DB || BS3_MODE_IS_16BIT_SYS(bMode) ? 0 : X86_EFL_RF,
    575591                                         pszMode, idTestStep);
     
    580596
    581597                    if (cErrors != Bs3TestSubErrorCount())
    582                         Bs3TestFailedF("ring-%d/cfg#%u/test#%u/value#%u failed (bXcptExpect=%#x)",
    583                                        bRing, iCfg, iTest, iVal, bXcptExpect);
     598                    {
     599                        if (paConfigs[iCfg].fAligned)
     600                            Bs3TestFailedF("ring-%d/cfg#%u/test#%u/value#%u failed (bXcptExpect=%#x)",
     601                                           bRing, iCfg, iTest, iVal, bXcptExpect);
     602                        else
     603                            Bs3TestFailedF("ring-%d/cfg#%u/test#%u/value#%u failed (bXcptExpect=%#x, puMemOp=%p, EFLAGS=%#RX32, CR0=%#RX32)",
     604                                           bRing, iCfg, iTest, iVal, bXcptExpect, puMemOp, TrapFrame.Ctx.rflags.u32, TrapFrame.Ctx.cr0);
     605                        Bs3TestPrintf("\n");
     606                    }
    584607                }
    585608            }
     
    609632BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr3_xorps)(uint8_t bMode)
    610633{
    611     /** Input values for 128 bit wide operations: */
    612     static BS3CPUINSTR3_TEST1_VALUES_T const s_aValues128[] =
    613     {
    614         {           RTUINT256_INIT_C(0, 0, 0x1111222233334444, 0x5555666677778888),
    615             /* ^ */ RTUINT256_INIT_C(0, 0, 0x9999aaaabbbbcccc, 0xddddeeeeffff0000),
    616             /* = */ RTUINT256_INIT_C(0, 0, 0x8888888888888888, 0x8888888888888888) },
     634    static BS3CPUINSTR3_TEST1_VALUES_T const s_aValues[] =
     635    {
     636        {           RTUINT256_INIT_C(0, 0, 0, 0),
     637            /* ^ */ RTUINT256_INIT_C(0, 0, 0, 0),
     638            /* = */ RTUINT256_INIT_C(0, 0, 0, 0) },
     639        {           RTUINT256_INIT_C(0x5555666677778888, 0x1111222233334444, 0x1111222233334444, 0x5555666677778888),
     640            /* ^ */ RTUINT256_INIT_C(0xddddeeeeffff0000, 0x9999aaaabbbbcccc, 0x9999aaaabbbbcccc, 0xddddeeeeffff0000),
     641            /* = */ RTUINT256_INIT_C(0x8888888888888888, 0x8888888888888888, 0x8888888888888888, 0x8888888888888888) },
     642        {           RTUINT256_INIT_C(0x4d09f02a6cdc73d5, 0x3ef417c8666b3fe6, 0xb4212fa8564c9ba2, 0x9c5ce073930996bb),
     643            /* ^ */ RTUINT256_INIT_C(0x1eddddac09633294, 0xf95c8eec40725633, 0x8800e95bbf9962c3, 0x43d3cda0238499fd),
     644            /* = */ RTUINT256_INIT_C(0x53d42d8665bf4141, 0xc7a89924261969d5, 0x3c21c6f3e9d5f961, 0xdf8f2dd3b08d0f46) },
    617645    };
    618646
    619647    static BS3CPUINSTR3_TEST1_T const s_aTests16[] =
    620648    {
    621         {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c16,      RM_REG, T_SSE2, 3,  1, 1,   2, RT_ELEMENTS(s_aValues128), s_aValues128 },
    622         {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c16,     RM_MEM, T_SSE2, 4,  1, 1, 255, RT_ELEMENTS(s_aValues128), s_aValues128 },
     649        {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c16,          255,         RM_REG, T_SSE2,     1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     650        {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c16,         255,         RM_MEM, T_SSE2,     1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     651        {  bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp_c16,    255,         RM_REG, T_AVX_128,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     652        {  bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp_c16,   X86_XCPT_DB, RM_MEM, T_AVX_128,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     653        {  bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp_c16,    255,         RM_REG, T_AVX_256,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     654        {  bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp_c16,   X86_XCPT_DB, RM_MEM, T_AVX_256,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
    623655    };
    624 
    625 #if ARCH_BITS >= 32
     656# if ARCH_BITS >= 32
    626657    static BS3CPUINSTR3_TEST1_T const s_aTests32[] =
    627658    {
    628         {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c32,      RM_REG, T_SSE2, 3,  1, 1, 2,   RT_ELEMENTS(s_aValues128), s_aValues128 },
    629         {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c32,     RM_MEM, T_SSE2, 4,  1, 1, 255, RT_ELEMENTS(s_aValues128), s_aValues128 },
     659        {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c32,          255, RM_REG, T_SSE2,     1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     660        {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c32,         255, RM_MEM, T_SSE2,     1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     661        {  bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp_c32,    255, RM_REG, T_AVX_128,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     662        {  bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp_c32,   X86_XCPT_DB, RM_MEM, T_AVX_128,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     663        {  bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp_c32,    255,         RM_REG, T_AVX_256,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     664        {  bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp_c32,   X86_XCPT_DB, RM_MEM, T_AVX_256,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
    630665    };
    631 #endif
    632 
    633 #if ARCH_BITS >= 64
     666# endif
     667# if ARCH_BITS >= 64
    634668    static BS3CPUINSTR3_TEST1_T const s_aTests64[] =
    635669    {
    636         {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c64,      RM_REG, T_SSE2, 3,  1, 1, 2,   RT_ELEMENTS(s_aValues128), s_aValues128 },
    637         {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c64,     RM_MEM, T_SSE2, 4,  1, 1, 255, RT_ELEMENTS(s_aValues128), s_aValues128 },
     670        {  bs3CpuInstr3_xorps_XMM1_XMM2_icebp_c64,          255,         RM_REG, T_SSE2,     1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     671        {  bs3CpuInstr3_xorps_XMM1_FSxBX_icebp_c64,         255,         RM_MEM, T_SSE2,     1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     672        {  bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp_c64,    255,         RM_REG, T_AVX_128,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     673        {  bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp_c64,   X86_XCPT_DB, RM_MEM, T_AVX_128,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
     674        {  bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp_c64,    255,         RM_REG, T_AVX_256,  1, 1,   2, RT_ELEMENTS(s_aValues), s_aValues },
     675        {  bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp_c64,   X86_XCPT_DB, RM_MEM, T_AVX_256,  1, 1, 255, RT_ELEMENTS(s_aValues), s_aValues },
    638676    };
    639 #endif
     677# endif
    640678
    641679    static BS3CPUINSTR3_TEST1_MODE_T const s_aTests[3] = BS3CPUINSTR3_TEST1_MODES_INIT(s_aTests16, s_aTests32, s_aTests64);
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-3-template.mac

    r95377 r95397  
    4444%ifdef BS3_INSTANTIATING_CMN
    4545
     46
     47;;
     48; Variant on BS3_PROC_BEGIN_CMN w/ BS3_PBC_NEAR that prefixes the function
     49; with an instruction length byte.
     50;
     51; ASSUMES the length is between the start of the function and the .again label.
     52;
     53%ifndef BS3CPUINSTR3_PROC_BEGIN_CMN
     54 %define BS3CPUINSTR3_PROC_BEGIN_CMN_DEFINED
     55 %macro BS3CPUINSTR3_PROC_BEGIN_CMN 1
     56        align   8, db 0cch
     57        db      BS3_CMN_NM(%1).again - BS3_CMN_NM(%1)
     58BS3_PROC_BEGIN_CMN %1, BS3_PBC_NEAR
     59 %endmacro
     60%endif
     61
    4662;
    4763; XORPS (SSE2) & VXORPS (AVX)
    4864;
    49 BS3_PROC_BEGIN_CMN bs3CpuInstr3_xorps_XMM1_XMM2_icebp, BS3_PBC_NEAR
    50         xorps    xmm1, xmm2
     65BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_xorps_XMM1_XMM2_icebp
     66        xorps   xmm1, xmm2
    5167.again:
    5268        icebp
     
    5470BS3_PROC_END_CMN   bs3CpuInstr3_xorps_XMM1_XMM2_icebp
    5571
    56 BS3_PROC_BEGIN_CMN bs3CpuInstr3_xorps_XMM1_FSxBX_icebp, BS3_PBC_NEAR
    57         xorps    xmm1, [fs:xBX]
     72BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_xorps_XMM1_FSxBX_icebp
     73        xorps   xmm1, [fs:xBX]
    5874.again:
    5975        icebp
     
    6177BS3_PROC_END_CMN   bs3CpuInstr3_xorps_XMM1_FSxBX_icebp
    6278
    63 BS3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp, BS3_PBC_NEAR
     79BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp
    6480        vxorps    xmm1, xmm1, xmm2
    6581.again:
     
    6884BS3_PROC_END_CMN   bs3CpuInstr3_vxorps_XMM1_XMM1_XMM2_icebp
    6985
    70 BS3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp, BS3_PBC_NEAR
     86BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp
     87%if 0
     88.again2:
     89        pause
     90        jmp .again2
     91%endif
    7192        vxorps    xmm1, xmm1, [fs:xBX]
    7293.again:
     
    7596BS3_PROC_END_CMN   bs3CpuInstr3_vxorps_XMM1_XMM1_FSxBX_icebp
    7697
     98BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp
     99        vxorps    ymm1, ymm1, ymm2
     100.again:
     101        icebp
     102        jmp     .again
     103BS3_PROC_END_CMN   bs3CpuInstr3_vxorps_YMM1_YMM1_YMM2_icebp
     104
     105BS3CPUINSTR3_PROC_BEGIN_CMN bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp
     106        vxorps    ymm1, ymm1, [fs:xBX]
     107.again:
     108        icebp
     109        jmp     .again
     110BS3_PROC_END_CMN   bs3CpuInstr3_vxorps_YMM1_YMM1_FSxBX_icebp
     111
    77112
    78113%endif ; BS3_INSTANTIATING_CMN
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/Makefile.kmk

    r95376 r95397  
    151151       bs3-cmn-ExtCtxGetMm.c \
    152152       bs3-cmn-ExtCtxSetMm.c \
     153       bs3-cmn-ExtCtxGetXmm.c \
     154       bs3-cmn-ExtCtxSetXmm.c \
    153155       bs3-cmn-ExtCtxGetYmm.c \
    154156       bs3-cmn-ExtCtxSetYmm.c \
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-ExtCtxGetXmm.c

    r95372 r95397  
    11/* $Id$ */
    22/** @file
    3  * BS3Kit - Bs3ExtCtxGetYmm
     3 * BS3Kit - Bs3ExtCtxGetXmm
    44 */
    55
     
    3232
    3333
    34 #undef Bs3ExtCtxGetYmm
    35 BS3_CMN_DEF(PRTUINT256U, Bs3ExtCtxGetYmm,(PCBS3EXTCTX pExtCtx, uint8_t iReg, PRTUINT256U pValue))
     34#undef Bs3ExtCtxGetXmm
     35BS3_CMN_DEF(PRTUINT128U, Bs3ExtCtxGetXmm,(PCBS3EXTCTX pExtCtx, uint8_t iReg, PRTUINT128U pValue))
    3636{
    37     pValue->au128[0].au64[0] = 0;
    38     pValue->au128[0].au64[1] = 0;
    39     pValue->au128[1].au64[0] = 0;
    40     pValue->au128[1].au64[1] = 0;
    41 
     37    AssertCompileMembersAtSameOffset(BS3EXTCTX, Ctx.x87.aXMM, BS3EXTCTX, Ctx.x.x87.aXMM);
    4238    switch (pExtCtx->enmMethod)
    4339    {
    4440        case BS3EXTCTXMETHOD_FXSAVE:
     41        case BS3EXTCTXMETHOD_XSAVE:
    4542            if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x87.aXMM))
    46                 pValue->au128[0] = pExtCtx->Ctx.x87.aXMM[iReg].uXmm;
    47             break;
    48 
    49         case BS3EXTCTXMETHOD_XSAVE:
    50             if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x.x87.aXMM))
    5143            {
    52                 pValue->au128[0] = pExtCtx->Ctx.x87.aXMM[iReg].uXmm;
    53                 if (pExtCtx->fXcr0Nominal & XSAVE_C_YMM)
    54                     pValue->au128[1] = pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].uXmm;
     44                pValue->u = pExtCtx->Ctx.x87.aXMM[iReg].xmm;
     45                return pValue;
    5546            }
    5647            break;
    5748    }
     49
     50    pValue->au64[0] = 0;
     51    pValue->au64[1] = 0;
    5852    return pValue;
    5953}
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-ExtCtxSetXmm.c

    r95374 r95397  
    11/* $Id$ */
    22/** @file
    3  * BS3Kit - Bs3ExtCtxSetYmm
     3 * BS3Kit - Bs3ExtCtxSetXmm
    44 */
    55
     
    3232
    3333
    34 #undef Bs3ExtCtxSetYmm
    35 BS3_CMN_DEF(bool, Bs3ExtCtxSetYmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT256U pValue, bool f128Bit))
     34#undef Bs3ExtCtxSetXmm
     35BS3_CMN_DEF(bool, Bs3ExtCtxSetXmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT128U pValue))
    3636{
     37    AssertCompileMembersAtSameOffset(BS3EXTCTX, Ctx.x87.aXMM, BS3EXTCTX, Ctx.x.x87.aXMM);
    3738    switch (pExtCtx->enmMethod)
    3839    {
    3940        case BS3EXTCTXMETHOD_FXSAVE:
     41        case BS3EXTCTXMETHOD_XSAVE:
    4042            if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x87.aXMM))
    4143            {
    42                 pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->au128[0];
    43                 return true;
    44             }
    45             break;
    46 
    47         case BS3EXTCTXMETHOD_XSAVE:
    48             if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x.x87.aXMM))
    49             {
    50                 pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->au128[0];
    51                 if ((pExtCtx->fXcr0Nominal & XSAVE_C_YMM) && !f128Bit)
    52                     pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].uXmm = pValue->au128[1];
     44                pExtCtx->Ctx.x87.aXMM[iReg].xmm = pValue->u;
    5345                return true;
    5446            }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-ExtCtxSetYmm.c

    r95374 r95397  
    3333
    3434#undef Bs3ExtCtxSetYmm
    35 BS3_CMN_DEF(bool, Bs3ExtCtxSetYmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT256U pValue, bool f128Bit))
     35BS3_CMN_DEF(bool, Bs3ExtCtxSetYmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT256U pValue, uint8_t cbValue))
    3636{
     37    BS3_ASSERT(cbValue == 16 || cbValue == 32);
    3738    switch (pExtCtx->enmMethod)
    3839    {
     
    4041            if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x87.aXMM))
    4142            {
    42                 pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->au128[0];
     43                pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->DQWords.dqw0;
    4344                return true;
    4445            }
     
    4849            if (iReg < RT_ELEMENTS(pExtCtx->Ctx.x.x87.aXMM))
    4950            {
    50                 pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->au128[0];
    51                 if ((pExtCtx->fXcr0Nominal & XSAVE_C_YMM) && !f128Bit)
    52                     pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].uXmm = pValue->au128[1];
     51                pExtCtx->Ctx.x87.aXMM[iReg].uXmm = pValue->DQWords.dqw0;
     52                if (pExtCtx->fXcr0Nominal & XSAVE_C_YMM)
     53                {
     54                    if (cbValue >= 32)
     55                        pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].uXmm = pValue->DQWords.dqw1;
     56                    else
     57                    {
     58                        pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].au64[0] = 0;
     59                        pExtCtx->Ctx.x.u.YmmHi.aYmmHi[iReg].au64[1] = 0;
     60                    }
     61                    /** @todo zero high ZMM part. */
     62                }
    5363                return true;
    5464            }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit-autostubs.kmk

    r95376 r95397  
    3838$(call BS3KIT_FN_GEN_CMN_FARSTUB,bs3kit-common-16,Bs3RegCtxSaveEx,8)
    3939$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxSetMm)
     40$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxSetXmm)
    4041$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxSetYmm)
    4142$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3TestCheckExtCtx)
     
    6364$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxInit)
    6465$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3TrapSetHandler)
     66$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxGetXmm)
    6567$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3ExtCtxGetYmm)
    6668$(call BS3KIT_FN_GEN_CMN_NEARSTUB,bs3kit-common-16,Bs3Printf)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit-mangling-code-define.h

    r95376 r95397  
    3737#define Bs3ExtCtxGetMxCsr BS3_CMN_MANGLER(Bs3ExtCtxGetMxCsr)
    3838#define Bs3ExtCtxGetSize BS3_CMN_MANGLER(Bs3ExtCtxGetSize)
     39#define Bs3ExtCtxGetXmm BS3_CMN_MANGLER(Bs3ExtCtxGetXmm)
    3940#define Bs3ExtCtxGetYmm BS3_CMN_MANGLER(Bs3ExtCtxGetYmm)
    4041#define Bs3ExtCtxInit BS3_CMN_MANGLER(Bs3ExtCtxInit)
     
    4344#define Bs3ExtCtxSetMm BS3_CMN_MANGLER(Bs3ExtCtxSetMm)
    4445#define Bs3ExtCtxSetMxCsr BS3_CMN_MANGLER(Bs3ExtCtxSetMxCsr)
     46#define Bs3ExtCtxSetXmm BS3_CMN_MANGLER(Bs3ExtCtxSetXmm)
    4547#define Bs3ExtCtxSetYmm BS3_CMN_MANGLER(Bs3ExtCtxSetYmm)
    4648#define Bs3GetCpuVendor BS3_CMN_MANGLER(Bs3GetCpuVendor)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit-mangling-code-undef.h

    r95376 r95397  
    3737#undef Bs3ExtCtxGetMxCsr
    3838#undef Bs3ExtCtxGetSize
     39#undef Bs3ExtCtxGetXmm
    3940#undef Bs3ExtCtxGetYmm
    4041#undef Bs3ExtCtxInit
     
    4344#undef Bs3ExtCtxSetMm
    4445#undef Bs3ExtCtxSetMxCsr
     46#undef Bs3ExtCtxSetXmm
    4547#undef Bs3ExtCtxSetYmm
    4648#undef Bs3GetCpuVendor
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r95376 r95397  
    29162916
    29172917/**
     2918 * Gets the value of XMM register number @a iReg from @a pExtCtx.
     2919 *
     2920 * @returns pValue
     2921 * @param   pExtCtx         The extended CPU context.
     2922 * @param   iReg            The register to get.
     2923 * @param   pValue          Where to return the value. Zeroed if the state
     2924 *                          doesn't support SSE or if @a iReg is invalid.
     2925 */
     2926BS3_CMN_PROTO_STUB(PRTUINT128U, Bs3ExtCtxGetXmm,(PCBS3EXTCTX pExtCtx, uint8_t iReg, PRTUINT128U pValue));
     2927
     2928/**
     2929 * Sets the value of XMM register number @a iReg in @a pExtCtx to @a pValue.
     2930 *
     2931 * @returns True if set, false if not set (not supported by state format or
     2932 *          invalid iReg).
     2933 * @param   pExtCtx         The extended CPU context.
     2934 * @param   iReg            The register to set.
     2935 * @param   pValue          The new register value.
     2936 */
     2937BS3_CMN_PROTO_STUB(bool, Bs3ExtCtxSetXmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT128U pValue));
     2938
     2939/**
    29182940 * Gets the value of YMM register number @a iReg from @a pExtCtx.
    29192941 *
     
    29352957 * @param   iReg            The register to set.
    29362958 * @param   pValue          The new register value.
    2937  * @param   f128Bit         A little peculiarity grown from mixing SSE and AVX
    2938  *                          tests:  When set to true only the lower 128 bits of
    2939  *                          the YMM register will be set. The upper bits are
    2940  *                          untouched.  When false, the whole 256-bits value
    2941  *                          will be set.
    2942  */
    2943 BS3_CMN_PROTO_STUB(bool, Bs3ExtCtxSetYmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT256U pValue, bool f128Bit));
     2959 * @param   cbValue         Number of bytes to take from @a pValue, either 16 or
     2960 *                          32. If 16, the high part will be zeroed when present
     2961 *                          in the state.
     2962 */
     2963BS3_CMN_PROTO_STUB(bool, Bs3ExtCtxSetYmm,(PBS3EXTCTX pExtCtx, uint8_t iReg, PCRTUINT256U pValue, uint8_t cbValue));
    29442964
    29452965
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