VirtualBox

Changeset 97489 in vbox


Ignore:
Timestamp:
Nov 9, 2022 9:15:54 PM (2 years ago)
Author:
vboxsync
Message:

ValKit/bs3-cpu-basic-2: Added tests for the indirect call 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-asm.asm

    r97431 r97489  
    197197
    198198; 0084
    199 BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2), function, 3
     199BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2), function, 6
    200200        db      066h, 0e9h              ; jmp (0x0084 + 6 - 0x92 = 0xFFFFFFF8 (-8))
    201201        dd      -092h
    202202        int3
    203203
     204; 008b
     205BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_wrap_backward__ud2), function, 3
     206        db      0e8h                    ; call (0x008b + 3 - 0x96)
     207        dw      -096h
     208        int3
     209
     210; 008f
     211BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_opsize_wrap_backward__ud2), function, 6
     212        db      066h, 0e8h              ; call (0x008f + 6 - 0x9d = 0xFFFFFFF8 (-8))
     213        dd      -09dh
     214        int3
     215
    204216
    205217        align   0x100, int3             ; Note! Doesn't work correctly for higher values.
    206         times   (0xff76 - 0x100) int3
    207 
     218        times   (0xff6b - 0x100) int3
     219
     220; ff6b
     221BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_wrap_forward__ud2), function, 4
     222        db      0e8h                    ; call (0xff6b+3 + 0x94 = 0x10002 (65538))
     223        dw      094h
     224        int3
     225
     226; ff6f
     227BS3_GLOBAL_NAME_EX NAME(bs3CpuBasic2_call_jv16_opsize_wrap_forward__ud2), function, 7
     228        db      066h, 0e8h              ; o32 call (0xff6f+6 + 0x8d = 0x10002 (65538))
     229        dd      08dh
     230        int3
    208231
    209232; ff76
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac

    r97477 r97489  
    657657BS3_PROC_END_CMN   bs3CpuBasic2_call_jv_back__ud2
    658658
     659; call [indirect]
     660BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_mem__ud2
     661BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_mem__ud2, BS3_PBC_NEAR
     662%if TMPL_BITS == 16
     663        call    [word cs:.npAgain]
     664%elif TMPL_BITS == 32
     665        call    [dword cs:.npAgain]
     666%else
     667        call    [.npAgain]
     668%endif
     669.post_call:
     670        times 9 int3
     671.npAgain:
     672 %if TMPL_BITS == 16
     673        dw    BS3_TEXT16_WRT(.again)
     674 %else
     675        dd    .again wrt FLAT
     676  %if TMPL_BITS == 64
     677        dd    0
     678  %endif
     679 %endif
     680.again: ud2
     681        int3
     682        jmp     .again
     683BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_mem__ud2
     684
     685; call [xAX]
     686BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_xAX__ud2
     687BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_xAX__ud2, BS3_PBC_NEAR
     688        call    xAX
     689.post_call:
     690        times 17 int3
     691.again: ud2
     692        int3
     693        jmp     .again
     694BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_xAX__ud2
     695
     696; call [xDI]
     697BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_xDI__ud2
     698BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_xDI__ud2, BS3_PBC_NEAR
     699        call    xDI
     700.post_call:
     701        times 17 int3
     702.again: ud2
     703        int3
     704        jmp     .again
     705BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_xDI__ud2
     706
     707 %if TMPL_BITS == 64
     708; call [xAX]
     709BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_r9__ud2
     710BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_r9__ud2, BS3_PBC_NEAR
     711        call    r9
     712.post_call:
     713        times 17 int3
     714.again: ud2
     715        int3
     716        jmp     .again
     717BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_r9__ud2
     718 %endif
     719
    659720
    660721;
     
    831892BS3_PROC_END_CMN   bs3CpuBasic2_call_jv_opsize_back__ud2
    832893
     894; call [indirect]
     895BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_mem_opsize__ud2
     896BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_mem_opsize__ud2, BS3_PBC_NEAR
     897        db      66h
     898 %if TMPL_BITS == 16
     899        call    [word cs:.npAgain]
     900 %elif TMPL_BITS == 32
     901        call    [dword cs:.npAgain wrt FLAT]
     902 %else
     903        call    [.npAgain wrt FLAT]
     904 %endif
     905.post_call:
     906        times 9 int3
     907.npAgain:
     908 %if TMPL_BITS == 16
     909        dw      BS3_TEXT16_WRT(.again)
     910        dw      0
     911 %else
     912        dw      .again wrt CGROUP16
     913        dw      0faceh, 0f00dh, 07777h  ; non-canonical address
     914 %endif
     915.again: ud2
     916        int3
     917        jmp     .again
     918BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_mem_opsize__ud2
     919
     920 %if TMPL_BITS == 64
     921; call [indirect] - 64-bit intel version
     922BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_mem_opsize__ud2__intel
     923BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_mem_opsize__ud2__intel, BS3_PBC_NEAR
     924        db      66h
     925        call    [.npAgain wrt FLAT]
     926.post_call:
     927        times 8 int3
     928.npAgain:
     929        dd      .again wrt FLAT
     930        dd      0
     931.again: ud2
     932        int3
     933        jmp     .again
     934BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_mem_opsize__ud2__intel
     935 %endif
     936
     937; call [xAX]
     938BS3_CPUBAS2_UD_OFF bs3CpuBasic2_call_ind_xAX_opsize__ud2
     939BS3_PROC_BEGIN_CMN bs3CpuBasic2_call_ind_xAX_opsize__ud2, BS3_PBC_NEAR
     940        db      66h
     941        call    xAX
     942.post_call:
     943        times 8 int3
     944.again: ud2
     945        int3
     946        jmp     .again
     947BS3_PROC_END_CMN   bs3CpuBasic2_call_ind_xAX_opsize__ud2
     948
    833949
    834950%endif ; BS3_INSTANTIATING_CMN
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-x0.c

    r97477 r97489  
    36483648PROTO_ALL(bs3CpuBasic2_call_jv__ud2);
    36493649PROTO_ALL(bs3CpuBasic2_call_jv_back__ud2);
     3650PROTO_ALL(bs3CpuBasic2_call_ind_mem__ud2);
     3651PROTO_ALL(bs3CpuBasic2_call_ind_xAX__ud2);
     3652PROTO_ALL(bs3CpuBasic2_call_ind_xDI__ud2);
     3653FNBS3FAR  bs3CpuBasic2_call_ind_r9__ud2_c64;
    36503654
    36513655PROTO_ALL(bs3CpuBasic2_jmp_opsize_begin);
     
    36593663PROTO_ALL(bs3CpuBasic2_call_jv_opsize__ud2);
    36603664PROTO_ALL(bs3CpuBasic2_call_jv_opsize_back__ud2);
     3665PROTO_ALL(bs3CpuBasic2_call_ind_mem_opsize__ud2);
     3666FNBS3FAR  bs3CpuBasic2_call_ind_mem_opsize__ud2__intel_c64;
     3667PROTO_ALL(bs3CpuBasic2_call_ind_xAX_opsize__ud2);
    36613668PROTO_ALL(bs3CpuBasic2_jmp_opsize_end);
    36623669#undef PROTO_ALL
     
    36693676FNBS3FAR bs3CpuBasic2_jmp_jv16_wrap_forward__ud2;
    36703677FNBS3FAR bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2;
     3678FNBS3FAR bs3CpuBasic2_call_jv16_wrap_forward__ud2;
     3679FNBS3FAR bs3CpuBasic2_call_jv16_opsize_wrap_forward__ud2;
    36713680
    36723681FNBS3FAR bs3CpuBasic2_jmp_target_wrap_backward;
     
    36753684FNBS3FAR bs3CpuBasic2_jmp_jv16_wrap_backward__ud2;
    36763685FNBS3FAR bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2;
     3686FNBS3FAR bs3CpuBasic2_call_jv16_wrap_backward__ud2;
     3687FNBS3FAR bs3CpuBasic2_call_jv16_opsize_wrap_backward__ud2;
    36773688
    36783689
     
    37433754            {  0,  true,           -1,  true, bs3CpuBasic2_call_jv_opsize__ud2_c16,             },
    37443755            {  0,  true,           -1,  true, bs3CpuBasic2_call_jv_opsize_back__ud2_c16,        },
     3756            {  0, false,           -1,  true, bs3CpuBasic2_call_ind_mem__ud2_c16,               },
     3757            {  0,  true,           -1,  true, bs3CpuBasic2_call_ind_mem_opsize__ud2_c16,        },
     3758            {  0, false, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX__ud2_c16,               },
     3759            {  0, false, X86_GREG_xDI,  true, bs3CpuBasic2_call_ind_xDI__ud2_c16,               },
     3760            {  0,  true, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX_opsize__ud2_c16,        },
    37453761
    37463762            { -1, false,           -1, false, bs3CpuBasic2_jmp_jb_wrap_backward__ud2,           },
     
    37533769            { -1,  true,           -1, false, bs3CpuBasic2_jmp_jv16_opsize_wrap_backward__ud2,  },
    37543770            { +1,  true,           -1, false, bs3CpuBasic2_jmp_jv16_opsize_wrap_forward__ud2,   },
     3771            { -1, false,           -1,  true, bs3CpuBasic2_call_jv16_wrap_backward__ud2,        },
     3772            { +1, false,           -1,  true, bs3CpuBasic2_call_jv16_wrap_forward__ud2,         },
     3773            { -1,  true,           -1,  true, bs3CpuBasic2_call_jv16_opsize_wrap_backward__ud2, },
     3774            { +1,  true,           -1,  true, bs3CpuBasic2_call_jv16_opsize_wrap_forward__ud2,  },
    37553775        };
    37563776
     
    38213841        }
    38223842
    3823         /* Limit the wraparound CS segment to exlcude bs3CpuBasic2_jmp_target_wrap_backward
     3843        /* Limit the wraparound CS segment to exclude bs3CpuBasic2_jmp_target_wrap_backward
    38243844           and run the backward wrapping tests. */
    38253845        if (!BS3_MODE_IS_RM_OR_V86(bMode))
    38263846        {
    38273847            Bs3GdteSpare03.Gen.u16LimitLow = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward) - 1;
    3828             CtxExpected.cs = Ctx.cs = BS3_SEL_SPARE_03;
     3848            CtxExpected.cs    = Ctx.cs = BS3_SEL_SPARE_03;
     3849            CtxExpected.rsp.u = Ctx.rsp.u;
    38293850            for (iTest = 0; iTest < RT_ELEMENTS(s_aTests); iTest++)
    38303851                if (s_aTests[iTest].iWrap < 0)
     
    38483869                    else
    38493870                        CtxExpected.rip.u = BS3_FP_OFF(bs3CpuBasic2_jmp_target_wrap_backward);
     3871                    CtxExpected.rsp.u = Ctx.rsp.u;
     3872                    if (s_aTests[iTest].fCall && (s_aTests[iTest].iWrap == 0 || !s_aTests[iTest].fOpSizePfx))
     3873                        CtxExpected.rsp.u -= s_aTests[iTest].fOpSizePfx ? 4 : 2;
    38503874                    //Bs3TestPrintf("cs:rip=%04RX16:%04RX64 v2\n", Ctx.cs, Ctx.rip.u);
    38513875                    Bs3TrapSetJmpAndRestore(&Ctx, &TrapCtx);
     
    38933917            {  32,  true, false,           -1,  true, bs3CpuBasic2_call_jv_opsize__ud2_c32,            },
    38943918            {  32,  true, false,           -1,  true, bs3CpuBasic2_call_jv_opsize_back__ud2_c32,       },
     3919            {  32, false, false,           -1,  true, bs3CpuBasic2_call_ind_mem__ud2_c32,              },
     3920            {  32,  true, false,           -1,  true, bs3CpuBasic2_call_ind_mem_opsize__ud2_c32,       },
     3921            {  32, false, false, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX__ud2_c32,              },
     3922            {  32, false, false, X86_GREG_xDI,  true, bs3CpuBasic2_call_ind_xDI__ud2_c32,              },
     3923            {  32,  true, false, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX_opsize__ud2_c32,       },
    38953924            /* 64bit/Intel: Use the _c64 tests, which are written to ignore the o16 prefix. */
    38963925            {  64, false,  true,           -1, false, bs3CpuBasic2_jmp_jb__ud2_c64,                    },
     
    39123941            {  64,  true,  true,           -1,  true, bs3CpuBasic2_call_jv_opsize__ud2_c64,            },
    39133942            {  64,  true,  true,           -1,  true, bs3CpuBasic2_call_jv_opsize_back__ud2_c64,       },
     3943            {  64, false,  true,           -1,  true, bs3CpuBasic2_call_ind_mem__ud2_c64,              },
     3944            {  64,  true,  true,           -1,  true, bs3CpuBasic2_call_ind_mem_opsize__ud2__intel_c64,},
     3945            {  64, false,  true, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX__ud2_c64,              },
     3946            {  64, false,  true, X86_GREG_xDI,  true, bs3CpuBasic2_call_ind_xDI__ud2_c64,              },
     3947            {  64, false,  true, X86_GREG_x9,   true, bs3CpuBasic2_call_ind_r9__ud2_c64,               },
     3948            {  64,  true,  true, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX_opsize__ud2_c64,       }, /* no intel version needed */
    39143949            /* 64bit/AMD: Use the _c32 tests. */
    39153950            {  64, false, false,           -1, false, bs3CpuBasic2_jmp_jb__ud2_c32,                    },
     
    39223957            {  64,  true, false,           -1, false, bs3CpuBasic2_jmp_jv_opsize_back__ud2_c32,        },
    39233958            {  64, false, false,           -1, false, bs3CpuBasic2_jmp_ind_mem__ud2_c64,               }, /* using c64 here */
    3924             {  64,  true, false,           -1, false, bs3CpuBasic2_jmp_ind_mem_opsize__ud2_c64,        }, /* using c64 here */
     3959            {  64,  true, false,           -1, false, bs3CpuBasic2_jmp_ind_mem_opsize__ud2_c64,        }, /* ditto */
    39253960            {  64, false, false, X86_GREG_xAX, false, bs3CpuBasic2_jmp_ind_xAX__ud2_c64,               }, /* ditto */
    39263961            {  64, false, false, X86_GREG_xDI, false, bs3CpuBasic2_jmp_ind_xDI__ud2_c64,               }, /* ditto */
     
    39313966            {  64,  true, false,           -1,  true, bs3CpuBasic2_call_jv_opsize__ud2_c32,            },
    39323967            {  64,  true, false,           -1,  true, bs3CpuBasic2_call_jv_opsize_back__ud2_c32,       },
     3968            {  64, false, false,           -1,  true, bs3CpuBasic2_call_ind_mem__ud2_c64,              }, /* using c64 here */
     3969            {  64,  true, false,           -1,  true, bs3CpuBasic2_call_ind_mem_opsize__ud2_c64,       }, /* ditto */
     3970            {  64, false, false, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX__ud2_c64,              }, /* ditto */
     3971            {  64, false, false, X86_GREG_xDI,  true, bs3CpuBasic2_call_ind_xDI__ud2_c64,              }, /* ditto */
     3972            {  64, false, false, X86_GREG_x9,   true, bs3CpuBasic2_call_ind_r9__ud2_c64,               }, /* ditto */
     3973            {  64,  true, false, X86_GREG_xAX,  true, bs3CpuBasic2_call_ind_xAX_opsize__ud2_c64,       }, /* ditto */
    39333974        };
    39343975        uint8_t const           cBits    = BS3_MODE_IS_64BIT_CODE(bMode) ? 64 : 32;
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