VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/bootsectors/bs3kit/bs3-cmn-UtilSetFullGdtr.asm@ 61533

Last change on this file since 61533 was 60687, checked in by vboxsync, 9 years ago

bs3kit: Enabled full gdt base address loading (and testing).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.6 KB
Line 
1; $Id: bs3-cmn-UtilSetFullGdtr.asm 60687 2016-04-25 12:52:02Z vboxsync $
2;; @file
3; BS3Kit - Bs3UtilSetFullGdtr
4;
5
6;
7; Copyright (C) 2007-2016 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
28;*********************************************************************************************************************************
29;* Header Files *
30;*********************************************************************************************************************************
31%include "bs3kit-template-header.mac"
32
33
34;*********************************************************************************************************************************
35;* External Symbols *
36;*********************************************************************************************************************************
37%if TMPL_BITS == 16
38BS3_EXTERN_DATA16 g_uBs3CpuDetected
39%endif
40%if TMPL_BITS != 64
41BS3_EXTERN_DATA16 g_bBs3CurrentMode
42%endif
43TMPL_BEGIN_TEXT
44
45
46
47;;
48; @cproto BS3_CMN_PROTO_NOSB(void, Bs3UtilSetFullGdtr,(uint16_t cbLimit, uint64_t uBase));
49;
50; @remarks Does not require 20h of parameter scratch space in 64-bit mode.
51; @uses eax/rax; cbLimit on stack in 32-bit mode.
52;
53BS3_PROC_BEGIN_CMN Bs3UtilSetFullGdtr, BS3_PBC_HYBRID
54TONLY16 inc xBP
55 push xBP
56 mov xBP, xSP
57
58%if TMPL_BITS == 64
59 ;
60 ; It doesn't (currently) get any better than 64-bit mode.
61 ;
62 push rdx
63 mov rax, rcx
64 shl rax, 48
65 push rax
66 lgdt [rsp + 6]
67 add rsp, 10h
68
69
70%elif TMPL_BITS == 32
71 ;
72 ; Move the limit up two bytes so we can use it directly.
73 ;
74 shl dword [xBP + xCB + cbCurRetAddr], 16
75
76 ;
77 ; If the system is currently running in long mode, we have to switch to
78 ; it in order to do the job with the highest precision.
79 ;
80 mov al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
81 and al, BS3_MODE_SYS_MASK
82 cmp al, BS3_MODE_SYS_LM
83 je .do_64bit
84
85 ; 32-bit is the best we can do.
86.do_32bit:
87 lgdt [xBP + xCB + cbCurRetAddr + 2]
88 jmp .return
89
90 ; Must switch to long mode and do it there.
91.do_64bit:
92 jmp BS3_SEL_R0_CS64:.in_64bit wrt FLAT
93.in_64bit:
94 BS3_SET_BITS 64
95 lgdt [xSP + 4 + cbCurRetAddr + 2]
96 push BS3_SEL_R0_CS32
97 push .return wrt FLAT
98 o64 retf
99 BS3_SET_BITS 32
100
101
102%elif TMPL_BITS == 16
103 ;
104 ; All options are open here, we can be in any 16-bit mode,
105 ; including real mode.
106 ;
107 mov al, [BS3_DATA16_WRT(g_bBs3CurrentMode)]
108 test al, BS3_MODE_CODE_V86
109 jnz .do_v8086
110 and al, BS3_MODE_SYS_MASK
111 cmp al, BS3_MODE_SYS_LM
112 je .do_64bit
113 cmp al, BS3_MODE_SYS_RM
114 je .do_16bit
115 cmp byte [ BS3_DATA16_WRT(g_uBs3CpuDetected)], BS3CPU_80386
116 jae .do_32bit
117
118 ;
119 ; We're in real mode or in 16-bit protected mode on a 286.
120 ;
121.do_16bit: ;ba x 1 127f5
122 lgdt [xBP + xCB + cbCurRetAddr]
123 jmp .return
124
125 ;
126 ; We're in some kind of protected mode on a 386 or better.
127 ;
128.do_32bit:
129 jmp dword BS3_SEL_R0_CS32:.in_32bit wrt FLAT
130.in_32bit:
131 BS3_SET_BITS 32
132 lgdt [bp + 2 + cbCurRetAddr]
133 jmp BS3_SEL_R0_CS16:.return wrt CGROUP16
134 BS3_SET_BITS 16
135
136 ;
137 ; V8086 mode - need to switch to 32-bit kernel code to do stuff here.
138 ;
139.do_v8086:
140 BS3_EXTERN_CMN Bs3SwitchTo32Bit
141 call Bs3SwitchTo32Bit
142 BS3_SET_BITS 32
143
144 lgdt [xSP + 2 + cbCurRetAddr]
145
146 extern _Bs3SwitchTo16BitV86_c32
147 call _Bs3SwitchTo16BitV86_c32
148 BS3_SET_BITS 16
149 jmp .return
150
151 ;
152 ; System is in long mode, so we can switch to 64-bit mode and do the job there.
153 ;
154.do_64bit:
155 push edx ; save
156 push ss
157 push 0
158 push bp
159 BS3_EXTERN_CMN Bs3SelFar32ToFlat32NoClobber
160 call Bs3SelFar32ToFlat32NoClobber
161 add sp, 6
162 shl edx, 16
163 mov dx, ax
164 mov eax, edx ; eax = flattened ss:bp
165 pop edx ; restore
166 jmp dword BS3_SEL_R0_CS64:.in_64bit wrt FLAT
167.in_64bit:
168 BS3_SET_BITS 64
169 lgdt [rax + 2 + cbCurRetAddr]
170
171 push BS3_SEL_R0_CS16
172 push .return wrt CGROUP16
173 o64 retf
174 BS3_SET_BITS 16
175
176%else
177 %error "TMPL_BITS!"
178%endif
179
180.return:
181 pop xBP
182TONLY16 dec xBP
183 BS3_HYBRID_RET
184BS3_PROC_END_CMN Bs3UtilSetFullGdtr
185
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