VirtualBox

Ignore:
Timestamp:
Jun 28, 2021 2:15:23 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145390
Message:

bs3-cpu-basic-2: Added an alignment check testcase. bugref:10052

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

Legend:

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

    r82968 r89932  
    11/* $Id$ */
    22/** @file
    3  * BS3Kit - bs3-cpu-basic-2, 32-bit C code.
     3 * BS3Kit - bs3-cpu-basic-2, 32-bit C code for testing \#PF.
    44 */
    55
     
    18051805        if (RT_SUCCESS(rc))
    18061806        {
    1807 if (bMode & BS3_MODE_CODE_64) ASMHalt();
     1807//if (bMode & BS3_MODE_CODE_64) ASMHalt();
    18081808            /* Set values that derives from the test memory size and paging info. */
    18091809            if (State.PgInfo.cEntries == 2)
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac

    r82968 r89932  
    3333
    3434;*********************************************************************************************************************************
     35;*  Defined Constants And Macros                                                                                                 *
     36;*********************************************************************************************************************************
     37%ifndef BS3_CPUBAS2_UD_OFF_DEFINED
     38%define BS3_CPUBAS2_UD_OFF_DEFINED
     39%macro BS3_CPUBAS2_UD_OFF 1
     40BS3_GLOBAL_NAME_EX BS3_CMN_NM(%1) %+ _offUD, , 1
     41        db      BS3_CMN_NM(%1).again - BS3_CMN_NM(%1)
     42%endmacro
     43%endif
     44
     45
     46;*********************************************************************************************************************************
    3547;*  External Symbols                                                                                                             *
    3648;*********************************************************************************************************************************
    3749TMPL_BEGIN_TEXT
     50
    3851
    3952
     
    4760; SIDT
    4861;
     62BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_bx_ud2
    4963BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_bx_ud2, BS3_PBC_NEAR
    5064        sidt    [xBX]
     
    5468BS3_PROC_END_CMN   bs3CpuBasic2_sidt_bx_ud2
    5569
     70BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_bx_ud2
    5671BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_bx_ud2, BS3_PBC_NEAR
    5772        db      X86_OP_PRF_SIZE_OP
     
    6378
    6479 %if TMPL_BITS == 64
     80BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_rexw_bx_ud2
    6581BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_rexw_bx_ud2, BS3_PBC_NEAR
    6682        db      X86_OP_REX_W
     
    7187BS3_PROC_END_CMN   bs3CpuBasic2_sidt_rexw_bx_ud2
    7288
     89BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_rexw_bx_ud2
    7390BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_rexw_bx_ud2, BS3_PBC_NEAR
    7491        db      X86_OP_PRF_SIZE_OP
     
    8299
    83100 %if TMPL_BITS != 64
     101BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_ss_bx_ud2
    84102BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_ss_bx_ud2, BS3_PBC_NEAR
    85103        sidt    [ss:xBX]
     
    89107BS3_PROC_END_CMN   bs3CpuBasic2_sidt_ss_bx_ud2
    90108
     109BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sidt_opsize_ss_bx_ud2
    91110BS3_PROC_BEGIN_CMN bs3CpuBasic2_sidt_opsize_ss_bx_ud2, BS3_PBC_NEAR
    92111        db      X86_OP_PRF_SIZE_OP
     
    102121; SGDT
    103122;
     123BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_bx_ud2
    104124BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_bx_ud2, BS3_PBC_NEAR
    105125        sgdt    [xBX]
     
    109129BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_bx_ud2
    110130
     131BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_bx_ud2
    111132BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_bx_ud2, BS3_PBC_NEAR
    112133        db      X86_OP_PRF_SIZE_OP
     
    118139
    119140 %if TMPL_BITS == 64
     141BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_rexw_bx_ud2
    120142BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_rexw_bx_ud2, BS3_PBC_NEAR
    121143        db      X86_OP_REX_W
     
    126148BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_rexw_bx_ud2
    127149
     150BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2
    128151BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_rexw_bx_ud2, BS3_PBC_NEAR
    129152        db      X86_OP_PRF_SIZE_OP
     
    137160
    138161 %if TMPL_BITS != 64
     162BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_ss_bx_ud2
    139163BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_ss_bx_ud2, BS3_PBC_NEAR
    140164        sgdt    [ss:xBX]
     
    144168BS3_PROC_END_CMN   bs3CpuBasic2_sgdt_ss_bx_ud2
    145169
     170BS3_CPUBAS2_UD_OFF bs3CpuBasic2_sgdt_opsize_ss_bx_ud2
    146171BS3_PROC_BEGIN_CMN bs3CpuBasic2_sgdt_opsize_ss_bx_ud2, BS3_PBC_NEAR
    147172        db      X86_OP_PRF_SIZE_OP
     
    157182; LIDT
    158183;
     184BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2
    159185BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    160186        lidt    [xBX]
     
    167193BS3_PROC_END_CMN   bs3CpuBasic2_lidt_bx__sidt_es_di__lidt_es_si__ud2
    168194
     195BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_bx__sidt_es_di__lidt_es_si__ud2
    169196BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    170197        db      X86_OP_PRF_SIZE_OP
     
    179206
    180207%if TMPL_BITS == 16
     208BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_bx__sidt32_es_di__lidt_es_si__ud2
    181209BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_bx__sidt32_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    182210        db      X86_OP_PRF_SIZE_OP
     
    197225
    198226 %if TMPL_BITS == 64
     227BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2
    199228BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    200229        db      X86_OP_REX_W
     
    208237BS3_PROC_END_CMN   bs3CpuBasic2_lidt_rexw_bx__sidt_es_di__lidt_es_si__ud2
    209238
     239BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_rexw_bx__sidt_es_di__lidt_es_si__ud2
    210240BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_rexw_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    211241        db      X86_OP_PRF_SIZE_OP
     
    222252
    223253 %if TMPL_BITS != 64
     254BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2
    224255BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    225256        lidt    [ss:xBX]
     
    232263BS3_PROC_END_CMN   bs3CpuBasic2_lidt_ss_bx__sidt_es_di__lidt_es_si__ud2
    233264
     265BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lidt_opsize_ss_bx__sidt_es_di__lidt_es_si__ud2
    234266BS3_PROC_BEGIN_CMN bs3CpuBasic2_lidt_opsize_ss_bx__sidt_es_di__lidt_es_si__ud2, BS3_PBC_NEAR
    235267        db      X86_OP_PRF_SIZE_OP
     
    248280; LGDT
    249281;
     282BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2
    250283BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    251284        lgdt    [xBX]
     
    258291BS3_PROC_END_CMN   bs3CpuBasic2_lgdt_bx__sgdt_es_di__lgdt_es_si__ud2
    259292
     293BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_bx__sgdt_es_di__lgdt_es_si__ud2
    260294BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    261295        db      X86_OP_PRF_SIZE_OP
     
    270304
    271305 %if TMPL_BITS == 64
     306BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2
    272307BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    273308        db      X86_OP_REX_W
     
    281316BS3_PROC_END_CMN   bs3CpuBasic2_lgdt_rexw_bx__sgdt_es_di__lgdt_es_si__ud2
    282317
     318BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2
    283319BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    284320        db      X86_OP_PRF_SIZE_OP
     
    295331
    296332 %if TMPL_BITS != 64
     333BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2
    297334BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    298335        lgdt    [ss:xBX]
     
    305342BS3_PROC_END_CMN   bs3CpuBasic2_lgdt_ss_bx__sgdt_es_di__lgdt_es_si__ud2
    306343
     344BS3_CPUBAS2_UD_OFF bs3CpuBasic2_lgdt_opsize_ss_bx__sgdt_es_di__lgdt_es_si__ud2
    307345BS3_PROC_BEGIN_CMN bs3CpuBasic2_lgdt_opsize_ss_bx__sgdt_es_di__lgdt_es_si__ud2, BS3_PBC_NEAR
    308346        db      X86_OP_PRF_SIZE_OP
     
    322360
    323361; For testing read access.
     362BS3_CPUBAS2_UD_OFF bs3CpuBasic2_mov_ax_ds_bx__ud2
    324363BS3_PROC_BEGIN_CMN bs3CpuBasic2_mov_ax_ds_bx__ud2, BS3_PBC_NEAR
    325364        mov     xAX, [xBX]
     
    331370
    332371; For testing write access.
     372BS3_CPUBAS2_UD_OFF bs3CpuBasic2_mov_ds_bx_ax__ud2
    333373BS3_PROC_BEGIN_CMN bs3CpuBasic2_mov_ds_bx_ax__ud2, BS3_PBC_NEAR
    334374        mov     [xBX], xAX
     
    340380
    341381; For testing read+write access.
     382BS3_CPUBAS2_UD_OFF bs3CpuBasic2_xchg_ds_bx_ax__ud2
    342383BS3_PROC_BEGIN_CMN bs3CpuBasic2_xchg_ds_bx_ax__ud2, BS3_PBC_NEAR
    343384        xchg    [xBX], xAX
     
    349390
    350391; Another read+write access test.
     392BS3_CPUBAS2_UD_OFF bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2
    351393BS3_PROC_BEGIN_CMN bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2, BS3_PBC_NEAR
    352394        cmpxchg  [xBX], xCX
     
    358400
    359401; For testing read access from an aborted instruction: DIV by zero
     402BS3_CPUBAS2_UD_OFF bs3CpuBasic2_div_ds_bx__ud2
    360403BS3_PROC_BEGIN_CMN bs3CpuBasic2_div_ds_bx__ud2, BS3_PBC_NEAR
    361404        div     xPRE [xBX]
     
    367410
    368411; Two memory operands: push [mem]
     412BS3_CPUBAS2_UD_OFF bs3CpuBasic2_push_ds_bx__ud2
    369413BS3_PROC_BEGIN_CMN bs3CpuBasic2_push_ds_bx__ud2, BS3_PBC_NEAR
    370414        push    xPRE [xBX]
     
    375419
    376420; Two memory operands: pop  [mem]
     421BS3_CPUBAS2_UD_OFF bs3CpuBasic2_push_ax__pop_ds_bx__ud2
    377422BS3_PROC_BEGIN_CMN bs3CpuBasic2_push_ax__pop_ds_bx__ud2, BS3_PBC_NEAR
    378423        push    xAX
     
    384429
    385430; Two memory operands: call [mem]
     431BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ds_bx__ud2
    386432BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ds_bx__ud2, BS3_PBC_NEAR
    387433        call    xPRE [xBX]
     
    392438
    393439; For testing #GP vs #PF write
     440BS3_CPUBAS2_UD_OFF bs3CpuBasic2_insb__ud2
    394441BS3_PROC_BEGIN_CMN bs3CpuBasic2_insb__ud2, BS3_PBC_NEAR
    395442        insb
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r82968 r89932  
    5353
    5454
     55/** @name MYOP_XXX - Values for FNBS3CPUBASIC2ACTSTCODE::fOp.
     56 * @{ */
     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
     62/** @} */
     63
     64
    5565/*********************************************************************************************************************************
    5666*   Structures and Typedefs                                                                                                      *
     
    7181    uint8_t     fFlags;
    7282} BS3CB2SIDTSGDT;
     83
     84
     85typedef void BS3_CALL FNBS3CPUBASIC2ACSNIPPET(void);
     86
     87typedef struct FNBS3CPUBASIC2ACTSTCODE
     88{
     89    FNBS3CPUBASIC2ACSNIPPET BS3_FAR    *pfn;
     90    uint8_t                             fOp;
     91    uint8_t                             cbMem;
     92} FNBS3CPUBASIC2ACTSTCODE;
     93typedef FNBS3CPUBASIC2ACTSTCODE const *PCFNBS3CPUBASIC2ACTSTCODE;
     94
     95typedef struct BS3CPUBASIC2ACTTSTCMNMODE
     96{
     97    uint8_t                     bMode;
     98    uint16_t                    cEntries;
     99    PCFNBS3CPUBASIC2ACTSTCODE   paEntries;
     100} BS3CPUBASIC2PFTTSTCMNMODE;
     101typedef BS3CPUBASIC2PFTTSTCMNMODE const *PCBS3CPUBASIC2PFTTSTCMNMODE;
    73102
    74103
     
    142171extern FNBS3FAR     bs3CpuBasic2_lgdt_opsize_rexw_bx__sgdt_es_di__lgdt_es_si__ud2_c64;
    143172
     173
     174/* bs3-cpu-basic-2-template.mac: */
     175FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c16;
     176FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c16;
     177FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c16;
     178FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c16;
     179FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c16;
     180
     181FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c32;
     182FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c32;
     183FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c32;
     184FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c32;
     185FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c32;
     186
     187FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ax_ds_bx__ud2_c64;
     188FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_mov_ds_bx_ax__ud2_c64;
     189FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_xchg_ds_bx_ax__ud2_c64;
     190FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_cmpxchg_ds_bx_cx__ud2_c64;
     191FNBS3CPUBASIC2ACSNIPPET bs3CpuBasic2_div_ds_bx__ud2_c64;
    144192
    145193
     
    284332
    285333
     334static const FNBS3CPUBASIC2ACTSTCODE g_aCmn16[] =
     335{
     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 },
     341};
     342
     343static const FNBS3CPUBASIC2ACTSTCODE g_aCmn32[] =
     344{
     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 },
     350};
     351
     352static const FNBS3CPUBASIC2ACTSTCODE g_aCmn64[] =
     353{
     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 },
     359};
     360
     361static const BS3CPUBASIC2PFTTSTCMNMODE g_aCmnModes[] =
     362{
     363    {   BS3_MODE_CODE_16,  RT_ELEMENTS(g_aCmn16), g_aCmn16 },
     364    {   BS3_MODE_CODE_V86, RT_ELEMENTS(g_aCmn16), g_aCmn16 },
     365    {   BS3_MODE_CODE_32,  RT_ELEMENTS(g_aCmn32), g_aCmn32 },
     366    {   BS3_MODE_CODE_64,  RT_ELEMENTS(g_aCmn64), g_aCmn64 },
     367};
     368
     369
    286370/**
    287371 * Sets globals according to the mode.
     
    450534{
    451535    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*no error code*/, X86_XCPT_UD, true /*f486ResumeFlagHint*/);
     536}
     537
     538/**
     539 * Compares \#AC trap.
     540 */
     541static void bs3CpuBasic2_CompareAcCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
     542{
     543    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_AC, true /*f486ResumeFlagHint*/);
    452544}
    453545
     
    14241516}
    14251517#endif /* convert me */
     1518
     1519
     1520static void bs3CpuBasic2_RaiseXcpt11Worker(uint8_t bMode, uint8_t *pbBuf, bool fAm,
     1521                                           BS3CPUBASIC2PFTTSTCMNMODE const BS3_FAR *pCmn)
     1522{
     1523    BS3TRAPFRAME        TrapCtx;
     1524    BS3REGCTX           Ctx;
     1525    BS3REGCTX           CtxUdExpected;
     1526    uint8_t const       cRings = bMode == BS3_MODE_RM ? 1 : 4;
     1527    uint8_t             iRing;
     1528    uint16_t            iTest;
     1529
     1530    /* make sure they're allocated  */
     1531    Bs3MemZero(&TrapCtx, sizeof(TrapCtx));
     1532    Bs3MemZero(&Ctx, sizeof(Ctx));
     1533    Bs3MemZero(&CtxUdExpected, sizeof(CtxUdExpected));
     1534
     1535    /*
     1536     * Test all relevant rings.
     1537     *
     1538     * The memory operand is ds:xBX, so point it to pbBuf.
     1539     * The test snippets mostly use xAX as operand, with the div
     1540     * one also using xDX, so make sure they make some sense.
     1541     */
     1542    Bs3RegCtxSaveEx(&Ctx, bMode, 0);
     1543
     1544    for (iRing = 0; iRing < cRings; iRing++)
     1545    {
     1546        uint32_t    uEbx;
     1547        uint8_t     fAc;
     1548
     1549        Bs3RegCtxConvertToRingX(&Ctx, iRing);
     1550
     1551        Bs3RegCtxSetGrpDsFromCurPtr(&Ctx, &Ctx.rbx, pbBuf);
     1552        uEbx = Ctx.rbx.u32;
     1553
     1554        Ctx.rax.u = (bMode & BS3_MODE_CODE_MASK) == BS3_MODE_CODE_64
     1555                  ? UINT64_C(0x80868028680386fe) : UINT32_C(0x65020686);
     1556        Ctx.rdx.u = UINT32_C(0x00100100); /* careful with range due to div */
     1557
     1558        Bs3MemCpy(&CtxUdExpected, &Ctx, sizeof(Ctx));
     1559
     1560        /*
     1561         * AC flag loop.
     1562         */
     1563        for (fAc = 0; fAc < 2; fAc++)
     1564        {
     1565            if (fAc)
     1566                Ctx.rflags.u32 |= X86_EFL_AC;
     1567            else
     1568                Ctx.rflags.u32 &= ~X86_EFL_AC;
     1569
     1570            /*
     1571             * Loop over the test snippets.
     1572             */
     1573            for (iTest = 0; iTest < pCmn->cEntries; iTest++)
     1574            {
     1575                uint8_t const    cbMem  = pCmn->paEntries[iTest].cbMem;
     1576                uint8_t const    fOp    = pCmn->paEntries[iTest].fOp;
     1577                uint8_t          offMem;
     1578                uint8_t BS3_FAR *poffUd = (uint8_t BS3_FAR *)Bs3SelLnkPtrToCurPtr(pCmn->paEntries[iTest].pfn);
     1579                Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, pCmn->paEntries[iTest].pfn);
     1580                CtxUdExpected.rip    = Ctx.rip;
     1581                CtxUdExpected.rip.u  = Ctx.rip.u + poffUd[-1];
     1582                CtxUdExpected.cs     = Ctx.cs;
     1583                CtxUdExpected.rflags = Ctx.rflags;
     1584if (bMode == BS3_MODE_RM) CtxUdExpected.rflags.u32 &= ~X86_EFL_AC; /** @todo investigate. automatically cleared, or is it just our code? */
     1585                CtxUdExpected.rdx    = Ctx.rdx;
     1586                CtxUdExpected.rax    = Ctx.rax;
     1587                if (fOp & MYOP_LD)
     1588                {
     1589                    switch (cbMem)
     1590                    {
     1591                        case 2:
     1592                            CtxUdExpected.rax.u16 = 0x0101;
     1593                            break;
     1594                        case 4:
     1595                            CtxUdExpected.rax.u32 = UINT32_C(0x01010101);
     1596                            break;
     1597                        case 8:
     1598                            CtxUdExpected.rax.u64 = UINT64_C(0x0101010101010101);
     1599                            break;
     1600                    }
     1601                }
     1602
     1603                /*
     1604                 * Buffer misalignment loop.
     1605                 */
     1606                for (offMem = 0; offMem < cbMem; offMem++)
     1607                {
     1608                    unsigned offBuf = cbMem * 2 + cbMem;
     1609                    while (offBuf-- > 0)
     1610                        pbBuf[offBuf] = 1; /* byte-by-byte to make sure it doesn't trigger AC. */
     1611
     1612                    CtxUdExpected.rbx.u32 = Ctx.rbx.u32 = uEbx + offMem; /* ASSUMES memory in first 4GB (cur stack, so okay). */
     1613                    if (BS3_MODE_IS_16BIT_SYS(bMode))
     1614                        g_uBs3TrapEipHint = Ctx.rip.u32;
     1615
     1616                    //Bs3TestPrintf("iRing=%d iTest=%d cs:rip=%04RX16:%08RX32 ds:rbx=%04RX16:%08RX32\n",
     1617                    //              iRing, iTest, Ctx.cs, Ctx.rip.u32, Ctx.ds, Ctx.rbx.u32);
     1618
     1619                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     1620
     1621                    if (!fAm || iRing != 3 || !fAc || !(offMem & (cbMem - 1))) /** @todo assumes cbMem is a power of two! */
     1622                    {
     1623                        if (fOp & MYOP_EFL)
     1624                        {
     1625                            CtxUdExpected.rflags.u16 &= ~X86_EFL_STATUS_BITS;
     1626                            CtxUdExpected.rflags.u16 |= TrapCtx.Ctx.rflags.u16 & X86_EFL_STATUS_BITS;
     1627                        }
     1628                        if (fOp == MYOP_LD_DIV)
     1629                        {
     1630                            CtxUdExpected.rax = TrapCtx.Ctx.rax;
     1631                            CtxUdExpected.rdx = TrapCtx.Ctx.rdx;
     1632                        }
     1633                        bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxUdExpected);
     1634                    }
     1635                    else
     1636                    {
     1637                        bs3CpuBasic2_CompareAcCtx(&TrapCtx, &Ctx);
     1638                    }
     1639
     1640                    g_usBs3TestStep++;
     1641                }
     1642            }
     1643        }
     1644    }
     1645}
     1646
     1647
     1648/**
     1649 * Entrypoint for \#AC tests.
     1650 *
     1651 * @returns 0 or BS3TESTDOMODE_SKIPPED.
     1652 * @param   bMode       The CPU mode we're testing.
     1653 *
     1654 * @note    When testing v8086 code, we'll be running in v8086 mode. So, careful
     1655 *          with control registers and such.
     1656 */
     1657BS3_DECL_FAR(uint8_t) BS3_CMN_FAR_NM(bs3CpuBasic2_RaiseXcpt11)(uint8_t bMode)
     1658{
     1659    uint8_t             abBuf[4096 /** @todo 128 - but that went crazy in real mode; now it's long mode going wrong.  */];
     1660    uint8_t BS3_FAR    *pbBuf;
     1661    unsigned            idxCmnModes;
     1662    uint32_t            fCr0;
     1663    Bs3MemZero(&abBuf, sizeof(abBuf));
     1664
     1665    /*
     1666     * Skip if 386 or older.
     1667     */
     1668    if ((g_uBs3CpuDetected & BS3CPU_TYPE_MASK) < BS3CPU_80486)
     1669    {
     1670        Bs3TestSkipped("#AC test requires 486 or later");
     1671        return BS3TESTDOMODE_SKIPPED;
     1672    }
     1673
     1674    bs3CpuBasic2_SetGlobals(bMode);
     1675
     1676    /* Get us a 64-byte aligned buffer. */
     1677    pbBuf = abBuf;
     1678    if (BS3_FP_OFF(pbBuf) & 63)
     1679        pbBuf = &abBuf[64 - BS3_FP_OFF(pbBuf) & 63];
     1680    //Bs3TestPrintf("pbBuf=%p\n", pbBuf);
     1681
     1682    /* Find the g_aCmnModes entry. */
     1683    idxCmnModes = 0;
     1684    while (g_aCmnModes[idxCmnModes].bMode != (bMode & BS3_MODE_CODE_MASK))
     1685        idxCmnModes++;
     1686    //Bs3TestPrintf("idxCmnModes=%d bMode=%#x\n", idxCmnModes, bMode);
     1687
     1688    /* First round is w/o aligment checks enabled. */
     1689    fCr0 = Bs3RegGetCr0();
     1690    BS3_ASSERT(!(fCr0 & X86_CR0_AM));
     1691    Bs3RegSetCr0(fCr0 & ~X86_CR0_AM);
     1692    bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBuf, false /*fAm*/, &g_aCmnModes[idxCmnModes]);
     1693
     1694#if 1
     1695    /* The second round is with aligment checks enabled. */
     1696    Bs3RegSetCr0(Bs3RegGetCr0() | X86_CR0_AM);
     1697    bs3CpuBasic2_RaiseXcpt11Worker(bMode, pbBuf, true /*fAm*/, &g_aCmnModes[idxCmnModes]);
     1698#endif
     1699
     1700    Bs3RegSetCr0(fCr0);
     1701    return 0;
     1702}
    14261703
    14271704
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c

    r83021 r89932  
    3939BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_RaiseXcpt1);
    4040
     41FNBS3TESTDOMODE             bs3CpuBasic2_RaiseXcpt11_f16;
    4142FNBS3TESTDOMODE             bs3CpuBasic2_sidt_f16;
    4243FNBS3TESTDOMODE             bs3CpuBasic2_sgdt_f16;
     
    5960static const BS3TESTMODEBYONEENTRY g_aModeByOneTests[] =
    6061{
     62    { "#ac",  bs3CpuBasic2_RaiseXcpt11_f16, 0 },
     63#if 1
    6164    { "iret", bs3CpuBasic2_iret_f16, 0 },
    6265    { "sidt", bs3CpuBasic2_sidt_f16, 0 },
     
    6467    { "lidt", bs3CpuBasic2_lidt_f16, 0 },
    6568    { "lgdt", bs3CpuBasic2_lgdt_f16, 0 },
     69#endif
    6670};
    6771
     
    7781     */
    7882    NOREF(g_aModeTest); NOREF(g_aModeByOneTests); /* for when commenting out bits */
    79 #if 1
    8083    Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
    8184    Bs3TestDoModesByOne_rm(g_aModeByOneTests, RT_ELEMENTS(g_aModeByOneTests), 0);
    82 #endif
     85#if 1
    8386
    8487    /*
     
    8689     */
    8790    Bs3SwitchTo32BitAndCallC_rm(bs3CpuBasic2_Do32BitTests_pe32, 0);
     91#endif
    8892
    8993    Bs3TestTerm();
     94    Bs3Shutdown();
    9095for (;;) { ASMHalt(); }
    9196}
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