VirtualBox

Changeset 97433 in vbox for trunk/src/VBox/ValidationKit


Ignore:
Timestamp:
Nov 7, 2022 3:16:23 PM (2 years ago)
Author:
vboxsync
Message:

ValKit/bs3-cpu-basic-2: Single step the relative jmp instructions. bugref:9898

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

Legend:

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

    r97431 r97433  
    517517
    518518; jmp rel8 (backwards)
     519BS3_GLOBAL_NAME_EX RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jb_back__ud2),.again), function, 2
     520        ud2
     521        times 7 int3
    519522BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb_back__ud2
    520523BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jb_back__ud2, BS3_PBC_NEAR
    521         jmp     .start
    522 .again: ud2
    523         times 7 int3
    524         jmp     .again
    525 .start:
    526524        jmp short .again
    527525.post_jmp:
    528526        int3
    529 AssertCompile(.post_jmp - .start == 2)
     527AssertCompile(.post_jmp - BS3_LAST_LABEL == 2)
    530528BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb_back__ud2
    531529
     
    549547
    550548; jmp rel16 (backwards)
     549BS3_GLOBAL_NAME_EX RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jv_back__ud2),.again), function, 2
     550        ud2
     551        times 6 int3
    551552BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_back__ud2
    552553BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jv_back__ud2, BS3_PBC_NEAR
    553         jmp     .start
    554 .again: ud2
    555         times 6 int3
    556         jmp     .again
    557 .start:
    558554        jmp near .again
    559555.post_jmp:
    560556        int3
    561557 %if TMPL_BITS == 16
    562 AssertCompile(.post_jmp - .start == 3)
     558AssertCompile(.post_jmp - BS3_LAST_LABEL == 3)
    563559 %else
    564 AssertCompile(.post_jmp - .start == 5)
     560AssertCompile(.post_jmp - BS3_LAST_LABEL == 5)
    565561 %endif
    566562BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv_back__ud2
     
    599595
    600596; jmp rel8 (backwards) with opsize override.
     597BS3_GLOBAL_NAME_EX RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jb_opsize_back__ud2),.again), function, 2
     598        ud2
     599        times 19 int3
    601600BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb_opsize_back__ud2
    602601BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jb_opsize_back__ud2, BS3_PBC_NEAR
    603         jmp     .start
    604 .again: ud2
    605         times 19 int3
    606         jmp     .again
    607 .start:
    608         db 66h
     602        db      66h
    609603        jmp short .again
    610604.post_jmp:
    611605        int3
    612 AssertCompile(.post_jmp - .start == 3)
     606AssertCompile(.post_jmp - BS3_LAST_LABEL == 3)
    613607BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb_opsize_back__ud2
    614608
     
    617611BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_opsize__ud2
    618612BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jv_opsize__ud2, BS3_PBC_NEAR
    619         db 66h, 0e9h                    ; o32 jmp near .again
     613        db      66h, 0e9h               ; o32 jmp near .again
    620614 %if TMPL_BITS != 32
    621         dd 11
     615        dd      11
    622616 %else
    623         dw 11
     617        dw      11
    624618 %endif
    625619.post_jmp:
     
    632626
    633627; jmp rel16 (backwards) with opsize override.
     628BS3_GLOBAL_NAME_EX RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jv_opsize_back__ud2),.again), function, 2
     629        ud2
     630        times 19 int3
    634631BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_opsize_back__ud2
    635632BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jv_opsize_back__ud2, BS3_PBC_NEAR
    636         jmp     .start
    637 .again: ud2
    638         int3
    639         jmp     .again
    640 .start:
    641633 %if TMPL_BITS != 32
    642634        db      66h, 0e9h               ; o32 jmp near .again
    643         dd      -(6 + 1 + 2 + 2)
     635        dd      RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jv_opsize_back__ud2),.again) - .post_jmp
    644636 %else
    645637        db      66h, 0e9h               ; o16 jmp near .again
    646         dw      -(4 + 1 + 2 + 2)
    647  %endif
    648 .post_jmp:
    649         times 11 int3
     638        dw      RT_CONCAT(BS3_CMN_NM(bs3CpuBasic2_jmp_jv_opsize_back__ud2),.again) - .post_jmp
     639 %endif
     640.post_jmp:
     641        int3
    650642BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv_opsize_back__ud2
    651643
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r97432 r97433  
    510510
    511511    if (   g_f16BitSys
     512        || bXcpt == X86_XCPT_DB /* hack (10980xe)... */
    512513        || (   !f486ResumeFlagHint
    513514            && (g_uBs3CpuDetected & BS3CPU_TYPE_MASK) <= BS3CPU_80486 ) )
     
    594595{
    595596    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_AC, true /*f486ResumeFlagHint*/, cbIpAdjust);
     597}
     598
     599/**
     600 * Compares \#DB trap.
     601 */
     602static void bs3CpuBasic2_CompareDbCtx(PCBS3TRAPFRAME pTrapCtx, PCBS3REGCTX pStartCtx)
     603{
     604    bs3CpuBasic2_CompareCpuTrapCtx(pTrapCtx, pStartCtx, 0 /*always zero*/, X86_XCPT_DB, false /*f486ResumeFlagHint?*/, 0 /*cbIpAdjust*/);
    596605}
    597606
     
    36673676 *          with control registers and such.
    36683677 */
    3669 BS3_DECL_FAR(uint8_t) BS3_CMN_FAR_NM(bs3CpuBasic2_jmp)(uint8_t bMode)
     3678BS3_DECL_FAR(uint8_t) BS3_CMN_FAR_NM(bs3CpuBasic2_jmp_rel)(uint8_t bMode)
    36703679{
    36713680    BS3TRAPFRAME        TrapCtx;
     
    37343743                Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, s_aTests[iTest].pfnTest);
    37353744                fpbCode = (uint8_t const BS3_FAR *)BS3_FP_MAKE(Ctx.cs, Ctx.rip.u16);
    3736                 CtxExpected.rip.u = Ctx.rip.u + fpbCode[-1];
     3745                CtxExpected.rip.u = Ctx.rip.u + (int64_t)(int8_t)fpbCode[-1];
    37373746            }
    37383747            else
     
    37543763
    37553764            Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
    3756 
    37573765            if (s_aTests[iTest].iWrap == 0 || !s_aTests[iTest].fOpSizePfx)
    37583766                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxExpected);
    37593767            else
    37603768                bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, 0);
    3761 
     3769            g_usBs3TestStep++;
     3770
     3771            /* Again single stepping: */
     3772            Ctx.rflags.u16        |= X86_EFL_TF;
     3773            CtxExpected.rflags.u16 = Ctx.rflags.u16;
     3774            Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3775            if (s_aTests[iTest].iWrap == 0 || !s_aTests[iTest].fOpSizePfx)
     3776            {
     3777                /** @todo check DR6.BS. */
     3778                bs3CpuBasic2_CompareDbCtx(&TrapCtx, &CtxExpected);
     3779            }
     3780            else
     3781                bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, 0);
     3782            Ctx.rflags.u16        &= ~X86_EFL_TF;
     3783            CtxExpected.rflags.u16 = Ctx.rflags.u16;
    37623784            g_usBs3TestStep++;
    37633785        }
     
    38613883                {
    38623884                    uint16_t const offFn = BS3_FP_OFF(s_aTests[iTest].pfnTest);
    3863                     uint16_t const offUd = offFn + pbCode16[offFn - 1];
     3885                    uint16_t const offUd = offFn + (int16_t)(int8_t)pbCode16[offFn - 1];
    38643886                    pbCode16[offUd]     = 0xf1; /* replace original ud2 with icebp */
    38653887                    pbCode16[offUd + 1] = 0xf1;
     
    38763898                uint8_t const BS3_FAR *fpbCode = Bs3SelLnkPtrToCurPtr(s_aTests[iTest].pfnTest);
    38773899                Ctx.rip.u = Bs3SelLnkPtrToFlat(s_aTests[iTest].pfnTest);
    3878                 CtxExpected.rip.u = Ctx.rip.u + fpbCode[-1];
     3900                CtxExpected.rip.u = Ctx.rip.u + (int64_t)(int8_t)fpbCode[-1];
    38793901                if (s_aTests[iTest].fOpSizePfx && !fIgnPfx)
    38803902                    CtxExpected.rip.u &= UINT16_MAX;
     
    38873909                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxExpected);
    38883910                g_usBs3TestStep++;
     3911
     3912                /* Again single stepping: */
     3913                Ctx.rflags.u16        |= X86_EFL_TF;
     3914                CtxExpected.rflags.u16 = Ctx.rflags.u16;
     3915                Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3916                /** @todo check DR6.BS. */
     3917                bs3CpuBasic2_CompareDbCtx(&TrapCtx, &CtxExpected);
     3918                Ctx.rflags.u16        &= ~X86_EFL_TF;
     3919                CtxExpected.rflags.u16 = Ctx.rflags.u16;
     3920                g_usBs3TestStep++;
    38893921            }
    38903922        }
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c

    r97431 r97433  
    5555FNBS3TESTDOMODE             bs3CpuBasic2_lgdt_f16;
    5656FNBS3TESTDOMODE             bs3CpuBasic2_iret_f16;
    57 FNBS3TESTDOMODE             bs3CpuBasic2_jmp_f16;
     57FNBS3TESTDOMODE             bs3CpuBasic2_jmp_rel_f16;
    5858
    5959BS3_DECL_CALLBACK(void)     bs3CpuBasic2_Do32BitTests_pe32();
     
    7676#if 1
    7777    //{ "iret", bs3CpuBasic2_iret_f16, 0 },
    78     { "jmp",  bs3CpuBasic2_jmp_f16, 0 },
     78    { "jmp jb / jv",  bs3CpuBasic2_jmp_rel_f16, 0 },
    7979#endif
    8080#if 0
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