VirtualBox

忽略:
時間撮記:
2016-3-11 下午07:12:05 (9 年 以前)
作者:
vboxsync
訊息:

bs3kit: v8086, long, fixes, updates.

位置:
trunk/src/VBox/ValidationKit/bootsectors/bs3kit
檔案:
新增 1 筆資料
修改 18 筆資料
複製 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/Makefile.kmk

    r59984 r60000  
    9999       bs3-cmn-SwitchToRing2.asm \
    100100       bs3-cmn-SwitchToRing3.asm \
     101       bs3-cmn-SwitchToRingX.asm \
    101102       bs3-cmn-SwitchTo16Bit.asm \
    102103       bs3-cmn-SwitchTo16BitV86.asm \
    103104       bs3-cmn-SwitchTo32Bit.asm \
    104105       bs3-cmn-SwitchTo64Bit.asm \
     106       bs3-cmn-Syscall.asm \
    105107       bs3-cmn-TestData.c \
    106108       bs3-cmn-TestInit.c \
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-c16-Trap16Generic.asm

    r59984 r60000  
    3939;*********************************************************************************************************************************
    4040BS3_EXTERN_DATA16 g_bBs3CurrentMode
     41BS3_EXTERN_DATA16 g_uBs3TrapEipHint
    4142BS3_EXTERN_SYSTEM16 Bs3Gdt
    4243TMPL_BEGIN_TEXT
     
    149150
    150151        add     bp, 4                   ; adjust so it points to the word before the iret frame.
     152        xor     dx, dx
    151153        jmp     bs3Trap16GenericCommon
    152154BS3_PROC_END   bs3Trap16GenericTrapOrInt
     
    190192
    191193        add     bp, 4                   ; adjust so it points to the word before the iret frame.
     194        mov     dx, 1
    192195        jmp     bs3Trap16GenericCommon
    193196BS3_PROC_END   bs3Trap16GenericTrapOrInt80286
     
    237240
    238241        add     bp, 6                   ; adjust so it points to the word before the iret frame.
     242        xor     dx, dx
    239243        jmp     bs3Trap16GenericCommon
    240244BS3_PROC_END   bs3Trap16GenericTrapErrCode
     
    281285
    282286        add     bp, 4                   ; adjust so it points to the word before the iret frame.
     287        mov     dl, 1
    283288        jmp     bs3Trap16GenericCommon
    284289BS3_PROC_END   bs3Trap16GenericTrapErrCode80286
     
    320325        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rdi], edi
    321326        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsi], esi
     327        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], esp ; high word
    322328        jmp     .save_segment_registers
    323329.save_word_grps:
     
    344350        shl     ax, BS3_SEL_RING_SHIFT
    345351        or      ax, cx
    346         add     ax, BS3_SEL_R0_DS32
     352        add     ax, BS3_SEL_R0_DS16
    347353        mov     ds, ax
    348354        mov     es, ax
     
    391397        lea     eax, [ebp + 12]
    392398        mov     [ss:bx + BS3TRAPFRAME.uHandlerRsp], eax
    393         jmp     .iret_frame_done
     399        jmp     .iret_frame_seed_high_eip_word
    394400.ret_frame_different_cpl_286:
    395401CPU 286
     
    411417        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rsp], ecx
    412418        mov     [ss:bx + BS3TRAPFRAME.uHandlerRsp], ecx
    413         jmp     .iret_frame_done
     419        jmp     .iret_frame_seed_high_eip_word
    414420.iret_frame_same_cpl_286:
    415421CPU 286
     
    438444        mov     [ss:bx + BS3TRAPFRAME.uHandlerRsp], eax
    439445        jmp     .iret_frame_done
     446
     447        ;
     448        ; For 386 we do special tricks to supply the high word of EIP when
     449        ; arriving here from 32-bit code. (ESP was seeded earlier.)
     450        ;
     451.iret_frame_seed_high_eip_word:
     452        lar     eax, [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.cs]
     453        jnz     .iret_frame_done
     454        test    eax, X86LAR_F_D
     455        jz      .iret_frame_done
     456        mov     ax, [g_uBs3TrapEipHint+2]
     457        mov     [ss:bx + BS3TRAPFRAME.Ctx + BS3REGCTX.rip + 2], ax
    440458
    441459.iret_frame_done:
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-PerCpuData.c

    r59938 r60000  
    4141#if ARCH_BITS == 16
    4242
    43 uint8_t BS3_DATA_NM(g_bBs3CurrentMode) = BS3_MODE_RM;
     43/** The current CPU mode. */
     44uint8_t  BS3_DATA_NM(g_bBs3CurrentMode) = BS3_MODE_RM;
     45
     46/** Hint for 16-bit trap handlers regarding the high word of EIP. */
     47uint32_t BS3_DATA_NM(g_uBs3TrapEipHint) = 0;
     48
    4449
    4550#endif /* ARCH_BITS == 16 */
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-PrintChr.asm

    r59984 r60000  
    2525;
    2626
     27
     28;*********************************************************************************************************************************
     29;*  Header Files                                                                                                                 *
     30;*********************************************************************************************************************************
    2731%include "bs3kit-template-header.mac"
     32
     33
     34;*********************************************************************************************************************************
     35;*  External Symbols                                                                                                             *
     36;*********************************************************************************************************************************
     37%if TMPL_BITS == 16
     38BS3_EXTERN_DATA16 g_bBs3CurrentMode
     39%endif
     40BS3_EXTERN_CMN Bs3Syscall
     41
     42
     43TMPL_BEGIN_TEXT
    2844
    2945;;
     
    3854        push    xBX
    3955
    40 %ifdef TMPL_16BIT
    41         ; If we're not in protected mode, call the VGA BIOS directly.
    42         smsw    bx
    43         test    bx, X86_CR0_PE
    44         jnz     .protected_mode
     56%if TMPL_BITS == 16
     57        ; If we're in real mode or v8086 mode, call the VGA BIOS directly.
     58        mov     bl, [g_bBs3CurrentMode]
     59        cmp     bl, BS3_MODE_RM
     60        je      .do_vga_bios_call
     61;later ;        and     bl, BS3_MODE_CODE_MASK
     62;later ;        cmp     bl, BS3_MODE_CODE_V86
     63        jne     .do_system_call
    4564
     65.do_vga_bios_call:
    4666        mov     al, [xBP + xCB*2]       ; Load the char
    4767        mov     bx, 0ff00h
     
    4969        int     10h
    5070        jmp     .return
    51 
    52 .protected_mode:
    5371%endif
    5472
     73.do_system_call:
    5574        mov     cl, [xBP + xCB*2]       ; Load the char
    5675        mov     ax, BS3_SYSCALL_PRINT_CHR
    57         int     BS3_TRAP_SYSCALL
     76        call    Bs3Syscall              ; (no BS3_CALL!)
    5877
    5978.return:
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-RegCtxRestore.asm

    r59976 r60000  
    224224
    225225        ; TR - complicated because we need to clear the busy bit. ASSUMES GDT.
     226BS3_ONLY_64BIT_STMT hlt
    226227        str     ax
    227228        cmp     ax, [xBX + BS3REGCTX.tr]
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchTo16Bit.asm

    r59977 r60000  
    2828
    2929BS3_EXTERN_DATA16 g_bBs3CurrentMode
     30%if TMPL_BITS == 16
     31BS3_EXTERN_CMN Bs3Syscall
     32%endif
    3033TMPL_BEGIN_TEXT
    3134
     
    4144
    4245        ; Check g_bBs3CurrentMode whether we're in v8086 mode or not.
    43         mov     ax, seg g_bBs3CurrentMode
    44         mov     ds, ax
    4546        mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    4647        and     al, BS3_MODE_CODE_MASK
     
    5051        ; Switch to ring-0 if v8086 mode.
    5152        mov     ax, BS3_SYSCALL_TO_RING0
    52         lock int BS3_TRAP_SYSCALL
     53        call    Bs3Syscall
    5354
    5455.ret_16bit:
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchTo32Bit.asm

    r59949 r60000  
    55
    66;
    7 ; Copyright (C) 2007-2015 Oracle Corporation
     7; Copyright (C) 2007-2016 Oracle Corporation
    88;
    99; This file is part of VirtualBox Open Source Edition (OSE), as
     
    3030%if TMPL_BITS == 16
    3131BS3_EXTERN_CMN Bs3SelProtFar32ToFlat32
     32BS3_EXTERN_CMN Bs3Syscall
    3233%endif
    3334%if TMPL_BITS != 32
     
    7576        ; Switch to 16-bit ring0 and go on to do the far jump to 32-bit code.
    7677        mov     ax, BS3_SYSCALL_TO_RING0
    77         int     BS3_TRAP_SYSCALL
     78        call    Bs3Syscall
    7879
    7980        mov     xAX, BS3_SEL_R0_CS32
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchToRing0.asm

    r59976 r60000  
    2525;
    2626
     27;*********************************************************************************************************************************
     28;*  Header Files                                                                                                                 *
     29;*********************************************************************************************************************************
    2730%include "bs3kit-template-header.mac"
    2831
    2932
    30 %if TMPL_BITS == 16
    31 BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %endif
     33;*********************************************************************************************************************************
     34;*  External Symbols                                                                                                             *
     35;*********************************************************************************************************************************
     36BS3_EXTERN_CMN Bs3SwitchToRingX
    3337TMPL_BEGIN_TEXT
    3438
     
    4044;
    4145BS3_PROC_BEGIN_CMN Bs3SwitchToRing0
    42         push    xAX
    43 
    44 %if TMPL_BITS == 16
    45         ; Check the current mode.
    46         push    ds
    47         mov     ax, seg g_bBs3CurrentMode
    48         mov     ds, ax
    49         mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    50         pop     ds
    51 
    52         ; If real mode: Nothing to do, it's considered ring-0 here.
    53         cmp     al, BS3_MODE_RM
    54         je      .return
    55 
    56         ; If V8086 mode: Always do syscall and add a lock prefix to make sure it gets to the VMM.
    57         and     al, BS3_MODE_CODE_MASK
    58         cmp     al, BS3_MODE_CODE_V86
    59         jne     .not_v8086
    60 
    61         mov     xAX, BS3_SYSCALL_TO_RING0
    62         lock int BS3_TRAP_SYSCALL
    63         jmp     .return
    64 
    65 .not_v8086:
    66 %endif
    67 
    68         ; In protected mode: Check the CPL we're currently at skip syscall if ring-0 already.
    69         mov     ax, cs
    70         test    ax, 3
    71         jz      .return
    72 
    73         mov     xAX, BS3_SYSCALL_TO_RING0
    74         int     BS3_TRAP_SYSCALL
    75 
    76 .return:
    77         pop     xAX
     46        BS3_ONLY_64BIT_STMT sub rsp, 18h
     47        push    0
     48        BS3_CALL Bs3SwitchToRingX, 1
     49        add     xSP, xCB BS3_ONLY_64BIT(+ 18h)
    7850        ret
    7951BS3_PROC_END_CMN   Bs3SwitchToRing0
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchToRing1.asm

    r59949 r60000  
    2525;
    2626
     27;*********************************************************************************************************************************
     28;*  Header Files                                                                                                                 *
     29;*********************************************************************************************************************************
    2730%include "bs3kit-template-header.mac"
    2831
    2932
    30 %if TMPL_BITS == 16
    31 BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %endif
     33;*********************************************************************************************************************************
     34;*  External Symbols                                                                                                             *
     35;*********************************************************************************************************************************
     36BS3_EXTERN_CMN Bs3SwitchToRingX
    3337TMPL_BEGIN_TEXT
    3438
     
    4044;
    4145BS3_PROC_BEGIN_CMN Bs3SwitchToRing1
    42         push    xAX
    43 
    44 %if TMPL_BITS == 16
    45         ; Check the current mode.
    46         push    ds
    47         mov     ax, seg g_bBs3CurrentMode
    48         mov     ds, ax
    49         mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    50         pop     ds
    51 
    52         ; If real mode: assert, shouldn't call this function in real mode!
    53         cmp     al, BS3_MODE_RM
    54         jne     .not_real_mode
    55         int3
    56         jmp     .return
    57 .not_real_mode:
    58 
    59         ; If V8086 mode: Have to make the system call (v8086 mode is kind of like ring-3).
    60         and     al, BS3_MODE_CODE_MASK
    61         cmp     al, BS3_MODE_CODE_V86
    62         je      .just_do_it
    63 %endif
    64 
    65         ; In protected mode: Check the CPL we're currently at skip syscall if ring-1 already.
    66         mov     ax, cs
    67         and     ax, 3
    68         cmp     ax, 1
    69         je      .return
    70 
    71 .just_do_it:
    72         mov     xAX, BS3_SYSCALL_TO_RING1
    73         int     BS3_TRAP_SYSCALL
    74 
    75 .return:
    76         pop     xAX
     46        BS3_ONLY_64BIT_STMT sub rsp, 18h
     47        push    1
     48        BS3_CALL Bs3SwitchToRingX, 1
     49        add     xSP, xCB BS3_ONLY_64BIT(+ 18h)
    7750        ret
    7851BS3_PROC_END_CMN   Bs3SwitchToRing1
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchToRing2.asm

    r59949 r60000  
    2525;
    2626
     27;*********************************************************************************************************************************
     28;*  Header Files                                                                                                                 *
     29;*********************************************************************************************************************************
    2730%include "bs3kit-template-header.mac"
    2831
    2932
    30 %if TMPL_BITS == 16
    31 BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %endif
     33;*********************************************************************************************************************************
     34;*  External Symbols                                                                                                             *
     35;*********************************************************************************************************************************
     36BS3_EXTERN_CMN Bs3SwitchToRingX
    3337TMPL_BEGIN_TEXT
    3438
     
    4044;
    4145BS3_PROC_BEGIN_CMN Bs3SwitchToRing2
    42         push    xAX
    43 
    44 %if TMPL_BITS == 16
    45         ; Check the current mode.
    46         push    ds
    47         mov     ax, seg g_bBs3CurrentMode
    48         mov     ds, ax
    49         mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    50         pop     ds
    51 
    52         ; If real mode: assert, shouldn't call this function in real mode!
    53         cmp     al, BS3_MODE_RM
    54         jne     .not_real_mode
    55         int3
    56         jmp     .return
    57 .not_real_mode:
    58 
    59         ; If V8086 mode: Have to make the system call (v8086 mode is kind of like ring-3).
    60         and     al, BS3_MODE_CODE_MASK
    61         cmp     al, BS3_MODE_CODE_V86
    62         je      .just_do_it
    63 %endif
    64 
    65         ; In protected mode: Check the CPL we're currently at skip syscall if ring-2 already.
    66         mov     ax, cs
    67         and     ax, 3
    68         cmp     ax, 2
    69         je      .return
    70 
    71 .just_do_it:
    72         mov     xAX, BS3_SYSCALL_TO_RING2
    73         int     BS3_TRAP_SYSCALL
    74 
    75 .return:
    76         pop     xAX
     46        BS3_ONLY_64BIT_STMT sub rsp, 18h
     47        push    2
     48        BS3_CALL Bs3SwitchToRingX, 1
     49        add     xSP, xCB BS3_ONLY_64BIT(+ 18h)
    7750        ret
    7851BS3_PROC_END_CMN   Bs3SwitchToRing2
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchToRing3.asm

    r59949 r60000  
    2525;
    2626
     27;*********************************************************************************************************************************
     28;*  Header Files                                                                                                                 *
     29;*********************************************************************************************************************************
    2730%include "bs3kit-template-header.mac"
    2831
    2932
    30 %if TMPL_BITS == 16
    31 BS3_EXTERN_DATA16 g_bBs3CurrentMode
    32 %endif
     33;*********************************************************************************************************************************
     34;*  External Symbols                                                                                                             *
     35;*********************************************************************************************************************************
     36BS3_EXTERN_CMN Bs3SwitchToRingX
    3337TMPL_BEGIN_TEXT
    3438
     
    4044;
    4145BS3_PROC_BEGIN_CMN Bs3SwitchToRing3
    42         push    xAX
    43 
    44 %if TMPL_BITS == 16
    45         ; Check the current mode.
    46         push    ds
    47         mov     ax, seg g_bBs3CurrentMode
    48         mov     ds, ax
    49         mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    50         pop     ds
    51 
    52         ; If real mode: assert, shouldn't call this function in real mode!
    53         cmp     al, BS3_MODE_RM
    54         jne     .not_real_mode
    55         int3
    56         jmp     .return
    57 .not_real_mode:
    58 
    59         ; If V8086 mode: Have to make the system call (we don't consider v8086 ring-3 here).
    60         and     al, BS3_MODE_CODE_MASK
    61         cmp     al, BS3_MODE_CODE_V86
    62         je      .just_do_it
    63 %endif
    64 
    65         ; In protected mode: Check the CPL we're currently at skip syscall if ring-3 already.
    66         mov     ax, cs
    67         and     ax, 3
    68         cmp     ax, 3
    69         je      .return
    70 
    71 .just_do_it:
    72         mov     xAX, BS3_SYSCALL_TO_RING3
    73         int     BS3_TRAP_SYSCALL
    74 
    75 .return:
    76         pop     xAX
     46        BS3_ONLY_64BIT_STMT sub rsp, 18h
     47        push    3
     48        BS3_CALL Bs3SwitchToRingX, 1
     49        add     xSP, xCB BS3_ONLY_64BIT(+ 18h)
    7750        ret
    7851BS3_PROC_END_CMN   Bs3SwitchToRing3
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SwitchToRingX.asm

    r59976 r60000  
    11; $Id$
    22;; @file
    3 ; BS3Kit - Bs3SwitchToRing0
     3; BS3Kit - Bs3SwitchToRingX
    44;
    55
     
    2828
    2929
     30BS3_EXTERN_CMN Bs3Syscall
    3031%if TMPL_BITS == 16
    3132BS3_EXTERN_DATA16 g_bBs3CurrentMode
     
    3536
    3637;;
    37 ; @cproto   BS3_DECL(void) Bs3SwitchToRing0(void);
     38; @cproto   BS3_DECL(void) Bs3SwitchToRingX(uint8_t bRing);
    3839;
     40; @param    bRing       The target ring (0..3).
    3941; @remarks  Does not require 20h of parameter scratch space in 64-bit mode.
    4042;
    41 BS3_PROC_BEGIN_CMN Bs3SwitchToRing0
     43BS3_PROC_BEGIN_CMN Bs3SwitchToRingX
     44        BS3_CALL_CONV_PROLOG 1
     45        push    xBP
     46        mov     xBP, xSP
    4247        push    xAX
    4348
    4449%if TMPL_BITS == 16
    4550        ; Check the current mode.
    46         push    ds
    47         mov     ax, seg g_bBs3CurrentMode
    48         mov     ds, ax
    4951        mov     al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    50         pop     ds
    5152
    52         ; If real mode: Nothing to do, it's considered ring-0 here.
     53        ; If real mode: Nothing we can do, but we'll bitch if the request isn't for ring-0.
    5354        cmp     al, BS3_MODE_RM
    54         je      .return
     55        je      .return_real_mode
    5556
    5657        ; If V8086 mode: Always do syscall and add a lock prefix to make sure it gets to the VMM.
    5758        and     al, BS3_MODE_CODE_MASK
    5859        cmp     al, BS3_MODE_CODE_V86
    59         jne     .not_v8086
    60 
    61         mov     xAX, BS3_SYSCALL_TO_RING0
    62         lock int BS3_TRAP_SYSCALL
    63         jmp     .return
    64 
    65 .not_v8086:
     60        je      .just_do_it
    6661%endif
    6762
    6863        ; In protected mode: Check the CPL we're currently at skip syscall if ring-0 already.
    6964        mov     ax, cs
    70         test    ax, 3
    71         jz      .return
     65        and     al, 3
     66        cmp     al, byte [xBP + xCB*2]
     67        je      .return
    7268
     69.just_do_it:
    7370        mov     xAX, BS3_SYSCALL_TO_RING0
    74         int     BS3_TRAP_SYSCALL
     71        add     al, [xBP + xCB*2]
     72        call    Bs3Syscall
    7573
     74%ifndef BS3_STRICT
     75.return_real_mode:
     76%endif
    7677.return:
    7778        pop     xAX
     79        pop     xBP
     80        BS3_CALL_CONV_EPILOG 1
    7881        ret
    79 BS3_PROC_END_CMN   Bs3SwitchToRing0
    8082
     83%ifdef BS3_STRICT
     84; In real mode, only ring-0 makes any sense.
     85.return_real_mode:
     86        cmp     byte [xBP + xCB*2], 0
     87        je      .return
     88        int3
     89        jmp     .return
     90%endif
     91BS3_PROC_END_CMN   Bs3SwitchToRingX
     92
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-TrapDefaultHandler.c

    r59976 r60000  
    152152        {
    153153            pTrapFrame->Ctx.rip.u16 += (uint16_t)(pbCode - pbCodeStart);
     154# if 0
    154155            Bs3Printf("Calling Bs3RegCtxRestore\n");
    155156            Bs3RegCtxPrint(&pTrapFrame->Ctx);
     157# endif
    156158            Bs3RegCtxRestore(&pTrapFrame->Ctx, 0 /*fFlags*/); /* does not return. */
    157159            return;
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-EnteredMode.asm

    r59975 r60000  
    2727%include "bs3kit-template-header.mac"
    2828
     29%if TMPL_BITS == 16
     30BS3_EXTERN_DATA16 g_uBs3CpuDetected
     31%endif
    2932BS3_EXTERN_DATA16 g_bBs3CurrentMode
    3033TMPL_BEGIN_TEXT
     
    152155
    153156        ;
    154         ; Load ds and es.
    155         ;
    156 %ifdef TMPL_CMN_V86
     157        ; Load ds and es; clear fs and gs.
     158        ;
     159%if BS3_MODE_IS_RM_OR_V86(TMPL_MODE)
    157160        mov     ax, BS3_SEL_DATA16
    158161%else
     
    166169        push    ax
    167170        push    ax
    168 %endif
     171
     172        cmp     byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80286
     173        jbe     .skip_fs_gs
     174%endif
     175        xor     ax, ax
     176        mov     fs, ax
     177        mov     gs, ax
     178.skip_fs_gs:
    169179
    170180        ;
     
    246256%endif
    247257        pop     xAX
     258%ifdef BS3_STRICT
     259        cmp     xBP, xSP
     260        je      .return_stack_ok
     261        int3
     262.return_stack_ok:
     263%endif
    248264        leave
    249265        ret
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-SwitchToRM.asm

    r59977 r60000  
    4040; @cproto   BS3_DECL(void) Bs3SwitchToRM(void);
    4141;
    42 ; @uses     Nothing (except high 32-bit register parts).
     42; @uses     GPRs and EFLAGS are unchanged (except high 32-bit register (AMD64) parts).
     43;           CS is loaded with BS3TEXT16.
     44;           SS:[RE]SP is converted to real mode address.
     45;           DS and ES are loaded with BS3DATA16_GROUP.
     46;           FS and GS are loaded with zero if present.
    4347;
    4448; @remarks  Obviously returns to 16-bit mode, even if the caller was
     
    120124        BS3_SET_BITS 16
    121125 %endif
     126        ;
     127        ; Before exiting to real mode we must load sensible selectors into the
     128        ; segment registers so the hidden parts (which doesn't get reloaded in
     129        ; real mode) are real mode compatible.
     130        ;
     131.is_386_or_better:
     132;; @todo Testcase: Experiment leaving weird stuff in the hidden segment registers.
     133        mov     ax, BS3_SEL_R0_DS16
     134        mov     ds, ax
     135        mov     es, ax
     136        mov     fs, ax
     137        mov     gs, ax
    122138
    123139        ;
    124140        ; Exit to real mode.
    125141        ;
    126 .is_386_or_better:
    127142        mov     eax, cr0
    128143        and     eax, X86_CR0_NO_PE_NO_PG
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TestDoModes.c

    r59984 r60000  
    192192        Bs3TestSub(paEntries[i].pszSubTest);
    193193
     194#if 1
    194195        if (paEntries[i].pfnDoRM)
    195196        {
     
    205206         * Unpaged prot mode.
    206207         */
    207 #if 0
    208208        if (paEntries[i].pfnDoPE16)
    209209        {
    210 Bs3Printf("Calling pfnDoPE16\n");
    211210            bErrNo = TMPL_NM(Bs3TestCallDoerInPE16)(CONV_TO_BS3TEXT16(paEntries[i].pfnDoPE16));
    212 Bs3Printf("pfnDoPE16 returns %d\n", bErrNo);
    213211            if (bErrNo != 0)
    214212                Bs3TestFailedF("Error #%u (%#x) in %s!\n", bErrNo, bErrNo, BS3_DATA_NM(g_szBs3ModeName_pe16));
     
    219217        if (paEntries[i].pfnDoPE16_32)
    220218        {
    221 Bs3Printf("Calling pfnDoPE16_32\n");
    222219            bErrNo = TMPL_NM(Bs3TestCallDoerInPE16_32)(CONV_TO_FLAT(paEntries[i].pfnDoPE16_32));
    223 Bs3Printf("pfnDoPE16_32 returns %d\n", bErrNo);
    224220            if (bErrNo != 0)
    225221                Bs3TestFailedF("Error #%u (%#x) in %s!\n", bErrNo, bErrNo, BS3_DATA_NM(g_szBs3ModeName_pe16_32));
     
    227223
    228224        if (paEntries[i].pfnDoPE16_V86 && fDoWeirdV86Modes)
    229 #endif
    230225        {
    231226            bErrNo = TMPL_NM(Bs3TestCallDoerInPE16_V86)(CONV_TO_BS3TEXT16(paEntries[i].pfnDoPE16_V86));
     
    367362                Bs3TestFailedF("Error #%u (%#x) in %s!\n", bErrNo, bErrNo, BS3_DATA_NM(g_szBs3ModeName_lm32));
    368363        }
    369 
     364#endif
    370365        if (paEntries[i].pfnDoLM64)
    371366        {
     
    375370        }
    376371    }
     372for (;;) { }
    377373}
    378374
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TestDoModesHlp.asm

    r59984 r60000  
    157157
    158158
     159
     160;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     161;; Real mode
     162;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     163
    159164;;
    160165; @cproto   BS3_DECL(uint8_t) Bs3TestCallDoerInRM(uint16_t offBs3Text16);
     
    171176        call    TMPL_NM(Bs3SwitchToRM)
    172177        BS3_SET_BITS 16
    173         call    ax
     178        mov     cx, BS3_MODE_RM
     179        push    cx
     180        call    ax
     181        add     sp, 2
    174182        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_rm)
    175183        BS3_SET_BITS TMPL_BITS
     
    197205        call    TMPL_NM(Bs3SwitchToPE16)
    198206        BS3_SET_BITS 16
     207        push    BS3_MODE_PE16
    199208        call    ax
    200209        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16)
     
    216225        call    TMPL_NM(Bs3SwitchToPE16_32)
    217226        BS3_SET_BITS 32
     227        push    BS3_MODE_RM
    218228        call    eax
    219229        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_32)
     
    229239        jmp     TMPL_NM(bs3TestCallDoerPrologue)
    230240.doit:
    231         mov     eax, [xBP + xCB*2]      ; Load function pointer.
     241        mov     ax, [xBP + xCB*2]       ; Load function pointer.
    232242
    233243        ; Mode switch, make the call, switch back.
    234244        call    TMPL_NM(Bs3SwitchToPE16_V86)
    235         BS3_SET_BITS 32
    236         call    eax
    237 .repeat: jmp .repeat
     245        BS3_SET_BITS 16
     246        push    BS3_MODE_PE16_V86
     247        call    ax
    238248        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe16_v86)
    239249        BS3_SET_BITS TMPL_BITS
     
    253263        call    TMPL_NM(Bs3SwitchToPE32)
    254264        BS3_SET_BITS 32
     265        push    BS3_MODE_PE32
    255266        call    eax
    256267        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe32)
     
    273284        call    TMPL_NM(Bs3SwitchToPE32_16)
    274285        BS3_SET_BITS 16
     286        push    BS3_MODE_PE32_16
    275287        call    ax
    276288        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pe32_16)
     
    294306        call    TMPL_NM(Bs3SwitchToPEV86)
    295307        BS3_SET_BITS 16
     308        push    BS3_MODE_PEV86
    296309        call    ax
    297310        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pev86)
     
    321334        call    TMPL_NM(Bs3SwitchToPP16)
    322335        BS3_SET_BITS 16
     336        push    BS3_MODE_PP16
    323337        call    ax
    324338        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16)
     
    340354        call    TMPL_NM(Bs3SwitchToPP16_32)
    341355        BS3_SET_BITS 32
     356        push    BS3_MODE_PP16_32
    342357        call    eax
    343358        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_32)
     
    353368        jmp     TMPL_NM(bs3TestCallDoerPrologue)
    354369.doit:
    355         mov     eax, [xBP + xCB*2]      ; Load function pointer.
     370        mov     ax, [xBP + xCB*2]       ; Load function pointer.
    356371
    357372        ; Mode switch, make the call, switch back.
    358373        call    TMPL_NM(Bs3SwitchToPP16_V86)
    359         BS3_SET_BITS 32
    360         call    eax
     374        BS3_SET_BITS 16
     375        push    BS3_MODE_PP16_V86
     376        call    ax
    361377        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp16_v86)
    362378        BS3_SET_BITS TMPL_BITS
     
    376392        call    TMPL_NM(Bs3SwitchToPP32)
    377393        BS3_SET_BITS 32
     394        push    BS3_MODE_PP32
    378395        call    eax
    379396        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp32)
     
    396413        call    TMPL_NM(Bs3SwitchToPP32_16)
    397414        BS3_SET_BITS 16
     415        push    BS3_MODE_PP32_16
    398416        call    ax
    399417        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pp32_16)
     
    417435        call    TMPL_NM(Bs3SwitchToPPV86)
    418436        BS3_SET_BITS 16
     437        push    BS3_MODE_PPV86
    419438        call    ax
    420439        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_ppv86)
     
    444463        call    TMPL_NM(Bs3SwitchToPAE16)
    445464        BS3_SET_BITS 16
     465        push    BS3_MODE_PAE16
    446466        call    ax
    447467        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16)
     
    463483        call    TMPL_NM(Bs3SwitchToPAE16_32)
    464484        BS3_SET_BITS 32
     485        push    BS3_MODE_PAE16_32
    465486        call    eax
    466487        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_32)
     
    476497        jmp     TMPL_NM(bs3TestCallDoerPrologue)
    477498.doit:
    478         mov     eax, [xBP + xCB*2]      ; Load function pointer.
     499        mov     ax, [xBP + xCB*2]       ; Load function pointer.
    479500
    480501        ; Mode switch, make the call, switch back.
    481502        call    TMPL_NM(Bs3SwitchToPAE16_V86)
    482         BS3_SET_BITS 32
    483         call    eax
     503        BS3_SET_BITS 16
     504        push    BS3_MODE_PAE16_V86
     505        call    ax
    484506        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae16_v86)
    485507        BS3_SET_BITS TMPL_BITS
     
    499521        call    TMPL_NM(Bs3SwitchToPAE32)
    500522        BS3_SET_BITS 32
     523        push    BS3_MODE_PAE16_32
    501524        call    eax
    502525        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae32)
     
    519542        call    TMPL_NM(Bs3SwitchToPAE32_16)
    520543        BS3_SET_BITS 16
     544        push    BS3_MODE_PAE32_16
    521545        call    ax
    522546        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_pae32_16)
     
    540564        call    TMPL_NM(Bs3SwitchToPAEV86)
    541565        BS3_SET_BITS 16
     566        push    BS3_MODE_PAEV86
    542567        call    ax
    543568        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_paev86)
     
    567592        call    TMPL_NM(Bs3SwitchToLM16)
    568593        BS3_SET_BITS 16
     594        push    BS3_MODE_LM16
    569595        call    ax
    570596        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_lm16)
     
    586612        call    TMPL_NM(Bs3SwitchToLM32)
    587613        BS3_SET_BITS 32
     614        and     esp, ~03h
     615        push    BS3_MODE_LM32
    588616        call    eax
    589617        call    RT_CONCAT3(_Bs3SwitchTo,TMPL_MODE_UNAME,_lm32)
     
    604632        call    TMPL_NM(Bs3SwitchToLM64)
    605633        BS3_SET_BITS 64
    606         call    rax
     634        and     rsp, ~0fh
     635        sub     rsp, 18h
     636        push    BS3_MODE_LM64
     637        BS3_CALL rax, 1
    607638        call    RT_CONCAT3(Bs3SwitchTo,TMPL_MODE_UNAME,_lm64)
    608639        BS3_SET_BITS TMPL_BITS
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-TrapSystemCallHandler.asm

    r59984 r60000  
    2525;
    2626
     27;*********************************************************************************************************************************
     28;*  Header Files                                                                                                                 *
     29;*********************************************************************************************************************************
    2730%include "bs3kit-template-header.mac"
    2831
    2932
     33;*********************************************************************************************************************************
     34;*  External Symbols                                                                                                             *
     35;*********************************************************************************************************************************
    3036BS3_EXTERN_DATA16 g_bBs3CurrentMode
    3137BS3_EXTERN_DATA16 g_uBs3CpuDetected
     38%if TMPL_BITS == 16
     39BS3_EXTERN_DATA16 g_uBs3TrapEipHint
     40%endif
    3241TMPL_BEGIN_TEXT
    3342
     
    5261;
    5362; Note! The 16-bit versions of this code must be careful with using extended
    54 ;       registers as we wish this code to work on real 8086 CPUs too!
     63;       registers as we wish this code to work on real 80286 (maybe even 8086)
     64;       CPUs too!
    5565;
    5666BS3_PROC_BEGIN_MODE Bs3TrapSystemCallHandler
     67        ;
     68        ; This prologue is kind of complicated because of 80286 and older CPUs
     69        ; as well as different requirements for 64-bit and the other modes.
     70        ;
     71%define VAR_CALLER_BP      [xBP]
     72%if TMPL_BITS != 64
     73 %define VAR_CALLER_DS     [xBP         - xCB]
     74%endif
     75%define VAR_CALLER_BX      [xBP - sCB*1 - xCB]
     76%define VAR_CALLER_AX      [xBP - sCB*2 - xCB]
     77%define VAR_CALLER_CX      [xBP - sCB*3 - xCB]
     78%define VAR_CALLER_DX      [xBP - sCB*4 - xCB]
     79%define VAR_CALLER_SI      [xBP - sCB*5 - xCB]
     80%define VAR_CALLER_DI      [xBP - sCB*6 - xCB]
     81%if TMPL_BITS == 16
     82 %define VAR_CALLER_ESP    [xBP - sCB*7 - xCB]
     83 %define VAR_CALLER_EBP    [xBP - sCB*8 - xCB]
     84 %define VAR_CALLER_EFLAGS [xBP - sCB*9 - xCB]
     85 %define VAR_CALLER_MODE   [xBP - sCB*9 - xCB*2]
     86%else
     87 %define VAR_CALLER_MODE   [xBP - sCB*6 - xCB*2]
     88%endif
    5789        push    xBP
    5890        mov     xBP, xSP
    59 %ifndef TMPL_64BIT
    60  %define VAR_CALLER_DS      [xBP - xCB]
     91%if TMPL_BITS == 64
     92        push    0                       ; dummy DS entry
     93%else
    6194        push    ds
    6295 %ifdef TMPL_CMN_R86
     
    6598        push    RT_CONCAT(BS3_SEL_R0_DS,TMPL_BITS)
    6699 %endif
    67         pop     ds
    68  %define VAR_CALLER_BP      [xBP]
    69  %define VAR_CALLER_DS      [xBP -       - xCB]
    70  %define VAR_CALLER_BX      [xBP - xCB*1 - xCB]
    71  %define VAR_CALLER_AX      [xBP - xCB*2 - xCB]
    72  %define VAR_CALLER_CX      [xBP - xCB*3 - xCB]
    73  %define VAR_CALLER_DX      [xBP - xCB*4 - xCB]
    74  %define VAR_CALLER_MODE    [xBP - xCB*5 - xCB]
    75 %else
    76  %define VAR_CALLER_BP      [xBP]
    77  %define VAR_CALLER_BX      [xBP - xCB*1]
    78  %define VAR_CALLER_AX      [xBP - xCB*2]
    79  %define VAR_CALLER_CX      [xBP - xCB*3]
    80  %define VAR_CALLER_DX      [xBP - xCB*4]
    81  %define VAR_CALLER_MODE    [xBP - xCB*5]
    82 %endif
    83         push    xBX
    84         push    xAX
    85         push    xCX
    86         push    xDX
    87 
     100        pop     ds                      ; DS = BS3DATA16_GROUP or FLAT and we can safely access data
     101 %if TMPL_BITS == 16 && (TMPL_MODE == BS3_MODE_SYS_RM || TMPL_MODE == BS3_MODE_SYS_PE16)
     102        cmp     byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80286
     103        jbe     .prologue_pre_80386
     104 %endif
     105%endif
     106        push    sBX
     107        push    sAX
     108        push    sCX
     109        push    sDX
     110        push    sSI
     111        push    sDI
     112%if TMPL_BITS == 16
     113        push    ebp
     114        push    esp
     115        pushfd
     116 %if TMPL_MODE == BS3_MODE_SYS_RM || TMPL_MODE == BS3_MODE_SYS_PE16
     117        jmp     .prologue_end
     118
     119.prologue_pre_80386:
     120        push    bx                      ; dummy
     121        push    bx
     122        push    ax                      ; dummy
     123        push    ax
     124        push    cx                      ; dummy
     125        push    cx
     126        push    dx                      ; dummy
     127        push    dx
     128        push    si                      ; dummy
     129        push    si
     130        push    di                      ; dummy
     131        push    di
     132        sub     sp, 0ch                 ; dummy
     133 %endif
     134%endif
     135.prologue_end:
     136
     137        ;
    88138        ; VAR_CALLER_MODE: Save the current mode (important for v8086 with 16-bit kernel).
     139        ;
    89140        xor     xBX, xBX
    90         mov     bl, [g_bBs3CurrentMode]
     141        mov     bl, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
    91142        push    xBX
    92143
     
    131182        jmp     .return
    132183
    133 
    134184        ;
    135185        ; Print char in the CL register.
     
    139189        ; requried for the mode switching code.
    140190        ;
    141 %ifndef TMPL_16BIT
    142191BS3_BEGIN_TEXT16
    143192        BS3_SET_BITS TMPL_BITS
    144 %endif
    145193.print_chr:
    146         push    xDI
    147         push    xSI
     194%if TMPL_BITS != 64
     195        push    es
     196        mov     di, ss                  ; Must save and restore SS for supporting 16/32 and 32/16 caller/kernel ring-0 combinations.
     197%endif
    148198%ifndef TMPL_CMN_R86
    149199        ; Switch to real mode (20h param scratch area not required).
     
    152202        BS3_SET_BITS 16
    153203%endif
    154 push sBX
    155 push sAX
    156 push sCX
    157 push sDX
    158 push sBP
    159204
    160205        ; Print the character.
     
    164209        int     10h
    165210
    166 pop sBP
    167 pop sDX
    168 pop sCX
    169 pop sAX
    170 pop sBX
    171211%ifndef TMPL_CMN_R86
    172212        ; Switch back (20h param scratch area not required).
     
    175215        BS3_SET_BITS TMPL_BITS
    176216%endif
    177         pop     xSI
    178         pop     xDI
     217%if TMPL_BITS != 64
     218        mov     ss, di
     219        pop     es
     220%endif
    179221        jmp     .return
    180 %ifndef TMPL_16BIT
    181222TMPL_BEGIN_TEXT
    182 %endif
    183223
    184224
     
    192232        ;
    193233.print_str:
    194         push    xSI                     ; we setup ds:xSI to point to the thing.
    195 %if TMPL_BITS != 64
    196         mov     bl, byte VAR_CALLER_MODE
    197         and     bl, BS3_MODE_CODE_MASK
    198         cmp     bl, BS3_MODE_CODE_V86
    199         jne     .print_str_not_v8086
    200         ;; @todo this gets complicated _fast_. Later.
    201 .print_str_not_v8086:
    202 %endif
     234;;%if TMPL_BITS != 64
     235;;        mov     bl, byte VAR_CALLER_MODE
     236;;        and     bl, BS3_MODE_CODE_MASK
     237;;        cmp     bl, BS3_MODE_CODE_V86
     238;;        jne     .print_str_not_v8086
     239;;        ;; @todo this gets complicated _fast_. Later.
     240;;.print_str_not_v8086:
     241;;%endif
    203242        int3
    204243        jmp     .return
     
    216255        mov     xBX, xSP                ; xBP = BS3REGCTX pointer.
    217256        call    .save_context
     257
    218258
    219259%if TMPL_BITS == 32
     
    225265        mov     xBX, xAX
    226266%endif
    227         ; Prepare the last call frame.
    228         BS3_ONLY_16BIT_STMT push    ss
    229         push    xBX
     267        push    xBX                     ; Save pointer for the final restore call.
    230268
    231269        ; Convert the register context from whatever it is to ring-0.
     270        BS3_ONLY_64BIT_STMT sub     rsp, 10h
    232271        BS3_ONLY_16BIT_STMT push    ss
    233272        push    xBX
     
    236275        push    xAX
    237276        BS3_CALL Bs3RegCtxConvertToRingX, 2
    238         add     xSP, sCB
     277        add     xSP, sCB BS3_ONLY_64BIT(+ 10h)
    239278
    240279        ; Restore the register context (does not return).
    241280        pop     xBX                     ; restore saved pointer.
     281        BS3_ONLY_64BIT_STMT sub     rsp, 18h
    242282        BS3_ONLY_16BIT_STMT push    ss
    243283        push    xBX
     
    251291.return:
    252292        pop     xBX                     ; saved mode
     293        mov     [BS3_DATA16_WRT(g_bBs3CurrentMode)], bl
    253294%if TMPL_BITS == 16
    254295        and     bl, BS3_MODE_CODE_MASK
    255296        cmp     bl, BS3_MODE_CODE_V86
    256297        je      .return_to_v8086_from_16bit_krnl
    257 %endif
    258         pop     xDX
    259         pop     xCX
    260         pop     xAX
    261         pop     xBX
    262 %ifndef TMPL_64BIT
     298        cmp     bl, BS3_MODE_CODE_32
     299        je      .return_to_32bit_from_16bit_krnl
     300 %if TMPL_MODE == BS3_MODE_SYS_RM || TMPL_MODE == BS3_MODE_SYS_PE16
     301        cmp     byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80286
     302        jbe     .return_pre_80386
     303 %endif
     304
     305        popfd
     306        pop     esp
     307        pop     ebp
     308%endif
     309        pop     sDI
     310        pop     sSI
     311        pop     sDX
     312        pop     sCX
     313        pop     sAX
     314        pop     sBX
     315%if TMPL_BITS != 64
    263316        pop     ds
    264 %endif
    265317        leave
    266 %ifdef TMPL_64BIT
     318        iret
     319%else
     320        leave                           ; skips fake ds
    267321        iretq
    268 %else
     322%endif
     323
     324%if TMPL_BITS == 16
     325 %if TMPL_MODE == BS3_MODE_SYS_RM || TMPL_MODE == BS3_MODE_SYS_PE16
     326        ; Variant of the above for 80286 and older.
     327.return_pre_80386:
     328        add     sp, 0ch
     329        pop     di
     330        pop     di
     331        pop     si
     332        pop     si
     333        pop     dx
     334        pop     dx
     335        pop     cx
     336        pop     cx
     337        pop     ax
     338        pop     ax
     339        pop     bx
     340        pop     bx
     341        pop     ds
     342        pop     bp
    269343        iret
    270 %endif
    271 
    272 %if TMPL_BITS == 16
     344 %endif
     345
    273346.return_to_v8086_from_16bit_krnl:
    274347        int3
    275348        jmp     .return_to_v8086_from_16bit_krnl
    276 %endif
    277 
     349
     350        ;
     351        ; Returning to 32-bit code may require us to expand and seed the eip
     352        ; and esp addresses in the iret frame since these are truncated when
     353        ; using a 16-bit interrupt handler.
     354        ;
     355        ; Incoming stack:        New stack diff cpl:
     356        ;   bp + 0ah: [ss]
     357        ;   bp + 08h: [sp]         bx + 38h: [ss]       New stack same cpl:
     358        ;   bp + 06h: flags
     359        ;   bp + 04h: cs           bx + 34h: [esp]        bx + 30h: eflags
     360        ;   bp + 02h: ip
     361        ;   --------------         bx + 30h: eflags       bx + 2ch: cs
     362        ;   bp + 00h: bp
     363        ;   bp - 02h: ds           bx + 2ch: cs           bx + 28h: eip
     364        ;                                                 -------------
     365        ;   bp - 06h: ebx          bx + 28h: eip          bx + 26h: bp
     366        ;                         --------------          bx + 24h: ds
     367        ;   bp - 0ah: eax          bx + 26h: bp
     368        ;                          bx + 24h: ds           bx + 20h: ebx
     369        ;   bp - 0eh: ecx
     370        ;                          bx + 20h: ebx          bx + 1ch: eax
     371        ;   bp - 12h: edx
     372        ;                          bx + 1ch: eax          bx + 18h: ecx
     373        ;   bp - 16h: esi
     374        ;                          bx + 18h: ecx          bx + 14h: edx
     375        ;   bp - 1ah: edi
     376        ;                          bx + 14h: edx          bx + 10h: esi
     377        ;   bp - 1eh: esp
     378        ;                          bx + 10h: esi          bx + 0ch: edi
     379        ;   bp - 22h: ebp
     380        ;                          bx + 0ch: edi          bx + 08h: esp
     381        ;   bp - 26h: eflags
     382        ;                          bx + 08h: esp          bx + 04h: ebp
     383        ;
     384        ;                          bx + 04h: ebp          bx + 00h: eflags
     385        ;
     386        ;                          bx + 00h: eflags
     387        ;
     388        ;
     389        ; If we're returning to the same CPL, we're still using the stack of
     390        ; the 32-bit caller.  The high ESP word does not need restoring.
     391        ;
     392        ; If we're returning to a lower CPL, there on a 16-bit ring-0 stack,
     393        ; however, the high ESP word is still that of the caller.
     394        ;
     395.return_to_32bit_from_16bit_krnl:
     396        mov     ax, cs
     397        and     al, 3
     398        mov     ah, 3
     399        and     ah, [xBP + xCB*2]
     400        ; The iret frame doubles in size, so allocate more stack.
     401        cmp     al, ah
     402        je      .return_to_32bit_from_16bit_krnl_same_cpl_sub_sp
     403        sub     sp, 2*2
     404.return_to_32bit_from_16bit_krnl_same_cpl_sub_sp:
     405        sub     sp, 3*2
     406        mov     bx, sp
     407        ; Copy the saved registers.
     408        xor     di, di
     409.return_to_32bit_from_16bit_krnl_copy_loop:
     410        mov     ecx, [bp + di - 26h]
     411        mov     [ss:bx + di], ecx
     412        add     di, 4
     413        cmp     di, 28h
     414        jb      .return_to_32bit_from_16bit_krnl_copy_loop
     415        ; Convert the 16-bit iret frame to a 32-bit iret frame.
     416        mov     ecx, [BS3_DATA16_WRT(g_uBs3TrapEipHint)]
     417        mov     cx,  [bp + 02h]         ; ip
     418        mov     [ss:bx + 28h], ecx
     419        mov     ecx, 0f00d0000h
     420        mov     cx,  [bp + 04h]         ; cs
     421        mov     [ss:bx + 2ch], ecx
     422        mov     ecx, [ss:bx]            ; caller eflags
     423        mov     cx,  [bp + 06h]         ; flags
     424        mov     [ss:bx + 30h], ecx
     425        cmp     al, ah
     426        jz      .return_to_32bit_from_16bit_krnl_do_return
     427        mov     ecx, [ss:bx + 08h]      ; caller esp
     428        mov     cx,  [bp + 08h]         ; sp
     429        mov     [ss:bx + 34h], ecx
     430        mov     ecx, 0f00d0000h
     431        mov     cx,  [bp + 0ah]         ; ss
     432        mov     [ss:bx + 38h], ecx
     433.return_to_32bit_from_16bit_krnl_do_return:
     434        popfd
     435        pop     ecx                     ; esp - only the high bits!
     436        mov     cx, sp
     437        mov     esp, ecx
     438        pop     ebp
     439        lea     bp, [bx + 26h]
     440        pop     edi
     441        pop     esi
     442        pop     edx
     443        pop     ecx
     444        pop     eax
     445        pop     ebx
     446        pop     ds
     447        leave
     448        iretd
     449
     450%endif ; 16-bit
    278451
    279452
     
    284457.save_context:
    285458%if TMPL_BITS == 16
    286         cmp     byte [g_uBs3CpuDetected], BS3CPU_80386
     459        cmp     byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80386
    287460        jae     .save_context_full
    288461
     
    342515        mov     al, VAR_CALLER_MODE
    343516        mov     [ss:bx + BS3REGCTX.bMode], al
    344         cmp     byte [g_uBs3CpuDetected], BS3CPU_80286
     517        cmp     byte [BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80286
    345518        jne     .save_context_16_return
    346519        smsw    [ss:bx + BS3REGCTX.cr0]
     
    371544        ; Do the 386+ state saving.
    372545%if TMPL_BITS == 16                     ; save the high word of registered pushed on the stack.
    373         mov     [ss:bx + BS3REGCTX.rax], eax
     546        mov     ecx, VAR_CALLER_AX
     547        mov     [ss:bx + BS3REGCTX.rax], ecx
     548        mov     ecx, VAR_CALLER_CX
    374549        mov     [ss:bx + BS3REGCTX.rcx], ecx
    375         mov     [ss:bx + BS3REGCTX.rdx], edx
    376         mov     [ss:bx + BS3REGCTX.rbx], ebx
    377         mov     [ss:bx + BS3REGCTX.rbp], ebp
    378         mov     [ss:bx + BS3REGCTX.rsp], esp
    379         pushfd
    380         pop     dword [ss:bx + BS3REGCTX.rflags]
     550        mov     ecx, VAR_CALLER_DX
     551        mov     [ss:bx + BS3REGCTX.rdx], ecx
     552        mov     ecx, VAR_CALLER_BX
     553        mov     [ss:bx + BS3REGCTX.rbx], ecx
     554        mov     ecx, VAR_CALLER_EBP
     555        mov     [ss:bx + BS3REGCTX.rbp], ecx
     556        mov     ecx, VAR_CALLER_ESP
     557        mov     [ss:bx + BS3REGCTX.rsp], ecx
     558        mov     ecx, VAR_CALLER_SI
     559        mov     [ss:bx + BS3REGCTX.rsi], ecx
     560        mov     ecx, VAR_CALLER_DI
     561        mov     [ss:bx + BS3REGCTX.rdi], ecx
     562        mov     ecx, VAR_CALLER_EFLAGS
     563        mov     [ss:bx + BS3REGCTX.rflags], ecx
     564 %if TMPL_BITS == 16
     565        ; Seed high EIP word if 32-bit CS.
     566        lar     ecx, [bp + 4]
     567        jnz     .save_context_full_done_16bit_high_word
     568        test    ecx, X86LAR_F_D
     569        jz      .save_context_full_done_16bit_high_word
     570        mov     ecx, [BS3_DATA16_WRT(g_uBs3TrapEipHint)]
     571        mov     [ss:bx + BS3REGCTX.rip], ecx
     572 %endif ; 16-bit
     573.save_context_full_done_16bit_high_word:
    381574%endif
    382575        mov     xAX, VAR_CALLER_AX
     
    470663        mov     [BS3_NOT_64BIT(ss:) xBX + BS3REGCTX.gs], ax
    471664        mov     byte [BS3_NOT_64BIT(ss:) xBX + BS3REGCTX.bCpl], 3
    472 %endif
     665        jmp     .save_context_full_return
     666
     667%endif  ; !64-bit
     668
    473669.save_context_full_return:
    474670        ret
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3kit.h

    r59984 r60000  
    818818
    819819/** The current mode (BS3_MODE_XXX) of CPU \#0. */
    820 extern uint8_t BS3_DATA_NM(g_bBs3CurrentMode);
     820extern uint8_t    BS3_DATA_NM(g_bBs3CurrentMode);
     821
     822/** Hint for 16-bit trap handlers regarding the high word of EIP. */
     823extern uint32_t   BS3_DATA_NM(g_uBs3TrapEipHint);
    821824
    822825
     
    846849# endif
    847850#endif
     851
    848852
    849853
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette