VirtualBox

Changeset 60002 in vbox


Ignore:
Timestamp:
Mar 11, 2016 11:17:47 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
105975
Message:

bs3kit: got the weird v8086 w/ 16-bit tss and trap handlers working.

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

Legend:

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

    r59941 r60002  
    3232
    3333
    34 FNBS3TESTDOMODE               bs3CpuBasic2_iret_c16;
    35 FNBS3TESTDOMODE BS3_FAR_CODE  bs3CpuBasic2_iret_c32;
    36 FNBS3TESTDOMODE BS3_FAR_CODE  bs3CpuBasic2_iret_c64;
    37 #pragma alias("_bs3CpuBasic2_iret_c64", "bs3CpuBasic2_iret_c64")
     34//BS3TESTMODE_PROTOTYPES_CMN(bs3CpuBasic2_iret);
     35//#pragma alias("_bs3CpuBasic2_iret_c64", "bs3CpuBasic2_iret_c64")
    3836
     37BS3TESTMODE_PROTOTYPES_MODE(bs3CpuBasic2_iret);
     38#pragma alias("_bs3CpuBasic2_iret_lm64", "bs3CpuBasic2_iret_lm64")
    3939
    4040static const BS3TESTMODEENTRY g_aModeTest[] =
    4141{
    42     BS3TESTMODEENTRY_CMN("iret", bs3CpuBasic2_iret),
     42    //BS3TESTMODEENTRY_CMN("iret", bs3CpuBasic2_iret),
     43    BS3TESTMODEENTRY_MODE("iret", bs3CpuBasic2_iret),
    4344};
    4445
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-template.mac

    r60001 r60002  
    1313
    1414
    15 BS3_PROC_BEGIN_CMN bs3CpuBasic2_iret
     15BS3_PROC_BEGIN_MODE bs3CpuBasic2_iret
    1616        BS3_CALL_CONV_PROLOG 1
    1717        push    xBP
     
    4646.szMsg: db 'hello world %#x!', 13, 10, 0
    4747
    48 BS3_PROC_END_CMN   bs3CpuBasic2_iret
     48BS3_PROC_END_MODE   bs3CpuBasic2_iret
    4949
    5050
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2.asm

    r59866 r60002  
    3232
    3333
    34 BS3_INSTANTIATE_COMMON_TEMPLATE "bs3-cpu-basic-2-template.mac"
     34;BS3_INSTANTIATE_COMMON_TEMPLATE "bs3-cpu-basic-2-template.mac"
     35BS3_INSTANTIATE_TEMPLATE_WITH_WEIRD_ONES "bs3-cpu-basic-2-template.mac"
    3536
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c16-Trap16Generic.asm

    r60000 r60002  
    5656
    5757
     58TMPL_BEGIN_TEXT
    5859
    5960;;
     
    6465%macro Bs3Trap16GenericEntry 1
    6566        db      06ah, i                 ; push imm8 - note that this is a signextended value.
    66         hlt
    6767        jmp     %1
    6868        ALIGNCODE(8)
     
    133133        push    0
    134134        dec     bx
    135         jz      .more_zeroed_space
     135        jnz     .more_zeroed_space
    136136        movzx   ebx, sp
    137137
     
    175175        push    0
    176176        dec     bx
    177         jz      .more_zeroed_space
     177        jnz     .more_zeroed_space
    178178        mov     bx, sp
    179179
     
    219219        push    0
    220220        dec     bx
    221         jz      .more_zeroed_space
     221        jnz     .more_zeroed_space
    222222        movzx   ebx, sp
    223223
     
    264264        push    0
    265265        dec     bx
    266         jz      .more_zeroed_space
     266        jnz     .more_zeroed_space
    267267        mov     bx, sp
    268268
     
    293293; Common context saving code and dispatching.
    294294;
    295 ; @param    bx      Pointer to the trap frame.  The following members have been
    296 ;                   filled in by the previous code:
     295; @param    bx      Pointer to the trap frame, zero filled.  The following members
     296;                   have been filled in by the previous code:
    297297;                       - bXcpt
    298298;                       - uErrCd
     
    306306; @param    bp      Pointer to the word before the iret frame, i.e. where bp
    307307;                   would be saved if this was a normal near call.
    308 ; @param    dx      zero (0) if 286, set (1) if 386
     308; @param    dx      One (1) if 286, zero (0) if 386+.
    309309;
    310310BS3_PROC_BEGIN bs3Trap16GenericCommon
     
    320320        ;
    321321        test    dx, dx
    322         jz      .save_word_grps
     322        jnz     .save_word_grps
    323323CPU 386
    324324        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rcx], ecx
     
    326326        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsi], esi
    327327        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], esp ; high word
     328        mov     ecx, [ss:bx + BS3TRAPFRAME.fHandlerRfl]
     329        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rflags], ecx
    328330        jmp     .save_segment_registers
    329331.save_word_grps:
     
    359361        mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    360362        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.bMode], al
    361         and     al, ~BS3_MODE_CODE_MASK
    362         or      al, BS3_MODE_CODE_32
    363         mov     [BS3_DATA16_WRT(g_bBs3CurrentMode)], al
     363        mov     cl, al
     364        and     cl, ~BS3_MODE_CODE_MASK
     365        or      cl, BS3_MODE_CODE_16
     366        mov     [BS3_DATA16_WRT(g_bBs3CurrentMode)], cl
    364367
    365368        ;
     
    373376        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cs], cx
    374377
    375         mov     al, [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.bMode]
    376378        and     al, BS3_MODE_CODE_MASK
    377379        cmp     al, BS3_MODE_CODE_V86
     
    389391        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.ss], cx
    390392        test    dx, dx
    391         jz      .ret_frame_different_cpl_286
     393        jnz     .ret_frame_different_cpl_286
    392394.ret_frame_different_cpl_386:
    393395CPU 386
     
    395397        mov     cx, [bp + 8]
    396398        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], ecx
    397         lea     eax, [ebp + 12]
     399        lea     eax, [bp + 12]
    398400        mov     [ss:bx + BS3TRAPFRAME.uHandlerRsp], eax
    399401        jmp     .iret_frame_seed_high_eip_word
     
    410412        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.ss], cx
    411413        test    dx, dx
    412         jz      .iret_frame_same_cpl_286
     414        jnz     .iret_frame_same_cpl_286
    413415.iret_frame_same_cpl_386:
    414416CPU 386
     
    427429.iret_frame_v8086:
    428430CPU 386
     431        or      dword [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rflags], X86_EFL_VM
    429432        mov     byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.bCpl], 3
    430433        or      byte [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.bMode], BS3_MODE_CODE_V86 ; paranoia ^ 2
    431         movzx   ecx, word [ebp + 16]
     434        movzx   ecx, word [bp + 8]
    432435        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], ecx
    433         mov     cx, [ebp + 20]
     436        mov     cx, [bp + 10]
    434437        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.ss], cx
    435         mov     cx, [ebp + 24]
     438        mov     cx, [bp + 12]
    436439        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.es], cx
    437         mov     cx, [ebp + 28]
     440        mov     cx, [bp + 14]
    438441        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.ds], cx
    439         mov     cx, [ebp + 32]
     442        mov     cx, [bp + 16]
    440443        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.fs], cx
    441         mov     cx, [ebp + 36]
     444        mov     cx, [bp + 18]
    442445        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.gs], cx
    443         lea     eax, [ebp + 40]
     446        lea     eax, [bp + 20]
    444447        mov     [ss:bx + BS3TRAPFRAME.uHandlerRsp], eax
    445448        jmp     .iret_frame_done
     
    464467        sldt    [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.ldtr]
    465468        test    dx, dx
    466         jz      .save_286_control_registers
     469        jnz     .save_286_control_registers
    467470.save_386_control_registers:
    468471CPU 386
     
    556559; TSS specified sane values which got loaded during the task switch.
    557560;
    558 ; @param    dx      Zero (1) (for 386+).
     561; @param    dx      Zero (0) for indicating 386+ to the common code.
    559562;
    560563BS3_PROC_BEGIN _Bs3Trap16DoubleFaultHandler80386
     
    660663        mov     cx, [es:di + X86TSS16.ip]
    661664        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rip], cx
    662         mov     [ebp + 2], cx           ; For better call stacks.
     665        mov     [bp + 2], cx            ; For better call stacks.
    663666        mov     cx, [eax + X86TSS16.cs]
    664667        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cs], cx
     
    698701; TSS specified sane values which got loaded during the task switch.
    699702;
    700 ; @param    dx      Zero (0) (for 286).
     703; @param    dx      One (1) for indicating 386+ to the common code.
    701704;
    702705BS3_PROC_BEGIN _Bs3Trap16DoubleFaultHandler80286
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxRestore.asm

    r60000 r60002  
    5757%if TMPL_BITS == 16
    5858        mov     ax, BS3DATA16
    59         mov     ax, es
     59        mov     es, ax
    6060        lds     bx, [bp + 4]
    6161        mov     cx, [bp + 8]
     
    103103
    104104.restore_16_bit_ancient:
     105int3
    105106        ; Some general registers.
    106107        mov     si, [bx + BS3REGCTX.rsi]
     
    146147        mov     ax, [bx + BS3REGCTX.ds]
    147148        stosw
    148         mov     ax, [bx + BS3REGCTX.rbp]
     149        mov     ax, [bx + BS3REGCTX.rbp]    ; Restore esp as late as possible for better stacks.
    149150        stosw
    150151        mov     ax, [bx + BS3REGCTX.rip]
     
    169170
    170171.restore_full:
    171 
    172172        ;
    173173        ; 80386 or later.
     
    224224
    225225        ; TR - complicated because we need to clear the busy bit. ASSUMES GDT.
    226 BS3_ONLY_64BIT_STMT hlt
    227226        str     ax
    228227        cmp     ax, [xBX + BS3REGCTX.tr]
     
    382381        mov     ebx, [xBX + BS3REGCTX.rbx]
    383382
    384         pop    ds
     383        o32 pop ds
    385384        pop     ebp
    386385        iretd
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-SwitchToPE16_V86.asm

    r59984 r60002  
    6767        ; Switch to v8086 mode (return address is already 16-bit).
    6868        ;
    69 hlt
    7069        extern  _Bs3SwitchTo16BitV86_c16
    7170        jmp     _Bs3SwitchTo16BitV86_c16
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TestDoModes.c

    r60000 r60002  
    172172{
    173173    bool const      fDoV86Modes      = true;
    174     bool const      fDoWeirdV86Modes = false;
     174    bool const      fDoWeirdV86Modes = true;
    175175    uint16_t const  uCpuDetected  = BS3_DATA_NM(g_uBs3CpuDetected);
    176176    uint8_t const   bCpuType      = uCpuDetected & BS3CPU_TYPE_MASK;
     
    192192        Bs3TestSub(paEntries[i].pszSubTest);
    193193
    194 #if 1
    195194        if (paEntries[i].pfnDoRM)
    196195        {
     
    362361                Bs3TestFailedF("Error #%u (%#x) in %s!\n", bErrNo, bErrNo, BS3_DATA_NM(g_szBs3ModeName_lm32));
    363362        }
    364 #endif
     363
    365364        if (paEntries[i].pfnDoLM64)
    366365        {
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r60000 r60002  
    428428 */
    429429#if ARCH_BITS == 16
    430 # define BS3_MAKE_PROT_R0PTR_FROM_REAL(a_uSeg, a_off) BS3_FP_MAKE(((a_uSeg) << 3) + BS3_SEL_TILED, a_off)
     430# define BS3_MAKE_PROT_R0PTR_FROM_REAL(a_uSeg, a_off) BS3_MAKE_PROT_R0PTR_FROM_FLAT(((uint32_t)(a_uSeg) << 4) + (uint16_t)(a_off))
    431431#else
    432432# define BS3_MAKE_PROT_R0PTR_FROM_REAL(a_uSeg, a_off) ( (void *)(uintptr_t)(((uint32_t)(a_uSeg) << 4) + (uint16_t)(a_off)) )
     
    15491549    }
    15501550
     1551/** A set of standard protypes to go with #BS3TESTMODEENTRY_CMN.
     1552 * @remark May need to \#pragma alias the c64 variant.  */
     1553#define BS3TESTMODE_PROTOTYPES_CMN(a_BaseNm) \
     1554    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _c16); \
     1555    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _c32); \
     1556    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _c64)
     1557
    15511558/** Produces a BS3TESTMODEENTRY initializer for a full set of mode test
    15521559 *  functions. */
     
    15651572        /*PP32*/      RT_CONCAT(a_BaseNm, _pp32), \
    15661573        /*PP32_16*/   RT_CONCAT(a_BaseNm, _pp32_16), \
    1567         /*PPV86*/     RT_CONCAT(a_BaseNm, _ppev86), \
     1574        /*PPV86*/     RT_CONCAT(a_BaseNm, _ppv86), \
    15681575        /*PAE16*/     RT_CONCAT(a_BaseNm, _pae16), \
    15691576        /*PAE16_32*/  RT_CONCAT(a_BaseNm, _pae16_32), \
     
    15761583        /*LM64*/      RT_CONCAT(a_BaseNm, _lm64), \
    15771584    }
     1585
     1586/** A set of standard protypes to go with #BS3TESTMODEENTRY_MODE.
     1587 * @remark May need to \#pragma alias the lm64 variant.  */
     1588#define BS3TESTMODE_PROTOTYPES_MODE(a_BaseNm) \
     1589    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _rm); \
     1590    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pe16); \
     1591    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pe16_32); \
     1592    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pe16_v86); \
     1593    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pe32); \
     1594    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pe32_16); \
     1595    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pev86); \
     1596    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pp16); \
     1597    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pp16_32); \
     1598    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pp16_v86); \
     1599    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pp32); \
     1600    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pp32_16); \
     1601    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _ppv86); \
     1602    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pae16); \
     1603    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pae16_32); \
     1604    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pae16_v86); \
     1605    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _pae32); \
     1606    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _pae32_16); \
     1607    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _paev86); \
     1608    FNBS3TESTDOMODE                 RT_CONCAT(a_BaseNm, _lm16); \
     1609    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _lm32); \
     1610    FNBS3TESTDOMODE BS3_FAR_CODE    RT_CONCAT(a_BaseNm, _lm64)
    15781611
    15791612
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