VirtualBox

Ignore:
Timestamp:
Jun 7, 2016 4:38:07 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
107886
Message:

updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1.c32

    r61540 r61547  
    5656#define P_RN  X86_OP_PRF_REPNZ
    5757
     58#define RM_EAX_EAX          ((3 << X86_MODRM_MOD_SHIFT) | (X86_GREG_xAX <<  X86_MODRM_REG_SHIFT) | (X86_GREG_xAX))
     59#define RM_EAX_DEREF_EBX    ((0 << X86_MODRM_MOD_SHIFT) | (X86_GREG_xAX <<  X86_MODRM_REG_SHIFT) | (X86_GREG_xBX))
     60
     61#define F_486   0
     62#define F_SSE2  1
     63#define F_SSE3  2
     64#define F_SSE42 4
     65#define F_MOVBE 80
    5866
    5967CPUDECODE1TST const g_aSimpleTests[] =
    6068{
    61     {  0,  2, 2,  { 0x0f, 0x38, } },
    62     {  0,  3, 3,  { P_LK, 0x0f, 0x38, } },
     69    /*
     70     *  fFlags, cbUd, cbOpcodes, abOpcodes
     71     */
     72#if 1
     73    /* Using currently undefined 0x0f 0x38 sequences. */
     74    {        0,  2,   3,         { 0x0f, 0x38, RM_EAX_EAX, } },
     75    {        0,  2+1, 3+1,       { P_LK, 0x0f, 0x38, RM_EAX_EAX, } },
     76    {        0,  2+1, 3+1,       { P_RN, 0x0f, 0x38, RM_EAX_EAX, } },
     77    {        0,  2+1, 3+1,       { P_RZ, 0x0f, 0x38, RM_EAX_EAX, } },
     78    {        0,  2+2, 3+2, { P_LK, P_LK, 0x0f, 0x38, RM_EAX_EAX, } },
     79#endif
     80#if 1
     81    /* The XADD instruction has empty lines for 66, f3 and f2 prefixes.
     82       AMD doesn't do anything special for XADD Ev,Gv as the intel table would indicate. */
     83    {    F_486,   99,  3,             { 0x0f, 0xc1, RM_EAX_EAX, } },
     84    {    F_486,   99,  4,       { P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } },
     85    {    F_486,   99,  4,       { P_RN, 0x0f, 0xc1, RM_EAX_EAX, } },
     86    {    F_486,   99,  5, { P_OZ, P_RN, 0x0f, 0xc1, RM_EAX_EAX, } },
     87    {    F_486,   99,  5, { P_RN, P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } },
     88    {    F_486,   99,  4,       { P_RZ, 0x0f, 0xc1, RM_EAX_EAX, } },
     89    {    F_486,   99,  5, { P_OZ, P_RZ, 0x0f, 0xc1, RM_EAX_EAX, } },
     90    {    F_486,   99,  5, { P_RZ, P_OZ, 0x0f, 0xc1, RM_EAX_EAX, } },
     91#endif
     92#if 1
     93    /* The movnti instruction is confined to the unprefixed lined in the intel manuals. Check how the other lines work. */
     94    {   F_SSE2,    3,  3,             { 0x0f, 0xc3, RM_EAX_EAX, } },        /* invalid - reg,reg */
     95    {   F_SSE2,   99,  3,             { 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },
     96    {   F_SSE2,    4,  4,       { P_OZ, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },  /* invalid */
     97    {   F_SSE2,    4,  4,       { P_RN, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },  /* invalid */
     98    {   F_SSE2,    4,  4,       { P_RZ, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },  /* invalid */
     99    {   F_SSE2,    4,  4,       { P_LK, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },  /* invalid */
     100    {   F_SSE2,    5,  5, { P_RZ, P_LK, 0x0f, 0xc3, RM_EAX_DEREF_EBX, } },  /* invalid */
     101#endif
     102    /* The lddqu instruction requires a 0xf2 prefix, intel only lists 0x66 and empty
     103       prefix for it.  Check what they really mean by that*/
     104    {   F_SSE3,    4,  4,            { P_RZ, 0x0f, 0xf0, RM_EAX_EAX, } },          /* invalid - reg, reg  */
     105    {   F_SSE3,   99,  4,            { P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     106    {   F_SSE3,   99,  5,      { P_RZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     107    {   F_SSE3,    3,  3,      {             0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     108    {   F_SSE3,    4,  4,      {       P_RN, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     109    {   F_SSE3,    4,  4,      {       P_OZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     110    {   F_SSE3,    4,  4,      {       P_LK, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     111    {   F_SSE3,    5,  5,      { P_RZ, P_RN, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     112    {   F_SSE3,   99,  5,      { P_RZ, P_OZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } }, // AMD,why?
     113    {   F_SSE3,    5,  5,      { P_RZ, P_LK, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     114    {   F_SSE3,   99,  5,      { P_RN, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     115    {   F_SSE3,   99,  5,      { P_OZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     116    {   F_SSE3,    5,  5,      { P_LK, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     117    {   F_SSE3,   99,  5,      { P_OZ, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     118    {   F_SSE3,   99,  6,{ P_OZ, P_RN, P_RZ, 0x0f, 0xf0, RM_EAX_DEREF_EBX, } },
     119/** @todo crc32 / movbe  */
    63120};
    64121
     
    68125     * Allocate and initialize a page pair
    69126     */
    70     uint8_t BS3_FAR *pbPages  = Bs3MemGuardedTestPageAlloc(BS3MEMKIND_FLAT32);
     127    uint8_t BS3_FAR *pbPages;
     128    pbPages  = Bs3MemGuardedTestPageAlloc(BS3MEMKIND_FLAT32);
    71129    if (pbPages)
    72130    {
     
    75133        BS3TRAPFRAME    TrapFrame;
    76134
    77 //BS3_CMN_PROTO_STUB(void, Bs3TrapSetJmpAndRestore,(PCBS3REGCTX pCtxRestore, PBS3TRAPFRAME pTrapFrame));
     135        Bs3MemZero(&Ctx, sizeof(Ctx));
     136        Bs3MemZero(&TrapFrame, sizeof(TrapFrame));
     137
     138        ASMSetCR0((ASMGetCR0() & ~(X86_CR0_EM | X86_CR0_TS)) | X86_CR0_MP);
     139        ASMSetCR4(ASMGetCR4() | X86_CR4_OSFXSR);
     140
     141        Bs3RegCtxSaveEx(&Ctx, BS3_MODE_CODE_32, 512);
     142        Ctx.rbx.u64 = (uintptr_t)pbPages;
    78143
    79144        for (i = 0; i < RT_ELEMENTS(g_aSimpleTests); i++)
    80145        {
    81             unsigned off = g_aSimpleTests[i].cbOpcodes;
    82             while (off-- > 0)
     146            unsigned cb = g_aSimpleTests[i].cbOpcodes;
     147            while (cb >= 1)
    83148            {
    84                 Bs3MemCpy(&pbPages[X86_PAGE_SIZE - off], &g_aSimpleTests[i].abOpcodes[0], off);
    85 
     149                uint8_t BS3_FAR *pbRip = &pbPages[X86_PAGE_SIZE - cb];
     150                Bs3MemCpy(pbRip, &g_aSimpleTests[i].abOpcodes[0], cb);
     151                Bs3RegCtxSetRipCsFromFlat(&Ctx, (uintptr_t)pbRip);
     152                Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame);
     153#if 0
     154                Bs3TestPrintf("\ni=%d cb=%#x (cbUd=%#x cbOpcodes=%#x)\n", i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes);
     155                Bs3TrapPrintFrame(&TrapFrame);
     156#endif
     157                if (cb >= g_aSimpleTests[i].cbUd)
     158                {
     159                    if (TrapFrame.bXcpt != X86_XCPT_UD)
     160                        Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #UD got %#x\n",
     161                                       i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt);
     162                }
     163                else if (cb < g_aSimpleTests[i].cbOpcodes)
     164                {
     165                    if (TrapFrame.bXcpt != X86_XCPT_PF)
     166                        Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF (on) got %#x\n",
     167                                       i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt);
     168                    else if (TrapFrame.Ctx.rip.u32 != (uintptr_t)pbRip)
     169                        Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF rip of %p (on) got %#RX32\n",
     170                                       i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes,
     171                                       pbRip, TrapFrame.Ctx.rip.u32);
     172                }
     173                else
     174                {
     175                    if (TrapFrame.bXcpt != X86_XCPT_PF)
     176                        Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF (after) got %#x\n",
     177                                       i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes, TrapFrame.bXcpt);
     178                    else if (TrapFrame.Ctx.rip.u32 != (uintptr_t)&pbPages[X86_PAGE_SIZE])
     179                        Bs3TestFailedF("i=%d cb=%d cbUd=%d cb=%d: expected #PF rip of %p (after) got %#RX32\n",
     180                                       i, cb, g_aSimpleTests[i].cbUd, g_aSimpleTests[i].cbOpcodes,
     181                                       &pbPages[X86_PAGE_SIZE], TrapFrame.Ctx.rip.u32);
     182                }
     183                cb--;
    86184            }
    87185        }
     
    100198
    101199
    102 BS3_DECL(void) Main_pe32()
     200BS3_DECL(void) Main_pp32()
    103201{
    104202    Bs3TestInit("bs3-cpu-decoding-1");
    105203    Bs3TestPrintf("g_uBs3CpuDetected=%#x\n", g_uBs3CpuDetected);
    106204
    107 //    Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
     205    DecodeEdgeTest();
    108206
    109207    Bs3TestTerm();
     208
     209    //for (;;) ASMHalt();
    110210}
    111211
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