VirtualBox

Changeset 95296 in vbox


Ignore:
Timestamp:
Jun 15, 2022 10:06:20 PM (2 years ago)
Author:
vboxsync
Message:

ValKit/bs3-cpu-instr-2: Simple RORX test to establing whether V<>0 triggers #UD or not (it does). bugref:9898

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

Legend:

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

    r93115 r95296  
    3333
    3434
    35 
    36 
    3735/*********************************************************************************************************************************
    3836*   Structures and Typedefs                                                                                                      *
     
    6260extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_div_xBX_ud2);
    6361extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_idiv_xBX_ud2);
     62extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_RBX_RDX_2_icebp);
     63extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp);
     64extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_L1);
     65# if ARCH_BITS == 64
     66extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_X1);
     67# endif
     68extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V1);
     69extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V15);
    6470# if ARCH_BITS == 64
    6571extern FNBS3FAR     BS3_CMN_NM(bs3CpuInstr2_cmpxchg16b_rdi_ud2);
     
    597603
    598604
     605BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_rorx)(uint8_t bMode)
     606{
     607    static const struct
     608    {
     609        FPFNBS3FAR      pfnWorker;
     610        bool            fOkay;
     611        RTCCUINTXREG    uIn;
     612        RTCCUINTXREG    uOut;
     613    } s_aTests[] =
     614    {
     615        {   BS3_CMN_NM(bs3CpuInstr2_rorx_RBX_RDX_2_icebp),      true,    // #0
     616            0,                      /* -> */ 0 },
     617        {   BS3_CMN_NM(bs3CpuInstr2_rorx_RBX_RDX_2_icebp),      true,    // #1
     618            ~(RTCCUINTXREG)2,       /* -> */ ~(RTCCUINTXREG)0 >> 1 },
     619        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp),      true,    // #2
     620            0,                      /* -> */ 0 },
     621        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp),      true,    // #3
     622            ~(RTCCUINTXREG)2,       /* -> */ (RTCCUINTXREG)(~(uint32_t)0 >> 1) },
     623
     624        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_L1),   false,   // #4
     625            RTCCUINTXREG_MAX,       /* -> */ 0 },
     626        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V1),   false,   // #5
     627            RTCCUINTXREG_MAX,       /* -> */ 0 },
     628        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V15),  false,   // #6
     629            RTCCUINTXREG_MAX,       /* -> */ 0 },
     630# if ARCH_BITS == 64 /* The VEX.X=0 encoding mean LES instruction in 32-bit and 16-bit mode. */
     631        {   BS3_CMN_NM(bs3CpuInstr2_rorx_EBX_EDX_2_icebp_X1),   true,    // #7
     632            UINT32_C(0xf1e2d3c5),   /* -> */ (RTCCUINTXREG)UINT32_C(0x7c78b4f1) },
     633# endif
     634    };
     635
     636    BS3REGCTX       Ctx;
     637    BS3TRAPFRAME    TrapFrame;
     638    unsigned        i, j;
     639
     640    /* Ensure the structures are allocated before we sample the stack pointer. */
     641    Bs3MemSet(&Ctx, 0, sizeof(Ctx));
     642    Bs3MemSet(&TrapFrame, 0, sizeof(TrapFrame));
     643
     644    /*
     645     * Create test context.
     646     */
     647    Bs3RegCtxSaveEx(&Ctx, bMode, 512);
     648
     649    /*
     650     * Do the tests twice, first with all flags set, then once again with
     651     * flags cleared.  The flags are not supposed to be touched at all.
     652     */
     653    Ctx.rflags.u16 |= X86_EFL_STATUS_BITS;
     654    for (j = 0; j < 2; j++)
     655    {
     656        for (i = 0; i < RT_ELEMENTS(s_aTests); i++)
     657        {
     658            bool const    fOkay = !BS3_MODE_IS_RM_OR_V86(bMode) && s_aTests[i].fOkay;
     659            uint64_t      uExpectRbx;
     660            uint64_t      uExpectRip;
     661            Ctx.rbx.uCcXReg = RTCCUINTXREG_MAX * 1019;
     662            Ctx.rdx.uCcXReg = s_aTests[i].uIn;
     663            Bs3RegCtxSetRipCsFromCurPtr(&Ctx, s_aTests[i].pfnWorker);
     664            uExpectRbx = fOkay ? s_aTests[i].uOut : Ctx.rbx.u;
     665            uExpectRip = Ctx.rip.u + (fOkay ? 6 : 0);
     666            Bs3TrapSetJmpAndRestore(&Ctx, &TrapFrame);
     667
     668            if (   TrapFrame.bXcpt != X86_XCPT_UD
     669                || TrapFrame.Ctx.rip.u != uExpectRip
     670                || TrapFrame.Ctx.rdx.u != Ctx.rdx.u
     671                || TrapFrame.Ctx.rbx.u != uExpectRbx
     672                /* check that nothing else really changed: */
     673                || (TrapFrame.Ctx.rflags.u16 & X86_EFL_STATUS_BITS) != (Ctx.rflags.u16 & X86_EFL_STATUS_BITS)
     674                || TrapFrame.Ctx.rax.u != Ctx.rax.u
     675                || TrapFrame.Ctx.rcx.u != Ctx.rcx.u
     676                || TrapFrame.Ctx.rsp.u != Ctx.rsp.u
     677                || TrapFrame.Ctx.rbp.u != Ctx.rbp.u
     678                || TrapFrame.Ctx.rsi.u != Ctx.rsi.u
     679                || TrapFrame.Ctx.rdi.u != Ctx.rdi.u
     680                )
     681            {
     682                Bs3TestFailedF("test #%i failed: input %#" RTCCUINTXREG_XFMT, i, s_aTests[i].uIn);
     683                if (TrapFrame.bXcpt != X86_XCPT_UD)
     684                    Bs3TestFailedF("Expected bXcpt = %#x, got %#x", X86_XCPT_UD, TrapFrame.bXcpt);
     685                if (TrapFrame.Ctx.rip.u != uExpectRip)
     686                    Bs3TestFailedF("Expected RIP = %#06RX16, got %#06RX16 (src)", uExpectRip, TrapFrame.Ctx.rip.u);
     687                if (TrapFrame.Ctx.rdx.u != Ctx.rdx.u)
     688                    Bs3TestFailedF("Expected RDX = %#06RX16, got %#06RX16 (src)", Ctx.rdx.u, TrapFrame.Ctx.rdx.u);
     689                if (TrapFrame.Ctx.rbx.u != uExpectRbx)
     690                    Bs3TestFailedF("Expected RBX = %#06RX16, got %#06RX16 (dst)", uExpectRbx, TrapFrame.Ctx.rbx.u);
     691
     692                if ((TrapFrame.Ctx.rflags.u16 & X86_EFL_STATUS_BITS) != (Ctx.rflags.u16 & X86_EFL_STATUS_BITS))
     693                    Bs3TestFailedF("Expected EFLAGS = %#06RX16, got %#06RX16",
     694                                   Ctx.rflags.u16 & X86_EFL_STATUS_BITS, TrapFrame.Ctx.rflags.u16 & X86_EFL_STATUS_BITS);
     695                if (TrapFrame.Ctx.rax.u != Ctx.rax.u)
     696                    Bs3TestFailedF("Expected RAX = %#06RX16, got %#06RX16", Ctx.rax.u, TrapFrame.Ctx.rax.u);
     697                if (TrapFrame.Ctx.rcx.u != Ctx.rcx.u)
     698                    Bs3TestFailedF("Expected RCX = %#06RX16, got %#06RX16", Ctx.rcx.u, TrapFrame.Ctx.rcx.u);
     699                if (TrapFrame.Ctx.rsp.u != Ctx.rsp.u)
     700                    Bs3TestFailedF("Expected RSP = %#06RX16, got %#06RX16", Ctx.rsp.u, TrapFrame.Ctx.rsp.u);
     701                if (TrapFrame.Ctx.rbp.u != Ctx.rbp.u)
     702                    Bs3TestFailedF("Expected RBP = %#06RX16, got %#06RX16", Ctx.rbp.u, TrapFrame.Ctx.rbp.u);
     703                if (TrapFrame.Ctx.rsi.u != Ctx.rsi.u)
     704                    Bs3TestFailedF("Expected RSI = %#06RX16, got %#06RX16", Ctx.rsi.u, TrapFrame.Ctx.rsi.u);
     705                if (TrapFrame.Ctx.rdi.u != Ctx.rdi.u)
     706                    Bs3TestFailedF("Expected RDI = %#06RX16, got %#06RX16", Ctx.rdi.u, TrapFrame.Ctx.rdi.u);
     707            }
     708        }
     709        Ctx.rflags.u16 &= ~X86_EFL_STATUS_BITS;
     710    }
     711
     712    return 0;
     713}
     714
     715
    599716# if ARCH_BITS == 64
     717
    600718BS3_DECL_FAR(uint8_t) BS3_CMN_NM(bs3CpuInstr2_cmpxchg16b)(uint8_t bMode)
    601719{
     
    10201138    return 0;
    10211139}
     1140
    10221141# endif /* ARCH_BITS == 64 */
    1023 
    10241142
    10251143#endif /* BS3_INSTANTIATING_CMN */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2-template.mac

    r93115 r95296  
    8383BS3_PROC_END_CMN   bs3CpuInstr2_idiv_xBX_ud2
    8484
    85 
     85;
     86; RORX - VEX instruction with a couple of questions about non-standard encodings.
     87;
     88%define icebp ud2
     89BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_EBX_EDX_2_icebp, BS3_PBC_NEAR
     90%if TMPL_BITS != 16
     91        rorx    ebx, edx, 2
     92%else
     93        db 0C4h,0E3h,07Bh,0F0h,0DAh,002h    ; wrong nasm mode, whatever
     94%endif
     95.again:
     96        icebp
     97        jmp     .again
     98BS3_PROC_END_CMN   bs3CpuInstr2_rorx_EBX_EDX_2_icebp
     99
     100BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_RBX_RDX_2_icebp, BS3_PBC_NEAR
     101%if TMPL_BITS == 64
     102        rorx    rbx, rdx, 2
     103%else
     104        db 0C4h,0E3h,0FBh,0F0h,0DAh,002h    ; 32-bit ignores VEX.W=1 (10980xe)
     105%endif
     106.again:
     107        icebp
     108        jmp     .again
     109BS3_PROC_END_CMN   bs3CpuInstr2_rorx_RBX_RDX_2_icebp
     110
     111BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_EBX_EDX_2_icebp_L1, BS3_PBC_NEAR
     112        db 0C4h, 0E3h, 07Bh | 4h, 0F0h, 0DAh, 002h          ; VEX.L=1 should #UD according to the docs
     113.again:
     114        icebp
     115        jmp     .again
     116BS3_PROC_END_CMN   bs3CpuInstr2_rorx_EBX_EDX_2_icebp_L1
     117
     118BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V1, BS3_PBC_NEAR
     119        db 0C4h, 0E3h, 003h | ~(1 << 3), 0F0h, 0DAh, 002h   ; VEX.VVVV=1 - behaviour is undocumented - 10980xe #UD
     120.again:
     121        icebp
     122        jmp     .again
     123BS3_PROC_END_CMN   bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V1
     124
     125BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V15, BS3_PBC_NEAR
     126        db 0C4h, 0E3h, 003h | ~(15 << 3), 0F0h, 0DAh, 002h  ; VEX.VVVV=15 - behaviour is not documented - 10980xe #UD
     127.again:
     128        icebp
     129        jmp     .again
     130BS3_PROC_END_CMN   bs3CpuInstr2_rorx_EBX_EDX_2_icebp_V15
     131
     132 %if TMPL_BITS == 64
     133BS3_PROC_BEGIN_CMN bs3CpuInstr2_rorx_EBX_EDX_2_icebp_X1, BS3_PBC_NEAR
     134        db 0C4h, 0E3h & ~40h, 07Bh, 0F0h, 0DAh, 002h        ; VEX.X=0 - behaviour is not documented - ignored by 10980xe
     135.again:
     136        icebp
     137        jmp     .again
     138BS3_PROC_END_CMN   bs3CpuInstr2_rorx_EBX_EDX_2_icebp_X1
     139 %endif
     140
     141
     142;
     143;
     144;
    86145 %if TMPL_BITS == 64
    87146BS3_PROC_BEGIN_CMN bs3CpuInstr2_cmpxchg16b_rdi_ud2, BS3_PBC_NEAR
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-instr-2.c

    r93115 r95296  
    3939BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_div);
    4040BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_idiv);
     41BS3TESTMODE_PROTOTYPES_CMN(bs3CpuInstr2_rorx);
    4142BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_cmpxchg16b);
    4243BS3TESTMODE_PROTOTYPES_CMN_64(bs3CpuInstr2_wrfsbase);
     
    5556    BS3TESTMODEENTRY_CMN("div", bs3CpuInstr2_div),
    5657    BS3TESTMODEENTRY_CMN("idiv", bs3CpuInstr2_idiv),
     58    BS3TESTMODEENTRY_CMN("rorx", bs3CpuInstr2_rorx),
    5759    BS3TESTMODEENTRY_CMN_64("cmpxchg16b", bs3CpuInstr2_cmpxchg16b),
    5860    BS3TESTMODEENTRY_CMN_64("wrfsbase", bs3CpuInstr2_wrfsbase),
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r93115 r95296  
    25562556    /** 32-bit view. */
    25572557    uint32_t    au32[2];
     2558    /** Unsigned integer, depending on compiler context.
     2559     * This generally follows ARCH_BITS. */
     2560    RTCCUINTREG  uCcReg;
     2561    /** Extended unsigned integer, depending on compiler context.
     2562     * This is 32-bit in 16-bit and 32-bit compiler contexts, and 64-bit in
     2563     * 64-bit. */
     2564    RTCCUINTXREG uCcXReg;
    25582565} BS3REG;
    25592566/** Pointer to an integer register. */
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