VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-mode-SwitchToLM16.asm@ 77922

Last change on this file since 77922 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.8 KB
Line 
1; $Id: bs3-mode-SwitchToLM16.asm 76553 2019-01-01 01:45:53Z vboxsync $
2;; @file
3; BS3Kit - Bs3SwitchToLM16
4;
5
6;
7; Copyright (C) 2007-2019 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27%include "bs3kit-template-header.mac"
28
29
30;;
31; Switch to 16-bit long mode from any other mode.
32;
33; @cproto BS3_DECL(void) Bs3SwitchToLM16(void);
34;
35; @uses Nothing (except possibly high 32-bit and/or upper 64-bit register parts).
36;
37; @remarks Obviously returns to 16-bit mode, even if the caller was in 32-bit
38; or 64-bit mode. It doesn't not preserve the callers ring, but
39; instead changes to ring-0.
40;
41; @remarks Does not require 20h of parameter scratch space in 64-bit mode.
42;
43%if TMPL_BITS == 16
44BS3_GLOBAL_NAME_EX TMPL_NM(Bs3SwitchToLM16_Safe), function , 0
45%endif
46BS3_PROC_BEGIN_MODE Bs3SwitchToLM16, BS3_PBC_NEAR
47%ifdef TMPL_LM16
48 extern BS3_CMN_NM(Bs3SwitchToRing0)
49 call BS3_CMN_NM(Bs3SwitchToRing0)
50 push ax
51 mov ax, BS3_SEL_R0_DS16
52 mov ds, ax
53 mov es, ax
54 pop ax
55 ret
56
57%elifdef TMPL_CMN_LM
58 ;
59 ; Already in long mode, just switch to 16-bit.
60 ;
61 extern BS3_CMN_NM(Bs3SwitchTo16Bit)
62 jmp BS3_CMN_NM(Bs3SwitchTo16Bit)
63
64%else
65 ;
66 ; Switch to LM32 and then switch to 64-bits (IDT & TSS are the same for
67 ; LM16, LM32 and LM64, unlike the rest).
68 ;
69 ; (The long mode switching code is going via 32-bit protected mode, so
70 ; Bs3SwitchToLM32 contains the actual code for switching to avoid
71 ; unnecessary 32-bit -> 64-bit -> 32-bit trips.)
72 ;
73 extern TMPL_NM(Bs3SwitchToLM32)
74 call TMPL_NM(Bs3SwitchToLM32)
75 BS3_SET_BITS 32
76
77 extern _Bs3SwitchTo16Bit_c32
78 %if TMPL_BITS == 16
79 sub esp, 2
80 shr dword [esp], 16
81 %elif TMPL_BITS == 64
82 pop dword [esp + 4]
83 %endif
84 jmp _Bs3SwitchTo16Bit_c32
85%endif
86BS3_PROC_END_MODE Bs3SwitchToLM16
87
88
89%if TMPL_BITS == 16
90;;
91; Custom far stub.
92BS3_BEGIN_TEXT16_FARSTUBS
93BS3_PROC_BEGIN_MODE Bs3SwitchToLM16, BS3_PBC_FAR
94 inc bp
95 push bp
96 mov bp, sp
97
98 ; Call the real thing.
99 call TMPL_NM(Bs3SwitchToLM16)
100
101 %if BS3_MODE_IS_RM_OR_V86(TMPL_MODE)
102 ; Jmp to common code for the tedious conversion.
103 BS3_EXTERN_CMN Bs3SwitchHlpConvRealModeRetfPopBpDecBpAndReturn
104 jmp Bs3SwitchHlpConvRealModeRetfPopBpDecBpAndReturn
105 %else
106 pop bp
107 dec bp
108 retf
109 %endif
110BS3_PROC_END_MODE Bs3SwitchToLM16
111
112%else
113;;
114; Safe far return to non-BS3TEXT16 code.
115BS3_EXTERN_CMN Bs3SwitchHlpConvFlatRetToRetfProtMode
116BS3_BEGIN_TEXT16
117BS3_SET_BITS TMPL_BITS
118BS3_PROC_BEGIN_MODE Bs3SwitchToLM16_Safe, BS3_PBC_NEAR
119 call Bs3SwitchHlpConvFlatRetToRetfProtMode ; Special internal function. Uses nothing, but modifies the stack.
120 call TMPL_NM(Bs3SwitchToLM16)
121 BS3_SET_BITS 16
122 retf
123BS3_PROC_END_MODE Bs3SwitchToLM16_Safe
124
125%endif
126
Note: See TracBrowser for help on using the repository browser.

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