VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-SelFlatCodeToRealMode.asm

Last change on this file was 106061, checked in by vboxsync, 3 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.3 KB
Line 
1; $Id: bs3-cmn-SelFlatCodeToRealMode.asm 106061 2024-09-16 14:03:52Z vboxsync $
2;; @file
3; BS3Kit - Bs3SelFlatCodeToRealMode.
4;
5
6;
7; Copyright (C) 2007-2024 Oracle and/or its affiliates.
8;
9; This file is part of VirtualBox base platform packages, as
10; available from https://www.virtualbox.org.
11;
12; This program is free software; you can redistribute it and/or
13; modify it under the terms of the GNU General Public License
14; as published by the Free Software Foundation, in version 3 of the
15; License.
16;
17; This program is distributed in the hope that it will be useful, but
18; WITHOUT ANY WARRANTY; without even the implied warranty of
19; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20; General Public License for more details.
21;
22; You should have received a copy of the GNU General Public License
23; along with this program; if not, see <https://www.gnu.org/licenses>.
24;
25; The contents of this file may alternatively be used under the terms
26; of the Common Development and Distribution License Version 1.0
27; (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
28; in the VirtualBox distribution, in which case the provisions of the
29; CDDL are applicable instead of those of the GPL.
30;
31; You may elect to license modified versions of this file under the
32; terms and conditions of either the GPL or the CDDL or both.
33;
34; SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
35;
36
37
38;*********************************************************************************************************************************
39;* Header Files *
40;*********************************************************************************************************************************
41%include "bs3kit-template-header.mac"
42
43
44;*********************************************************************************************************************************
45;* Global Variables *
46;*********************************************************************************************************************************
47BS3_EXTERN_DATA16 Bs3RmText16_EndOfSegment
48BS3_EXTERN_DATA16 Bs3X0Text16_EndOfSegment
49BS3_EXTERN_DATA16 Bs3X1Text16_EndOfSegment
50
51
52;
53; Make sure we can get at all the segments.
54;
55BS3_BEGIN_TEXT16
56BS3_BEGIN_RMTEXT16
57BS3_BEGIN_X0TEXT16
58BS3_BEGIN_X1TEXT16
59TMPL_BEGIN_TEXT
60
61
62;;
63; @cproto BS3_CMN_PROTO(uint32_t, Bs3SelRealModeCodeToProtMode,(uint32_t uFlatAddr), false);
64;
65; @uses Only return registers (ax:dx, eax, eax)
66;
67BS3_PROC_BEGIN_CMN Bs3SelFlatCodeToRealMode, BS3_PBC_NEAR
68 BS3_CALL_CONV_PROLOG 1
69 push xBP
70 mov xBP, xSP
71 push xCX
72 push xBX
73%if TMPL_BITS != 16
74 push xDX
75%endif
76
77 ;
78 ; Load the real mode frame number into DX so we can compare with the
79 ; segment frame numbers fixed up by the linker.
80 ;
81 ; Imagine: FlatAddr = 0x054321
82 ;
83 mov dx, [xBP + xCB + cbCurRetAddr + 1] ; dx = 0x0543
84 mov al, [xBP + xCB + cbCurRetAddr + 0] ; al = 0x21
85 mov cl,4
86 shl dx, 4 ; dx = 0x5430
87 shr al, 4 ; al = 0x02
88 or dl, al ; dx = 0x5432
89
90 mov ax, dx
91 sub ax, CGROUP16
92 cmp ax, 1000h
93 jb .bs3text16
94
95 mov ax, dx
96 sub ax, BS3GROUPRMTEXT16
97 mov bx, Bs3RmText16_EndOfSegment wrt BS3GROUPRMTEXT16
98 add bx, 15
99 shr bx, cl
100 cmp ax, bx
101 jb .bs3rmtext16
102
103 mov ax, dx
104 sub ax, BS3GROUPX0TEXT16
105 mov bx, Bs3X0Text16_EndOfSegment wrt BS3GROUPX0TEXT16
106 add bx, 15
107 shr bx, cl
108 cmp ax, bx
109 jb .bs3x0text16
110
111 mov ax, dx
112 sub ax, BS3GROUPX1TEXT16
113 mov bx, Bs3X1Text16_EndOfSegment wrt BS3GROUPX1TEXT16
114 add bx, 15
115 shr bx, cl
116 cmp ax, bx
117 jb .bs3x1text16
118
119 extern BS3_CMN_NM(Bs3Panic)
120 call BS3_CMN_NM(Bs3Panic)
121
122 ;
123 ; Load the real-mode frame into DX and calc the offset in AX.
124 ;
125.bs3x1text16:
126 mov dx, BS3GROUPX1TEXT16
127 jmp .calc_return
128.bs3x0text16:
129 mov dx, BS3GROUPX0TEXT16
130 jmp .calc_return
131.bs3rmtext16:
132 mov dx, BS3GROUPRMTEXT16
133 jmp .calc_return
134.bs3text16:
135 mov dx, CGROUP16
136.calc_return:
137 ; Convert the real-mode frame into the low 16-bit base (BX).
138 mov bx, dx
139 shl bx, cl
140 ; Subtract the 16-bit base from the flat address. (No need to consider
141 ; the top half on either side.)
142 mov ax, [xBP + xCB + cbCurRetAddr + 0]
143 sub ax, bx
144%if TMPL_BITS != 16
145 ; Got a single 32-bit return register here.
146 shl edx, 16
147 mov dx, ax
148 mov eax, edx
149 pop xDX
150%endif
151 pop xBX
152 pop xCX
153 pop xBP
154 BS3_CALL_CONV_EPILOG 1
155 BS3_HYBRID_RET
156BS3_PROC_END_CMN Bs3SelFlatCodeToRealMode
157
158;
159; We may be using the near code in some critical code paths, so don't
160; penalize it.
161;
162BS3_CMN_FAR_STUB Bs3SelFlatCodeToRealMode, 4
163
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