VirtualBox

Changeset 95431 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 29, 2022 2:26:40 PM (3 years ago)
Author:
vboxsync
Message:

ValKit/bs3-cpu-basic-2: Added fld, fbld and fxsave to the #AC tests. Fixed corruption problem caused by calling Bs3RegCtxConvertToRingX in RM and V86 contexts. bugref:9898

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

Legend:

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

    r93115 r95431  
    356356
    357357;
    358 ; #PF
     358; #PF & #AC
    359359;
    360360
     
    407407AssertCompile(.again - BS3_LAST_LABEL == 2 + (TMPL_BITS == 64))
    408408BS3_PROC_END_CMN   bs3CpuBasic2_div_ds_bx__ud2
     409
     410; For testing FLD m80 alignment (#AC).
     411BS3_CPUBAS2_UD_OFF bs3CpuBasic2_fninit_fld_ds_bx__ud2
     412BS3_PROC_BEGIN_CMN bs3CpuBasic2_fninit_fld_ds_bx__ud2, BS3_PBC_NEAR
     413        fninit                          ; make sure to not trigger a stack overflow.
     414.actual_test_instruction:
     415        fld     tword [xBX]
     416.again: ud2
     417        jmp     .again
     418AssertCompile(.actual_test_instruction - BS3_LAST_LABEL == 2)
     419BS3_PROC_END_CMN   bs3CpuBasic2_fninit_fld_ds_bx__ud2
     420
     421; For testing FBLD m80 alignment (#AC).
     422BS3_CPUBAS2_UD_OFF bs3CpuBasic2_fninit_fbld_ds_bx__ud2
     423BS3_PROC_BEGIN_CMN bs3CpuBasic2_fninit_fbld_ds_bx__ud2, BS3_PBC_NEAR
     424        fninit                          ; make sure to not trigger a stack overflow.
     425.actual_test_instruction:
     426        fbld    tword [xBX]
     427.again: ud2
     428        jmp     .again
     429AssertCompile(.actual_test_instruction - BS3_LAST_LABEL == 2)
     430BS3_PROC_END_CMN   bs3CpuBasic2_fninit_fbld_ds_bx__ud2
     431
     432; For testing FST m80 alignment (#AC).
     433BS3_CPUBAS2_UD_OFF bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2
     434BS3_PROC_BEGIN_CMN bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2, BS3_PBC_NEAR
     435        fninit                          ; make sure to not trigger a stack overflow.
     436        fldz                            ; make sure we've got something to store
     437.actual_test_instruction:
     438        fstp    tword [xBX]
     439.again: ud2
     440        jmp     .again
     441AssertCompile(.actual_test_instruction - BS3_LAST_LABEL == 4)
     442BS3_PROC_END_CMN   bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2
     443
     444; For testing FXSAVE alignment (#AC/#GP).
     445BS3_CPUBAS2_UD_OFF bs3CpuBasic2_fxsave_ds_bx__ud2
     446BS3_PROC_BEGIN_CMN bs3CpuBasic2_fxsave_ds_bx__ud2, BS3_PBC_NEAR
     447        fxsave  [xBX]
     448.again: ud2
     449        jmp     .again
     450BS3_PROC_END_CMN   bs3CpuBasic2_fxsave_ds_bx__ud2
    409451
    410452
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r95406 r95431  
    5454
    5555/** @name MYOP_XXX - Values for FNBS3CPUBASIC2ACTSTCODE::fOp.
     56 *
     57 * These are flags, though we've precombined a few shortening things down.
     58 *
    5659 * @{ */
    57 #define MYOP_LD           0x1
    58 #define MYOP_ST           0x2
    59 #define MYOP_LD_ST        0x3
    60 #define MYOP_EFL          0x4
    61 #define MYOP_LD_DIV       0x5
     60#define MYOP_LD           0x1       /**< The instruction loads. */
     61#define MYOP_ST           0x2       /**< The instruction stores */
     62#define MYOP_EFL          0x4       /**< The instruction modifies EFLAGS. */
     63#define MYOP_AC_GP        0x8       /**< The instruction may cause either \#AC or \#GP (FXSAVE). */
     64
     65#define MYOP_LD_ST        0x3       /**< Convenience: The instruction both loads and stores. */
     66#define MYOP_LD_DIV       0x5       /**< Convenience: DIV instruction - loading and modifying flags. */
    6267/** @} */
    6368
     
    8994    FNBS3CPUBASIC2ACSNIPPET BS3_FAR    *pfn;
    9095    uint8_t                             fOp;
    91     uint8_t                             cbMem;
     96    uint16_t                            cbMem;
     97    uint8_t                             cbAlign;
     98    uint8_t                             offFaultInstr; /**< For skipping fninit with the fld test. */
    9299} FNBS3CPUBASIC2ACTSTCODE;
    93100typedef FNBS3CPUBASIC2ACTSTCODE const *PCFNBS3CPUBASIC2ACTSTCODE;
     
    178185FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16;
    179186FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c16;
     187FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fld_ds_bx__ud2_c16;
     188FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c16;
     189FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c16;
     190FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fxsave_ds_bx__ud2_c16;
    180191
    181192FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c32;
     
    184195FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32;
    185196FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c32;
     197FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fld_ds_bx__ud2_c32;
     198FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c32;
     199FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c32;
     200FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fxsave_ds_bx__ud2_c32;
    186201
    187202FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c64;
     
    190205FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64;
    191206FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c64;
     207FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fld_ds_bx__ud2_c64;
     208FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c64;
     209FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c64;
     210FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_fxsave_ds_bx__ud2_c64;
    192211
    193212
     
    334353static const FNBS3CPUBASIC2ACTSTCODE g_aCmn16[] =
    335354{
    336     {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c16,     MYOP_LD,                2 },
    337     {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c16,     MYOP_ST,                2 },
    338     {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c16,    MYOP_LD_ST,             2 },
    339     {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16, MYOP_LD_ST | MYOP_EFL,  2 },
    340     {   bs3CpuBasic2_div_ds_bx__ud2_c16,        MYOP_LD_DIV,            2 },
     355    {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c16,             MYOP_LD,                2,  2 },
     356    {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c16,             MYOP_ST,                2,  2 },
     357    {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c16,            MYOP_LD_ST,             2,  2 },
     358    {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16,         MYOP_LD_ST | MYOP_EFL,  2,  2 },
     359    {   bs3CpuBasic2_div_ds_bx__ud2_c16,                MYOP_LD_DIV,            2,  2 },
     360    {   bs3CpuBasic2_fninit_fld_ds_bx__ud2_c16,         MYOP_LD,               10,  8, 2 /*fninit*/ },
     361    {   bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c16,        MYOP_LD,               10,  8, 2 /*fninit*/ },
     362    {   bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c16,   MYOP_ST,               10,  8, 4 /*fninit+fldz*/ },
     363    {   bs3CpuBasic2_fxsave_ds_bx__ud2_c16,             MYOP_ST | MYOP_AC_GP, 512, 16 },
    341364};
    342365
    343366static const FNBS3CPUBASIC2ACTSTCODE g_aCmn32[] =
    344367{
    345     {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c32,     MYOP_LD,                4 },
    346     {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c32,     MYOP_ST,                4 },
    347     {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c32,    MYOP_LD_ST,             4 },
    348     {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32, MYOP_LD_ST | MYOP_EFL,  4 },
    349     {   bs3CpuBasic2_div_ds_bx__ud2_c32,        MYOP_LD_DIV,            4 },
     368    {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c32,             MYOP_LD,                4,  4 },
     369    {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c32,             MYOP_ST,                4,  4 },
     370    {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c32,            MYOP_LD_ST,             4,  4 },
     371    {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32,         MYOP_LD_ST | MYOP_EFL,  4,  4 },
     372    {   bs3CpuBasic2_div_ds_bx__ud2_c32,                MYOP_LD_DIV,            4,  4 },
     373    {   bs3CpuBasic2_fninit_fld_ds_bx__ud2_c32,         MYOP_LD,               10,  8, 2 /*fninit*/ },
     374    {   bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c32,        MYOP_LD,               10,  8, 2 /*fninit*/ },
     375    {   bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c32,   MYOP_ST,               10,  8, 4 /*fninit+fldz*/ },
     376    {   bs3CpuBasic2_fxsave_ds_bx__ud2_c32,             MYOP_ST | MYOP_AC_GP, 512, 16 },
    350377};
    351378
    352379static const FNBS3CPUBASIC2ACTSTCODE g_aCmn64[] =
    353380{
    354     {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c64,     MYOP_LD,                8 },
    355     {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c64,     MYOP_ST,                8 },
    356     {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c64,    MYOP_LD_ST,             8 },
    357     {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64, MYOP_LD_ST | MYOP_EFL,  8 },
    358     {   bs3CpuBasic2_div_ds_bx__ud2_c64,        MYOP_LD_DIV,            8 },
     381    {   bs3CpuBasic2_mov_ax_ds_bx__ud2_c64,             MYOP_LD,                8,  8 },
     382    {   bs3CpuBasic2_mov_ds_bx_ax__ud2_c64,             MYOP_ST,                8,  8 },
     383    {   bs3CpuBasic2_xchg_ds_bx_ax__ud2_c64,            MYOP_LD_ST,             8,  8 },
     384    {   bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64,         MYOP_LD_ST | MYOP_EFL,  8,  8 },
     385    {   bs3CpuBasic2_div_ds_bx__ud2_c64,                MYOP_LD_DIV,            8,  8 },
     386    {   bs3CpuBasic2_fninit_fld_ds_bx__ud2_c64,         MYOP_LD,               10,  8, 2 /*fninit*/ },
     387    {   bs3CpuBasic2_fninit_fbld_ds_bx__ud2_c64,        MYOP_LD,               10,  8, 2 /*fninit*/ },
     388    {   bs3CpuBasic2_fninit_fldz_fstp_ds_bx__ud2_c64,   MYOP_ST,               10,  8, 4 /*fninit+fldz*/ },
     389    {   bs3CpuBasic2_fxsave_ds_bx__ud2_c64,             MYOP_ST | MYOP_AC_GP, 512, 16 },
    359390};
    360391
     
    382413
    383414
     415uint32_t ASMGetESP(void);
     416#pragma aux ASMGetESP = \
     417    ".386" \
     418    "mov ax, sp" \
     419    "mov edx, esp" \
     420    "shr edx, 16" \
     421    value [ax dx] \
     422    modify exact [ax dx];
     423
     424
    384425/**
    385426 * Wrapper around Bs3TestFailedF that prefixes the error with g_usBs3TestStep
     
    450491 */
    451492static void bs3CpuBasic2_CompareCpuTrapCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd,
    452                                            uint8_t bXcpt, bool f486ResumeFlagHint)
     493                                           uint8_t bXcpt, bool f486ResumeFlagHint, uint8_t cbIpAdjust)
    453494{
    454495    uint16_t const cErrorsBefore = Bs3TestSubErrorCount();
     
    458499    CHECK_MEMBER("bErrCd",  "%#06RX16", (uint16_t)pTrapCtx->uErrCd, (uint16_t)uErrCd); /* 486 only writes a word */
    459500
    460     fExtraEfl = X86_EFL_RF;
    461501    if (   g_f16BitSys
    462502        || (   !f486ResumeFlagHint
     
    468508    fExtraEfl = pTrapCtx->Ctx.rflags.u32 & X86_EFL_RF;
    469509#endif
    470     Bs3TestCheckRegCtxEx(&pTrapCtx->Ctx, pStartCtx, 0 /*cbIpAdjust*/, 0 /*cbSpAdjust*/, fExtraEfl, g_pszTestMode, g_usBs3TestStep);
     510    Bs3TestCheckRegCtxEx(&pTrapCtx->Ctx, pStartCtx, cbIpAdjust, 0 /*cbSpAdjust*/, fExtraEfl, g_pszTestMode, g_usBs3TestStep);
    471511    if (Bs3TestSubErrorCount() != cErrorsBefore)
    472512    {
     
    486526static void bs3CpuBasic2_CompareGpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
    487527{
    488     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_GP, true /*f486ResumeFlagHint*/);
     528    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_GP, true /*f486ResumeFlagHint*/, 0 /*cbIpAdjust*/);
    489529}
    490530
     
    495535static void bs3CpuBasic2_CompareNpCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
    496536{
    497     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_NP, true /*f486ResumeFlagHint*/);
     537    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_NP, true /*f486ResumeFlagHint*/, 0 /*cbIpAdjust*/);
    498538}
    499539#endif
     
    504544static void bs3CpuBasic2_CompareSsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd, bool f486ResumeFlagHint)
    505545{
    506     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_SS, f486ResumeFlagHint);
     546    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_SS, f486ResumeFlagHint, 0 /*cbIpAdjust*/);
    507547}
    508548
     
    513553static void bs3CpuBasic2_CompareTsCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint16_t uErrCd)
    514554{
    515     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_TS, false /*f486ResumeFlagHint*/);
     555    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_TS, false /*f486ResumeFlagHint*/, 0 /*cbIpAdjust*/);
    516556}
    517557#endif
     
    520560 * Compares \#PF trap.
    521561 */
    522 static void bs3CpuBasic2_ComparePfCtx(PCBS3TRAPFRAME pTrapCtx, PBS3REGCTX pStartCtx, uint16_t uErrCd, uint64_t uCr2Expected)
     562static void bs3CpuBasic2_ComparePfCtx(PCBS3TRAPFRAME pTrapCtx, PBS3REGCTX pStartCtx, uint16_t uErrCd,
     563                                      uint64_t uCr2Expected, uint8_t cbIpAdjust)
    523564{
    524565    uint64_t const uCr2Saved     = pStartCtx->cr2.u;
    525566    pStartCtx->cr2.u = uCr2Expected;
    526     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_PF, true /*f486ResumeFlagHint*/);
     567    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, uErrCd, X86_XCPT_PF, true /*f486ResumeFlagHint*/, cbIpAdjust);
    527568    pStartCtx->cr2.u = uCr2Saved;
    528569}
     
    533574static void bs3CpuBasic2_CompareUdCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
    534575{
    535     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*no error code*/, X86_XCPT_UD, true /*f486ResumeFlagHint*/);
     576    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*no error code*/, X86_XCPT_UD,
     577                                   true /*f486ResumeFlagHint*/, 0 /*cbIpAdjust*/);
    536578}
    537579
     
    539581 * Compares \#AC trap.
    540582 */
    541 static void bs3CpuBasic2_CompareAcCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
    542 {
    543     bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_AC, true /*f486ResumeFlagHint*/);
     583static void bs3CpuBasic2_CompareAcCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx, uint8_t cbIpAdjust)
     584{
     585    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_AC, true /*f486ResumeFlagHint*/, cbIpAdjust);
    544586}
    545587
     
    15401582     * one also using xDX, so make sure they make some sense.
    15411583     */
    1542     Bs3RegCtxSaveEx(&Ctx, bMode, 256);
    1543 
    1544     for (iRing = 0; iRing < cRings; iRing++)
     1584    Bs3RegCtxSaveEx(&Ctx, bMode, 512);
     1585
     1586    Ctx.cr0.u32 &= ~(X86_CR0_MP | X86_CR0_EM | X86_CR0_TS); /* so fninit + fld works */
     1587
     1588    for (iRing = BS3_MODE_IS_V86(bMode) ? 3 : 0; iRing < cRings; iRing++)
    15451589    {
    15461590        uint32_t    uEbx;
    15471591        uint8_t     fAc;
    15481592
    1549         Bs3RegCtxConvertToRingX(&Ctx, iRing);
     1593        if (!BS3_MODE_IS_RM_OR_V86(bMode))
     1594            Bs3RegCtxConvertToRingX(&Ctx, iRing);
    15501595
    15511596        if (!fPf || BS3_MODE_IS_32BIT_CODE(bMode) || BS3_MODE_IS_64BIT_CODE(bMode))
     
    15801625            for (iTest = 0; iTest < pCmn->cEntries; iTest++)
    15811626            {
    1582                 uint8_t const    fOp    = pCmn->paEntries[iTest].fOp;
    1583                 uint8_t const    cbMem  = pCmn->paEntries[iTest].cbMem;
    1584                 uint16_t const   cbMax  = cbCacheLine + cbMem;
     1627                uint8_t const    fOp     = pCmn->paEntries[iTest].fOp;
     1628                uint16_t const   cbMem   = pCmn->paEntries[iTest].cbMem;
     1629                uint8_t const    cbAlign = pCmn->paEntries[iTest].cbAlign;
     1630                uint16_t const   cbMax   = cbCacheLine + cbMem;
    15851631                uint16_t         offMem;
    15861632                uint8_t BS3_FAR *poffUd = (uint8_t BS3_FAR *)Bs3SelLnkPtrToCurPtr(pCmn->paEntries[iTest].pfn);
     
    15901636                CtxUdExpected.cs     = Ctx.cs;
    15911637                CtxUdExpected.rflags = Ctx.rflags;
    1592 if (bMode == BS3_MODE_RM) CtxUdExpected.rflags.u32 &= ~X86_EFL_AC; /** @todo investigate. automatically cleared, or is it just our code?  Observed with bs3-cpu-instr-3 too (10980xe). */
     1638                if (bMode == BS3_MODE_RM)
     1639                    CtxUdExpected.rflags.u32 &= ~X86_EFL_AC; /** @todo investigate. automatically cleared, or is it just our code?  Observed with bs3-cpu-instr-3 too (10980xe), seems to be the CPU doing it. */
    15931640                CtxUdExpected.rdx    = Ctx.rdx;
    15941641                CtxUdExpected.rax    = Ctx.rax;
     
    16171664                for (offMem = 0; offMem < cbMax; offMem++)
    16181665                {
    1619                     bool const fMisaligned = (offMem & (cbMem - 1)) != 0; /** @todo assumes cbMem is a power of two! */
     1666                    bool const fMisaligned = (offMem & (cbAlign - 1)) != 0;
    16201667                    unsigned   offBuf      = cbMax + cbMem * 2;
    16211668                    while (offBuf-- > 0)
    16221669                        pbBuf[offBuf] = 1; /* byte-by-byte to make sure it doesn't trigger AC. */
    16231670
    1624                     CtxUdExpected.rbx.u32 = Ctx.rbx.u32 = uEbx + offMem; /* ASSUMES memory in first 4GB (cur stack, so okay). */
     1671                    CtxUdExpected.rbx.u32 = Ctx.rbx.u32 = uEbx + offMem; /* ASSUMES memory in first 4GB. */
    16251672                    if (BS3_MODE_IS_16BIT_SYS(bMode))
    16261673                        g_uBs3TrapEipHint = Ctx.rip.u32;
    16271674
    1628                     //if (iRing == 3 && fPf && fAm)
    1629                     //    Bs3TestPrintf("iRing=%d iTest=%d cs:rip=%04RX16:%08RX32 ds:rbx=%04RX16:%08RX32 bXcpt=%#x errcd=%#x fAm=%d fAc=%d\n",
    1630                     //                  iRing, iTest, Ctx.cs, Ctx.rip.u32, Ctx.ds, Ctx.rbx.u32, TrapCtx.bXcpt, (unsigned)TrapCtx.uErrCd, fAm, fAc);
     1675                    //Bs3TestPrintf("iRing=%d iTest=%d cs:rip=%04RX16:%08RX32 ds:rbx=%04RX16:%08RX32 ss:esp=%04RX16:%08RX32 bXcpt=%#x errcd=%#x fAm=%d fAc=%d ESP=%#RX32\n",
     1676                    //              iRing, iTest, Ctx.cs, Ctx.rip.u32, Ctx.ds, Ctx.rbx.u32, Ctx.ss, Ctx.rsp.u32, TrapCtx.bXcpt, (unsigned)TrapCtx.uErrCd, fAm, fAc, ASMGetESP());
    16311677
    16321678                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    16331679
    1634                     if (fPf && iRing == 3 && (!fAm || !fAc || !fMisaligned)) /* #AC beats #PF */
     1680                    if (   (pCmn->paEntries[iTest].fOp & MYOP_AC_GP)
     1681                             && fMisaligned
     1682                             && (!fAm || iRing != 3 || !fAc || (offMem & 3 /* 10980XE */) == 0) )
     1683                    {
     1684                        if (fAc && bMode == BS3_MODE_RM)
     1685                            TrapCtx.Ctx.rflags.u32 |= X86_EFL_AC;
     1686                        bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
     1687                    }
     1688                    else if (fPf && iRing == 3 && (!fAm || !fAc || !fMisaligned)) /* #AC beats #PF */
    16351689                        bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx,
    16361690                                                  X86_TRAP_PF_P | X86_TRAP_PF_US
    16371691                                                  | (pCmn->paEntries[iTest].fOp & MYOP_ST ? X86_TRAP_PF_RW : 0),
    1638                                                   uFlatBufPtr + offMem);
     1692                                                  uFlatBufPtr + offMem + (cbMem > 64 ? cbMem - 1 /*FXSAVE*/ : 0),
     1693                                                  pCmn->paEntries[iTest].offFaultInstr);
    16391694                    else if (!fAm || iRing != 3 || !fAc || !fMisaligned)
    16401695                    {
     
    16521707                    }
    16531708                    else
    1654                         bs3CpuBasic2_CompareAcCtx(&TrapCtx, &Ctx);
     1709                        bs3CpuBasic2_CompareAcCtx(&TrapCtx, &Ctx, pCmn->paEntries[iTest].offFaultInstr);
    16551710
    16561711                    g_usBs3TestStep++;
     
    16741729{
    16751730    unsigned            cbCacheLine = 128; /** @todo detect */
    1676     uint8_t             abBuf[4096 /** @todo 512 - but that went crazy in real mode; now it's long mode going wrong.  */];
     1731    uint8_t BS3_FAR    *pbBufAlloc;
    16771732    uint8_t BS3_FAR    *pbBuf;
    16781733    unsigned            idxCmnModes;
    16791734    uint32_t            fCr0;
    1680     Bs3MemZero(&abBuf, sizeof(abBuf));
    16811735
    16821736    /*
     
    16921746
    16931747    /* Get us a 64-byte aligned buffer. */
    1694     pbBuf = abBuf;
    1695     if (BS3_FP_OFF(pbBuf) & (cbCacheLine - 1))
    1696         pbBuf = &abBuf[cbCacheLine - (BS3_FP_OFF(pbBuf) & (cbCacheLine - 1))];
    1697     BS3_ASSERT(pbBuf - abBuf <= cbCacheLine);
     1748    pbBufAlloc = pbBuf = Bs3MemAllocZ(BS3_MODE_IS_RM_OR_V86(bMode) ? BS3MEMKIND_REAL : BS3MEMKIND_TILED, X86_PAGE_SIZE * 2);
     1749    if (!pbBufAlloc)
     1750        return Bs3TestFailed("Failed to allocate 2 pages of real-mode memory");
     1751    if (BS3_FP_OFF(pbBuf) & (X86_PAGE_SIZE - 1))
     1752        pbBuf = &pbBufAlloc[X86_PAGE_SIZE - (BS3_FP_OFF(pbBuf) & X86_PAGE_OFFSET_MASK)];
     1753    BS3_ASSERT(pbBuf - pbBufAlloc <= X86_PAGE_SIZE);
    16981754    //Bs3TestPrintf("pbBuf=%p\n", pbBuf);
    16991755
     
    17051761
    17061762    /* First round is w/o alignment checks enabled. */
     1763    //Bs3TestPrintf("round 1\n");
    17071764    fCr0 = Bs3RegGetCr0();
    17081765    BS3_ASSERT(!(fCr0 & X86_CR0_AM));
     
    17141771    /* The second round is with aligment checks enabled. */
    17151772#if 1
     1773    //Bs3TestPrintf("round 2\n");
    17161774    Bs3RegSetCr0(Bs3RegGetCr0() | X86_CR0_AM);
    17171775    bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBuf, cbCacheLine, true /*fAm*/, false /*fPf*/, 0, &g_aCmnModes[idxCmnModes]);
     
    17221780       accessible from ring-3.  The third round has ACs disabled and the fourth
    17231781       has them enabled. */
    1724     if (BS3_MODE_IS_PAGED(bMode) && !BS3_MODE_IS_V86(bMode)) //&& (BS3_MODE_IS_32BIT_CODE(bMode) || BS3_MODE_IS_64BIT_CODE(bMode)))
     1782    if (BS3_MODE_IS_PAGED(bMode) && !BS3_MODE_IS_V86(bMode))
    17251783    {
    17261784        /* Alias the buffer as system memory so ring-3 access with AC+AM will cause #PF: */
     1785        /** @todo the aliasing is not necessary any more...   */
    17271786        int            rc;
    17281787        RTCCUINTXREG   uFlatBufPtr = Bs3SelPtrToFlat(pbBuf);
     
    17321791        if (RT_SUCCESS(rc))
    17331792        {
     1793            /* We 'misalign' the segment base here to make sure it's the final
     1794               address that gets alignment checked and not just the operand value. */
    17341795            RTCCUINTXREG     uAliasBufPtr = (RTCCUINTXREG)uAliasPgPtr + (uFlatBufPtr & X86_PAGE_OFFSET_MASK);
    1735             uint8_t BS3_FAR *pbBufAlias   = BS3_FP_MAKE(BS3_SEL_SPARE_00 | 3, uFlatBufPtr & X86_PAGE_OFFSET_MASK);;
    1736             Bs3SelSetup16BitData(&Bs3GdteSpare00, uAliasPgPtr);
    1737 
    1738             Bs3TestPrintf("round three\n");
     1796            uint8_t BS3_FAR *pbBufAlias   = BS3_FP_MAKE(BS3_SEL_SPARE_00 | 3, (uFlatBufPtr & X86_PAGE_OFFSET_MASK) + 1);
     1797            Bs3SelSetup16BitData(&Bs3GdteSpare00, uAliasPgPtr - 1);
     1798
     1799            //Bs3TestPrintf("round 3 pbBufAlias=%p\n", pbBufAlias);
    17391800            Bs3RegSetCr0(Bs3RegGetCr0() & ~X86_CR0_AM);
    17401801            bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBufAlias, cbCacheLine, false /*fAm*/,
    17411802                                           true /*fPf*/, uAliasBufPtr, &g_aCmnModes[idxCmnModes]);
    17421803
    1743             Bs3TestPrintf("round four\n");
     1804            //Bs3TestPrintf("round 4\n");
    17441805            Bs3RegSetCr0(Bs3RegGetCr0() | X86_CR0_AM);
    17451806            bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBufAlias, cbCacheLine, true /*fAm*/,
    17461807                                           true /*fPf*/, uAliasBufPtr, &g_aCmnModes[idxCmnModes]);
    1747             Bs3TestPrintf("done\n");
    17481808
    17491809            Bs3PagingUnalias(uAliasPgPtr, X86_PAGE_SIZE * 2);
     
    17541814#endif
    17551815
     1816    Bs3MemFree(pbBufAlloc, X86_PAGE_SIZE * 2);
    17561817    Bs3RegSetCr0(fCr0);
    17571818    return 0;
     
    20492110            {
    20502111                bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
    2051                                           uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     2112                                          uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    20522113                if (   off <= X86_PAGE_SIZE - 2
    20532114                    && Bs3MemCmp(&pbTest[off], pbExpected, 2) != 0)
     
    20842145            else
    20852146            {
    2086                 bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0), uFlatTest + off);
     2147                bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
     2148                                          uFlatTest + off, 0 /*cbIpAdjust*/);
    20872149                if (   -off < cbIdtr
    20882150                    && !ASMMemIsAllU8(pbTest, cbIdtr + off, bFiller))
     
    21392201                        {
    21402202                            bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
    2141                                                       uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     2203                                                      uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    21422204                            if (   off <= X86_PAGE_SIZE - 2
    21432205                                && Bs3MemCmp(&pbTest[off], pbExpected, 2) != 0)
     
    21742236                        {
    21752237                            bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
    2176                                                       uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     2238                                                      uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    21772239                            if (   off < X86_PAGE_SIZE
    21782240                                && !ASMMemIsAllU8(&pbTest[off], X86_PAGE_SIZE - off, bFiller))
     
    22452307                        if (cbLimit < off && off < X86_PAGE_SIZE)
    22462308                            bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, X86_TRAP_PF_RW | (Ctx.bCpl == 3 ? X86_TRAP_PF_US : 0),
    2247                                                       uFlatTest + off);
     2309                                                      uFlatTest + off, 0 /*cbIpAdjust*/);
    22482310                        else if (pWorker->fSs)
    22492311                            bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     
    28702932            }
    28712933            else
    2872                 bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     2934                bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    28732935            g_usBs3TestStep++;
    28742936
     
    28892951                    bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    28902952                else
    2891                     bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     2953                    bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    28922954                g_usBs3TestStep++;
    28932955            }
     
    29192981            }
    29202982            else
    2921                 bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off);
     2983                bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off, 0 /*cbIpAdjust*/);
    29222984            g_usBs3TestStep++;
    29232985
     
    29322994                    bs3CpuBasic2_CompareGpCtx(&TrapCtx, &Ctx, 0);
    29332995                else
    2934                     bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off);
     2996                    bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off, 0 /*cbIpAdjust*/);
    29352997                g_usBs3TestStep++;
    29362998            }
     
    29883050                        }
    29893051                        else
    2990                             bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     3052                            bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    29913053                    }
    29923054                    /* No #GP/#SS on limit, but instead #PF? */
     
    29943056                             ? off     < cbLimit && off >= 0xfff
    29953057                             : off + 2 < cbLimit && off >= 0xffd)
    2996                         bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE));
     3058                        bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + RT_MAX(off, X86_PAGE_SIZE), 0 /*cbIpAdjust*/);
    29973059                    /* #GP/#SS on limit or base. */
    29983060                    else if (pWorker->fSs)
     
    30473109                    }
    30483110                    else if (cbLimit < off && off < X86_PAGE_SIZE)
    3049                         bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off);
     3111                        bs3CpuBasic2_ComparePfCtx(&TrapCtx, &Ctx, 0, uFlatTest + off, 0 /*cbIpAdjust*/);
    30503112                    else if (pWorker->fSs)
    30513113                        bs3CpuBasic2_CompareSsCtx(&TrapCtx, &Ctx, 0, false /*f486ResumeFlagHint*/);
     
    32513313}
    32523314
    3253 uint32_t ASMGetESP(void);
    3254 #pragma aux ASMGetESP = \
    3255     ".386" \
    3256     "mov ax, sp" \
    3257     "mov edx, esp" \
    3258     "shr edx, 16" \
    3259     value [ax dx] \
    3260     modify exact [ax dx];
    3261 
    32623315
    32633316static void bs3CpuBasic2_iret_Worker(uint8_t bTestMode, FPFNBS3FAR pfnIret, unsigned const cbPop,
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