VirtualBox

Changeset 97431 in vbox


Ignore:
Timestamp:
Nov 7, 2022 1:53:24 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154436
Message:

ValKit/bs3-cpu-basic-2: Working a JMP test... bugref:9898

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

Legend:

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

    r96407 r97431  
    160160
    161161
     162;
     163; Jump code segment 64KB.
     164;
     165; There is no ORG directive in OMF mode of course. :-(
     166;
     167section BS3JMPTEXT16 align=16 CLASS=BS3CLASS16JMPCODE PRIVATE USE16
     168        GROUP BS3GROUPJMPTEXT16 BS3JMPTEXT16
     169        BS3_SET_BITS 16
     170
     171; 0000: Start with two int3 filler instructions.
     172BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmptext16_start), function, 2
     173        int3
     174        int3
     175
     176; 0002: This is the target for forward wrap around jumps, should they succeed.
     177BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_target_wrap_forward), function, 2
     178        ud2
     179        align 8, int3
     180
     181; 0008
     182BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_wrap_backward__ud2), function, 2
     183        db      0ebh, -012h             ; jmp (0x0008 + 2 - 0x12 = 0xFFFFFFF8 (-8))
     184        int3
     185
     186; 000b
     187BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_opsize_wrap_backward__ud2), function, 3
     188        db      066h, 0ebh, -016h       ; jmp (0x000b + 3 - 0x16 = 0xFFFFFFF8 (-8))
     189        int3
     190
     191        align   0x80, int3
     192; 0080
     193BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_wrap_backward__ud2), function, 3
     194        db      0e9h                    ; jmp (0x0080 + 3 - 0x8b = 0xFFFFFFF8 (-8))
     195        dw      -08bh
     196        int3
     197
     198; 0084
     199BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2), function, 3
     200        db      066h, 0e9h              ; jmp (0x0084 + 6 - 0x92 = 0xFFFFFFF8 (-8))
     201        dd      -092h
     202        int3
     203
     204
     205        align   0x100, int3             ; Note! Doesn't work correctly for higher values.
     206        times   (0xff76 - 0x100) int3
     207
     208
     209; ff76
     210BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_wrap_forward__ud2), function, 5
     211        db      0e9h                    ; jmp (0xff76+4 + 0x88 = 0x10002 (65538))
     212        dw      089h
     213        int3
     214
     215; ff7a
     216BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2), function, 7
     217        db      066h, 0e9h              ; o32 jmp (0xff7a+6 + 0x82 = 0x10002 (65538))
     218        dd      082h
     219        int3
     220
     221; ff81
     222BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_wrap_forward__ud2), function, 2
     223        db      0ebh, 07fh              ; jmp (0xff81+2 + 0x7f = 0x10002 (65538))
     224        int3
     225
     226; ff84
     227BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jb_opsize_wrap_forward__ud2), function, 3
     228        db      066h, 0ebh, 07bh        ; o32 jmp (0xff84+3 + 0x7b = 0x10002 (65538))
     229; ff87
     230
     231        times   (0xfff8 - 0xff87) int3
     232
     233; fff8: This is the target for backward wrap around jumps, should they succeed.
     234BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_target_wrap_backward), function, 2
     235        ud2
     236        times   6 int3
     237; End of segment.
     238
    162239BS3_BEGIN_TEXT16
    163240
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac

    r96407 r97431  
    499499
    500500
     501;*********************************************************************************************************************************
     502;*  JMP Tests (simple ones).                                                                                                     *
     503;*********************************************************************************************************************************
     504
     505; jmp rel8 (forwards)
     506BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb__ud2
     507BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jb__ud2, BS3_PBC_NEAR
     508        jmp short .again
     509.post_jmp:
     510        times 7 int3
     511.again: ud2
     512        int3
     513        jmp     .again
     514AssertCompile(.post_jmp - BS3_LAST_LABEL == 2)
     515BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb__ud2
     516
     517
     518; jmp rel8 (backwards)
     519BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb_back__ud2
     520BS3_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:
     526        jmp short .again
     527.post_jmp:
     528        int3
     529AssertCompile(.post_jmp - .start == 2)
     530BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb_back__ud2
     531
     532
     533; jmp rel16 (forwards)
     534BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv__ud2
     535BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jv__ud2, BS3_PBC_NEAR
     536        jmp near .again
     537.post_jmp:
     538        times 9 int3
     539.again: ud2
     540        int3
     541        jmp     .again
     542 %if TMPL_BITS == 16
     543AssertCompile(.post_jmp - BS3_LAST_LABEL == 3)
     544 %else
     545AssertCompile(.post_jmp - BS3_LAST_LABEL == 5)
     546 %endif
     547BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv__ud2
     548
     549
     550; jmp rel16 (backwards)
     551BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_back__ud2
     552BS3_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:
     558        jmp near .again
     559.post_jmp:
     560        int3
     561 %if TMPL_BITS == 16
     562AssertCompile(.post_jmp - .start == 3)
     563 %else
     564AssertCompile(.post_jmp - .start == 5)
     565 %endif
     566BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv_back__ud2
     567
     568
     569;
     570; When applying opsize, we need to put this in the 16-bit text segment to
     571; better control where we end up in 32-bit and 64-bit mode.
     572;
     573; Try keep the code out of the IVT and BIOS data area.  This unfortunately
     574; requires manual padding here.
     575;
     576BS3_BEGIN_TEXT16
     577        BS3_SET_BITS TMPL_BITS
     578%if TMPL_BITS == 32
     579        align   0x100, int3             ; Currently takes us up to 0x400 (max align value is 0x100)
     580        times   0x200 int3              ; Brings us up to 0x600.
     581%endif
     582
     583BS3_GLOBAL_NAME_EX BS3_CMN_NM(bs3CpuBasic2_jmp_opsize_begin), , 1
     584
     585
     586; jmp rel8 (forwards) with opsize override.
     587BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb_opsize__ud2
     588BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jb_opsize__ud2, BS3_PBC_NEAR
     589        db 66h
     590        jmp short .again
     591.post_jmp:
     592        times 8 int3
     593.again: ud2
     594        int3
     595        jmp     .again
     596AssertCompile(.post_jmp - BS3_LAST_LABEL == 3)
     597BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb_opsize__ud2
     598
     599
     600; jmp rel8 (backwards) with opsize override.
     601BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jb_opsize_back__ud2
     602BS3_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
     609        jmp short .again
     610.post_jmp:
     611        int3
     612AssertCompile(.post_jmp - .start == 3)
     613BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jb_opsize_back__ud2
     614
     615
     616; jmp rel16 (forwards) with opsize override.
     617BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_opsize__ud2
     618BS3_PROC_BEGIN_CMN bs3CpuBasic2_jmp_jv_opsize__ud2, BS3_PBC_NEAR
     619        db 66h, 0e9h                    ; o32 jmp near .again
     620 %if TMPL_BITS != 32
     621        dd 11
     622 %else
     623        dw 11
     624 %endif
     625.post_jmp:
     626        times 11 int3
     627.again: ud2
     628        int3
     629        jmp     .again
     630BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv_opsize__ud2
     631
     632
     633; jmp rel16 (backwards) with opsize override.
     634BS3_CPUBAS2_UD_OFF bs3CpuBasic2_jmp_jv_opsize_back__ud2
     635BS3_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:
     641 %if TMPL_BITS != 32
     642        db      66h, 0e9h               ; o32 jmp near .again
     643        dd      -(6 + 1 + 2 + 2)
     644 %else
     645        db      66h, 0e9h               ; o16 jmp near .again
     646        dw      -(4 + 1 + 2 + 2)
     647 %endif
     648.post_jmp:
     649        times 11 int3
     650BS3_PROC_END_CMN   bs3CpuBasic2_jmp_jv_opsize_back__ud2
     651
     652
     653BS3_GLOBAL_NAME_EX BS3_CMN_NM(bs3CpuBasic2_jmp_opsize_end), , 1
     654        int3
     655
     656
    501657%endif ; BS3_INSTANTIATING_CMN
    502658
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r96407 r97431  
    36203620}
    36213621
     3622
     3623
     3624/*********************************************************************************************************************************
     3625*   JMP Tests                                                                                                                    *
     3626*********************************************************************************************************************************/
     3627#define PROTO_ALL(a_Template) \
     3628    FNBS3FAR a_Template ## _c16, \
     3629             a_Template ## _c32, \
     3630             a_Template ## _c64
     3631PROTO_ALL(bs3CpuBasic2_jmp_jb__ud2);
     3632PROTO_ALL(bs3CpuBasic2_jmp_jb_back__ud2);
     3633PROTO_ALL(bs3CpuBasic2_jmp_jv__ud2);
     3634PROTO_ALL(bs3CpuBasic2_jmp_jv_back__ud2);
     3635
     3636PROTO_ALL(bs3CpuBasic2_jmp_opsize_begin);
     3637PROTO_ALL(bs3CpuBasic2_jmp_jb_opsize__ud2);
     3638PROTO_ALL(bs3CpuBasic2_jmp_jb_opsize_back__ud2);
     3639PROTO_ALL(bs3CpuBasic2_jmp_jv_opsize__ud2);
     3640PROTO_ALL(bs3CpuBasic2_jmp_jv_opsize_back__ud2);
     3641PROTO_ALL(bs3CpuBasic2_jmp_opsize_end);
     3642#undef PROTO_ALL
     3643
     3644FNBS3FAR bs3CpuBasic2_jmptext16_start;
     3645
     3646FNBS3FAR bs3CpuBasic2_jmp_target_wrap_forward;
     3647FNBS3FAR bs3CpuBasic2_jmp_jb_wrap_forward__ud2;
     3648FNBS3FAR bs3CpuBasic2_jmp_jb_opsize_wrap_forward__ud2;
     3649FNBS3FAR bs3CpuBasic2_jmp_jv16_wrap_forward__ud2;
     3650FNBS3FAR bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2;
     3651
     3652FNBS3FAR bs3CpuBasic2_jmp_target_wrap_backward;
     3653FNBS3FAR bs3CpuBasic2_jmp_jb_wrap_backward__ud2;
     3654FNBS3FAR bs3CpuBasic2_jmp_jb_opsize_wrap_backward__ud2;
     3655FNBS3FAR bs3CpuBasic2_jmp_jv16_wrap_backward__ud2;
     3656FNBS3FAR bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2;
     3657
     3658
     3659
     3660/**
     3661 * Entrypoint for JMP tests.
     3662 *
     3663 * @returns 0 or BS3TESTDOMODE_SKIPPED.
     3664 * @param   bMode       The CPU mode we're testing.
     3665 *
     3666 * @note    When testing v8086 code, we'll be running in v8086 mode. So, careful
     3667 *          with control registers and such.
     3668 */
     3669BS3_DECL_FAR(uint8_t) BS3_CMN_FAR_NM(bs3CpuBasic2_jmp)(uint8_t bMode)
     3670{
     3671    BS3TRAPFRAME        TrapCtx;
     3672    BS3REGCTX           Ctx;
     3673    BS3REGCTX           CtxExpected;
     3674    unsigned            iTest;
     3675
     3676    /* make sure they're allocated  */
     3677    Bs3MemZero(&Ctx, sizeof(Ctx));
     3678    Bs3MemZero(&CtxExpected, sizeof(Ctx));
     3679    Bs3MemZero(&TrapCtx, sizeof(TrapCtx));
     3680
     3681    bs3CpuBasic2_SetGlobals(bMode);
     3682if (bMode != BS3_MODE_LM64) return BS3TESTDOMODE_SKIPPED; // temp
     3683
     3684    /*
     3685     * Create a context.
     3686     */
     3687    Bs3RegCtxSaveEx(&Ctx, bMode, 768);
     3688    Bs3MemCpy(&CtxExpected, &Ctx, sizeof(CtxExpected));
     3689
     3690    /*
     3691     * 16-bit tests.
     3692     *
     3693     * When opsize is 16-bit relative jumps will do 16-bit calculations and
     3694     * modify IP.  This means that it is not possible to trigger a segment
     3695     * limit #GP(0) when the limit is set to 0xffff.
     3696     */
     3697    if (BS3_MODE_IS_16BIT_CODE(bMode))
     3698    {
     3699        static struct
     3700        {
     3701            int8_t      iWrap;
     3702            bool        fOpSizePfx;
     3703            FPFNBS3FAR  pfnTest;
     3704        }
     3705        const s_aTests[] =
     3706        {
     3707            {  0, false, bs3CpuBasic2_jmp_jb__ud2_c16,                  },
     3708            {  0, false, bs3CpuBasic2_jmp_jb_back__ud2_c16,             },
     3709            {  0,  true, bs3CpuBasic2_jmp_jb_opsize__ud2_c16,           },
     3710            {  0,  true, bs3CpuBasic2_jmp_jb_opsize_back__ud2_c16,      },
     3711            {  0, false, bs3CpuBasic2_jmp_jv__ud2_c16,                  },
     3712            {  0, false, bs3CpuBasic2_jmp_jv_back__ud2_c16,             },
     3713            {  0,  true, bs3CpuBasic2_jmp_jv_opsize__ud2_c16,           },
     3714            {  0,  true, bs3CpuBasic2_jmp_jv_opsize_back__ud2_c16,      },
     3715
     3716            { -1, false, bs3CpuBasic2_jmp_jb_wrap_backward__ud2,        },
     3717            { +1, false, bs3CpuBasic2_jmp_jb_wrap_forward__ud2,         },
     3718            { -1,  true, bs3CpuBasic2_jmp_jb_opsize_wrap_backward__ud2, },
     3719            { +1,  true, bs3CpuBasic2_jmp_jb_opsize_wrap_forward__ud2,  },
     3720
     3721            { -1, false, bs3CpuBasic2_jmp_jv16_wrap_backward__ud2,        },
     3722            { +1, false, bs3CpuBasic2_jmp_jv16_wrap_forward__ud2,         },
     3723            { -1,  true, bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2, },
     3724            { +1,  true, bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2,  },
     3725        };
     3726
     3727        if (!BS3_MODE_IS_RM_OR_V86(bMode))
     3728            Bs3SelSetup16BitCode(&Bs3GdteSpare03, Bs3SelLnkPtrToFlat(bs3CpuBasic2_jmptext16_start), 0);
     3729
     3730        for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     3731        {
     3732            if (s_aTests[iTest].iWrap == 0)
     3733            {
     3734                uint8_t const BS3_FAR *fpbCode;
     3735                Bs3RegCtxSetRipCsFromLnkPtr(&Ctx, s_aTests[iTest].pfnTest);
     3736                fpbCode = (uint8_t const BS3_FAR *)BS3_FP_MAKE(Ctx.cs, Ctx.rip.u16);
     3737                CtxExpected.rip.u = Ctx.rip.u + fpbCode[-1];
     3738            }
     3739            else
     3740            {
     3741                if (BS3_MODE_IS_RM_OR_V86(bMode))
     3742                    Ctx.cs = BS3_FP_SEG(s_aTests[iTest].pfnTest);
     3743                else
     3744                    Ctx.cs = BS3_SEL_SPARE_03;
     3745                Ctx.rip.u  = BS3_FP_OFF(s_aTests[iTest].pfnTest);
     3746                if (s_aTests[iTest].fOpSizePfx)
     3747                    CtxExpected.rip.u = Ctx.rip.u;
     3748                else if (s_aTests[iTest].iWrap < 0)
     3749                    CtxExpected.rip.u = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward);
     3750                else
     3751                    CtxExpected.rip.u = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_forward);
     3752            }
     3753            CtxExpected.cs = Ctx.cs;
     3754Bs3TestPrintf("cs:rip=%04RX16:%04RX64\n", Ctx.cs, Ctx.rip.u);
     3755
     3756            Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3757
     3758            if (s_aTests[iTest].iWrap == 0 || !s_aTests[iTest].fOpSizePfx)
     3759                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxExpected);
     3760            else
     3761                bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, 0);
     3762
     3763            g_usBs3TestStep++;
     3764        }
     3765
     3766        /* Limit the wraparound CS segment to exlcude bs3CpuBasic2_jmp_target_wrap_backward
     3767           and run the backward wrapping tests. */
     3768        if (!BS3_MODE_IS_RM_OR_V86(bMode))
     3769        {
     3770            Bs3GdteSpare03.Gen.u16LimitLow = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward) - 1;
     3771            CtxExpected.cs = Ctx.cs = BS3_SEL_SPARE_03;
     3772            for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     3773                if (s_aTests[iTest].iWrap < 0)
     3774                {
     3775                    CtxExpected.rip.u = Ctx.rip.u = BS3_FP_OFF(s_aTests[iTest].pfnTest);
     3776Bs3TestPrintf("cs:rip=%04RX16:%04RX64 v1\n", Ctx.cs, Ctx.rip.u);
     3777                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3778                    bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, 0);
     3779                    g_usBs3TestStep++;
     3780                }
     3781
     3782            /* Do another round where we put the limit in the middle of the UD2
     3783               instruction we're jumping to: */
     3784            Bs3GdteSpare03.Gen.u16LimitLow = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward);
     3785            for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     3786                if (s_aTests[iTest].iWrap < 0)
     3787                {
     3788                    Ctx.rip.u = BS3_FP_OFF(s_aTests[iTest].pfnTest);
     3789                    if (s_aTests[iTest].fOpSizePfx)
     3790                        CtxExpected.rip.u = Ctx.rip.u;
     3791                    else
     3792                        CtxExpected.rip.u = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward);
     3793Bs3TestPrintf("cs:rip=%04RX16:%04RX64 v2\n", Ctx.cs, Ctx.rip.u);
     3794                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3795                    bs3CpuBasic2_CompareGpCtx(&TrapCtx, &CtxExpected, 0);
     3796                    g_usBs3TestStep++;
     3797                }
     3798        }
     3799
     3800    }
     3801    /*
     3802     * 32-bit & 64-bit tests.
     3803     */
     3804    else
     3805    {
     3806        static struct
     3807        {
     3808            uint8_t     cBits;
     3809            bool        fOpSizePfx;
     3810            FPFNBS3FAR  pfnTest;
     3811        }
     3812        const s_aTests[] =
     3813        {
     3814            {  32, false, bs3CpuBasic2_jmp_jb__ud2_c32,                  },
     3815            {  32, false, bs3CpuBasic2_jmp_jb_back__ud2_c32,             },
     3816            {  32,  true, bs3CpuBasic2_jmp_jb_opsize__ud2_c32,           },
     3817            {  32,  true, bs3CpuBasic2_jmp_jb_opsize_back__ud2_c32,      },
     3818            {  32, false, bs3CpuBasic2_jmp_jv__ud2_c32,                  },
     3819            {  32, false, bs3CpuBasic2_jmp_jv_back__ud2_c32,             },
     3820            {  32,  true, bs3CpuBasic2_jmp_jv_opsize__ud2_c32,           },
     3821            {  32,  true, bs3CpuBasic2_jmp_jv_opsize_back__ud2_c32,      },
     3822            /* 64bit: */
     3823            {  64, false, bs3CpuBasic2_jmp_jb__ud2_c64,                  },
     3824            {  64, false, bs3CpuBasic2_jmp_jb_back__ud2_c64,             },
     3825            {  64,  true, bs3CpuBasic2_jmp_jb_opsize__ud2_c64,           },
     3826            {  64,  true, bs3CpuBasic2_jmp_jb_opsize_back__ud2_c64,      },
     3827            {  64, false, bs3CpuBasic2_jmp_jv__ud2_c64,                  },
     3828            {  64, false, bs3CpuBasic2_jmp_jv_back__ud2_c64,             },
     3829            {  64,  true, bs3CpuBasic2_jmp_jv_opsize__ud2_c64,           },
     3830            {  64,  true, bs3CpuBasic2_jmp_jv_opsize_back__ud2_c64,      },
     3831        };
     3832        uint8_t const           cBits    = BS3_MODE_IS_64BIT_CODE(bMode) ? 64 : 32;
     3833
     3834        /* Prepare a copy of the UD2 instructions in low memory for opsize prefixed tests. */
     3835        uint16_t const          offLow   = BS3_FP_OFF(bs3CpuBasic2_jmp_opsize_begin_c32);
     3836        uint16_t const          cbLow    = BS3_FP_OFF(bs3CpuBasic2_jmp_opsize_end_c64) - offLow;
     3837        uint8_t BS3_FAR * const pbCode16 = BS3_MAKE_PROT_R0PTR_FROM_FLAT(BS3_ADDR_BS3TEXT16);
     3838        uint8_t BS3_FAR * const pbLow    = BS3_FP_MAKE(BS3_SEL_TILED_R0, 0);
     3839        if (offLow < 0x600 || offLow + cbLow >= BS3_ADDR_STACK_R2)
     3840            Bs3TestFailedF("Opsize overriden jumps are out of place: %#x LB %#z\n", offLow, cbLow);
     3841        Bs3MemSet(&pbLow[offLow], 0xcc /*int3*/, cbLow);
     3842        if (cBits != 64) /** @todo wtf? Intel 10980xe doesn't clear RIP[63:16] for short jumps with o16 prefix. */
     3843        {
     3844            for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     3845                if (s_aTests[iTest].fOpSizePfx && s_aTests[iTest].cBits == cBits)
     3846                {
     3847                    uint16_t const offFn = BS3_FP_OFF(s_aTests[iTest].pfnTest);
     3848                    uint16_t const offUd = offFn + pbCode16[offFn - 1];
     3849                    pbCode16[offUd]     = 0xf1; /* replace original ud2 with icebp */
     3850                    pbCode16[offUd + 1] = 0xf1;
     3851                    pbLow[offUd]        = 0x0f; /* plant ud2 in low memory */
     3852                    pbLow[offUd + 1]    = 0x0b;
     3853                }
     3854        }
     3855
     3856        /* Run the tests. */
     3857        for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
     3858        {
     3859            if (s_aTests[iTest].cBits == cBits)
     3860            {
     3861                uint8_t const BS3_FAR *fpbCode = Bs3SelLnkPtrToCurPtr(s_aTests[iTest].pfnTest);
     3862                Ctx.rip.u = Bs3SelLnkPtrToFlat(s_aTests[iTest].pfnTest);
     3863                CtxExpected.rip.u = Ctx.rip.u + fpbCode[-1];
     3864                if (s_aTests[iTest].fOpSizePfx && cBits != 64)
     3865                    CtxExpected.rip.u &= UINT16_MAX;
     3866Bs3TestPrintf("cs:rip=%04RX16:%08RX64\n", Ctx.cs, Ctx.rip.u);
     3867
     3868                if (BS3_MODE_IS_16BIT_SYS(bMode))
     3869                    g_uBs3TrapEipHint = s_aTests[iTest].fOpSizePfx ? 0 : Ctx.rip.u32;
     3870                Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     3871
     3872                bs3CpuBasic2_CompareUdCtx(&TrapCtx, &CtxExpected);
     3873                g_usBs3TestStep++;
     3874            }
     3875        }
     3876
     3877        Bs3MemSet(&pbLow[offLow], 0xcc /*int3*/, cbLow);
     3878    }
     3879
     3880    return 0;
     3881}
     3882
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.c

    r97424 r97431  
    5555FNBS3TESTDOMODE             bs3CpuBasic2_lgdt_f16;
    5656FNBS3TESTDOMODE             bs3CpuBasic2_iret_f16;
     57FNBS3TESTDOMODE             bs3CpuBasic2_jmp_f16;
    5758
    5859BS3_DECL_CALLBACK(void)     bs3CpuBasic2_Do32BitTests_pe32();
     
    7071static const BS3TESTMODEBYONEENTRY g_aModeByOneTests[] =
    7172{
     73#if 0
    7274    { "#ac",  bs3CpuBasic2_RaiseXcpt11_f16, 0 },
     75#endif
    7376#if 1
    74     { "iret", bs3CpuBasic2_iret_f16, 0 },
     77    //{ "iret", bs3CpuBasic2_iret_f16, 0 },
     78    { "jmp",  bs3CpuBasic2_jmp_f16, 0 },
     79#endif
     80#if 0
    7581    { "sidt", bs3CpuBasic2_sidt_f16, 0 },
    7682    { "sgdt", bs3CpuBasic2_sgdt_f16, 0 },
     
    9197     */
    9298    NOREF(g_aModeTest); NOREF(g_aModeByOneTests); /* for when commenting out bits */
     99#if 0
    93100    Bs3TestDoModes_rm(g_aModeTest, RT_ELEMENTS(g_aModeTest));
     101#endif
    94102    Bs3TestDoModesByOne_rm(g_aModeByOneTests, RT_ELEMENTS(g_aModeByOneTests), 0);
    95 #if 1
     103#if 0
    96104
    97105    /*
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