VirtualBox

source: vbox/trunk/src/VBox/VMM/CPUMInternal.mac@ 12329

Last change on this file since 12329 was 10687, checked in by vboxsync, 16 years ago

Save the FPU control word and MXCSR on entry and restore them afterwards. (VT-x & AMD-V)
Security measure so the guest can't cause fpu/sse exceptions as we no longer restore the entire
host fpu state.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.3 KB
Line 
1; $Id: CPUMInternal.mac 10687 2008-07-16 09:22:28Z vboxsync $
2;; @file
3; CPUM - Internal header file.
4;
5
6;
7; Copyright (C) 2006-2007 Sun Microsystems, Inc.
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; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18; Clara, CA 95054 USA or visit http://www.sun.com if you need
19; additional information or have any questions.
20;
21
22%include "VBox/asmdefs.mac"
23
24%define CPUM_USED_FPU RT_BIT(0)
25%define CPUM_USED_FPU_SINCE_REM RT_BIT(1)
26%define CPUM_USE_SYSENTER RT_BIT(2)
27%define CPUM_USE_SYSCALL RT_BIT(3)
28%define CPUM_USE_DEBUG_REGS_HOST RT_BIT(4)
29%define CPUM_USE_DEBUG_REGS RT_BIT(5)
30
31%define CPUM_HANDLER_DS 1
32%define CPUM_HANDLER_ES 2
33%define CPUM_HANDLER_FS 3
34%define CPUM_HANDLER_GS 4
35%define CPUM_HANDLER_IRET 5
36%define CPUM_HANDLER_TYPEMASK 0ffh
37%define CPUM_HANDLER_CTXCORE_IN_EBP RT_BIT(31)
38
39%define VMMGCRET_USED_FPU 040000000h
40
41%define FPUSTATE_SIZE 512
42
43;; if anyone figures how to do %if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBIRD_32BIT_KERNEL) in
44; nasm please tell / fix this hack.
45%ifdef VBOX_WITH_HYBIRD_32BIT_KERNEL
46 %define fVBOX_WITH_HYBIRD_32BIT_KERNEL 1
47%else
48 %define fVBOX_WITH_HYBIRD_32BIT_KERNEL 0
49%endif
50
51struc CPUM
52 .offVM resd 1
53 .pCPUMGC RTGCPTR32_RES 1 ; Guest Context pointer
54 .pCPUMHC RTHCPTR_RES 1 ; Host Context pointer
55
56
57 ;
58 ; Host context state
59 ;
60 alignb 32
61 .Host.fpu resb FPUSTATE_SIZE
62
63%if HC_ARCH_BITS == 64 || fVBOX_WITH_HYBIRD_32BIT_KERNEL
64 ;.Host.rax resq 1 - scratch
65 .Host.rbx resq 1
66 ;.Host.rcx resq 1 - scratch
67 ;.Host.rdx resq 1 - scratch
68 .Host.rdi resq 1
69 .Host.rsi resq 1
70 .Host.rbp resq 1
71 .Host.rsp resq 1
72 ;.Host.r8 resq 1 - scratch
73 ;.Host.r9 resq 1 - scratch
74 .Host.r10 resq 1
75 .Host.r11 resq 1
76 .Host.r12 resq 1
77 .Host.r13 resq 1
78 .Host.r14 resq 1
79 .Host.r15 resq 1
80 ;.Host.rip resd 1 - scratch
81 .Host.rflags resq 1
82%endif
83%if HC_ARCH_BITS == 32
84 ;.Host.eax resd 1 - scratch
85 .Host.ebx resd 1
86 ;.Host.edx resd 1 - scratch
87 ;.Host.ecx resd 1 - scratch
88 .Host.edi resd 1
89 .Host.esi resd 1
90 .Host.ebp resd 1
91 .Host.eflags resd 1
92 ;.Host.eip resd 1 - scratch
93 ; lss pair!
94 .Host.esp resd 1
95%endif
96 .Host.ss resw 1
97 .Host.ssPadding resw 1
98 .Host.gs resw 1
99 .Host.gsPadding resw 1
100 .Host.fs resw 1
101 .Host.fsPadding resw 1
102 .Host.es resw 1
103 .Host.esPadding resw 1
104 .Host.ds resw 1
105 .Host.dsPadding resw 1
106 .Host.cs resw 1
107 .Host.csPadding resw 1
108
109%if HC_ARCH_BITS == 32 && fVBOX_WITH_HYBIRD_32BIT_KERNEL == 0
110 .Host.cr0 resd 1
111 ;.Host.cr2 resd 1 - scratch
112 .Host.cr3 resd 1
113 .Host.cr4 resd 1
114
115 .Host.dr0 resd 1
116 .Host.dr1 resd 1
117 .Host.dr2 resd 1
118 .Host.dr3 resd 1
119 .Host.dr6 resd 1
120 .Host.dr7 resd 1
121
122 .Host.gdtr resb 6 ; GDT limit + linear address
123 .Host.gdtrPadding resw 1
124 .Host.idtr resb 6 ; IDT limit + linear address
125 .Host.idtrPadding resw 1
126 .Host.ldtr resw 1
127 .Host.ldtrPadding resw 1
128 .Host.tr resw 1
129 .Host.trPadding resw 1
130
131 .Host.SysEnterPadding resd 1
132 .Host.SysEnter.cs resq 1
133 .Host.SysEnter.eip resq 1
134 .Host.SysEnter.esp resq 1
135
136%else ; 64-bit
137
138 .Host.cr0 resq 1
139 ;.Host.cr2 resq 1 - scratch
140 .Host.cr3 resq 1
141 .Host.cr4 resq 1
142 .Host.cr8 resq 1
143
144 .Host.dr0 resq 1
145 .Host.dr1 resq 1
146 .Host.dr2 resq 1
147 .Host.dr3 resq 1
148 .Host.dr6 resq 1
149 .Host.dr7 resq 1
150
151 .Host.gdtr resb 10 ; GDT limit + linear address
152 .Host.gdtrPadding resw 1
153 .Host.idtr resb 10 ; IDT limit + linear address
154 .Host.idtrPadding resw 1
155 .Host.ldtr resw 1
156 .Host.ldtrPadding resw 1
157 .Host.tr resw 1
158 .Host.trPadding resw 1
159
160 .Host.SysEnter.cs resq 1
161 .Host.SysEnter.eip resq 1
162 .Host.SysEnter.esp resq 1
163 .Host.FSbase resq 1
164 .Host.GSbase resq 1
165 .Host.efer resq 1
166%endif ; 64-bit
167
168
169 ;
170 ; Hypervisor Context.
171 ; (Identical to .Host.*)
172 ;
173 alignb 32 ; the padding
174 .Hyper.fpu resb FPUSTATE_SIZE
175
176 .Hyper.edi resq 1
177 .Hyper.esi resq 1
178 .Hyper.ebp resq 1
179 .Hyper.eax resq 1
180 .Hyper.ebx resq 1
181 .Hyper.edx resq 1
182 .Hyper.ecx resq 1
183 .Hyper.esp resq 1
184 .Hyper.lss_esp resd 1
185 .Hyper.ss resw 1
186 .Hyper.ssPadding resw 1
187 .Hyper.gs resw 1
188 .Hyper.gsPadding resw 1
189 .Hyper.fs resw 1
190 .Hyper.fsPadding resw 1
191 .Hyper.es resw 1
192 .Hyper.esPadding resw 1
193 .Hyper.ds resw 1
194 .Hyper.dsPadding resw 1
195 .Hyper.cs resw 1
196 .Hyper.csPadding resw 3
197 .Hyper.eflags resq 1
198 .Hyper.eip resq 1
199 .Hyper.r8 resq 1
200 .Hyper.r9 resq 1
201 .Hyper.r10 resq 1
202 .Hyper.r11 resq 1
203 .Hyper.r12 resq 1
204 .Hyper.r13 resq 1
205 .Hyper.r14 resq 1
206 .Hyper.r15 resq 1
207
208 .Hyper.esHid.u64Base resq 1
209 .Hyper.esHid.u32Limit resd 1
210 .Hyper.esHid.Attr resd 1
211
212 .Hyper.csHid.u64Base resq 1
213 .Hyper.csHid.u32Limit resd 1
214 .Hyper.csHid.Attr resd 1
215
216 .Hyper.ssHid.u64Base resq 1
217 .Hyper.ssHid.u32Limit resd 1
218 .Hyper.ssHid.Attr resd 1
219
220 .Hyper.dsHid.u64Base resq 1
221 .Hyper.dsHid.u32Limit resd 1
222 .Hyper.dsHid.Attr resd 1
223
224 .Hyper.fsHid.u64Base resq 1
225 .Hyper.fsHid.u32Limit resd 1
226 .Hyper.fsHid.Attr resd 1
227
228 .Hyper.gsHid.u64Base resq 1
229 .Hyper.gsHid.u32Limit resd 1
230 .Hyper.gsHid.Attr resd 1
231
232 .Hyper.cr0 resq 1
233 .Hyper.cr2 resq 1
234 .Hyper.cr3 resq 1
235 .Hyper.cr4 resq 1
236
237 .Hyper.dr0 resq 1
238 .Hyper.dr1 resq 1
239 .Hyper.dr2 resq 1
240 .Hyper.dr3 resq 1
241 .Hyper.dr4 resq 1
242 .Hyper.dr5 resq 1
243 .Hyper.dr6 resq 1
244 .Hyper.dr7 resq 1
245
246 .Hyper.gdtr resb 10 ; GDT limit + linear address
247 .Hyper.gdtrPadding resw 1
248 .Hyper.idtr resb 10 ; IDT limit + linear address
249 .Hyper.idtrPadding resw 1
250 .Hyper.ldtr resw 1
251 .Hyper.ldtrPadding resw 1
252 .Hyper.tr resw 1
253 .Hyper.trPadding resw 1
254
255 .Hyper.SysEnter.cs resb 8
256 .Hyper.SysEnter.eip resb 8
257 .Hyper.SysEnter.esp resb 8
258
259 .Hyper.msrEFER resb 8
260 .Hyper.msrSTAR resb 8
261 .Hyper.msrPAT resb 8
262 .Hyper.msrLSTAR resb 8
263 .Hyper.msrCSTAR resb 8
264 .Hyper.msrSFMASK resb 8
265 .Hyper.msrKERNELGSBASE resb 8
266
267 .Hyper.ldtrHid.u64Base resq 1
268 .Hyper.ldtrHid.u32Limit resd 1
269 .Hyper.ldtrHid.Attr resd 1
270
271 .Hyper.trHid.u64Base resq 1
272 .Hyper.trHid.u32Limit resd 1
273 .Hyper.trHid.Attr resd 1
274
275 ; padding
276;;;; .Hyper.padding resd 6
277
278
279
280 ;
281 ; Guest context state
282 ; (Identical to the two above chunks)
283 ;
284 alignb 32
285 .Guest.fpu resb FPUSTATE_SIZE
286
287 .Guest.edi resq 1
288 .Guest.esi resq 1
289 .Guest.ebp resq 1
290 .Guest.eax resq 1
291 .Guest.ebx resq 1
292 .Guest.edx resq 1
293 .Guest.ecx resq 1
294 .Guest.esp resq 1
295 .Guest.lss_esp resd 1
296 .Guest.ss resw 1
297 .Guest.ssPadding resw 1
298 .Guest.gs resw 1
299 .Guest.gsPadding resw 1
300 .Guest.fs resw 1
301 .Guest.fsPadding resw 1
302 .Guest.es resw 1
303 .Guest.esPadding resw 1
304 .Guest.ds resw 1
305 .Guest.dsPadding resw 1
306 .Guest.cs resw 1
307 .Guest.csPadding resw 3
308 .Guest.eflags resq 1
309 .Guest.eip resq 1
310 .Guest.r8 resq 1
311 .Guest.r9 resq 1
312 .Guest.r10 resq 1
313 .Guest.r11 resq 1
314 .Guest.r12 resq 1
315 .Guest.r13 resq 1
316 .Guest.r14 resq 1
317 .Guest.r15 resq 1
318
319 .Guest.esHid.u64Base resq 1
320 .Guest.esHid.u32Limit resd 1
321 .Guest.esHid.Attr resd 1
322
323 .Guest.csHid.u64Base resq 1
324 .Guest.csHid.u32Limit resd 1
325 .Guest.csHid.Attr resd 1
326
327 .Guest.ssHid.u64Base resq 1
328 .Guest.ssHid.u32Limit resd 1
329 .Guest.ssHid.Attr resd 1
330
331 .Guest.dsHid.u64Base resq 1
332 .Guest.dsHid.u32Limit resd 1
333 .Guest.dsHid.Attr resd 1
334
335 .Guest.fsHid.u64Base resq 1
336 .Guest.fsHid.u32Limit resd 1
337 .Guest.fsHid.Attr resd 1
338
339 .Guest.gsHid.u64Base resq 1
340 .Guest.gsHid.u32Limit resd 1
341 .Guest.gsHid.Attr resd 1
342
343 .Guest.cr0 resq 1
344 .Guest.cr2 resq 1
345 .Guest.cr3 resq 1
346 .Guest.cr4 resq 1
347
348 .Guest.dr0 resq 1
349 .Guest.dr1 resq 1
350 .Guest.dr2 resq 1
351 .Guest.dr3 resq 1
352 .Guest.dr4 resq 1
353 .Guest.dr5 resq 1
354 .Guest.dr6 resq 1
355 .Guest.dr7 resq 1
356
357 .Guest.gdtr resb 10 ; GDT limit + linear address
358 .Guest.gdtrPadding resw 1
359 .Guest.idtr resb 10 ; IDT limit + linear address
360 .Guest.idtrPadding resw 1
361 .Guest.ldtr resw 1
362 .Guest.ldtrPadding resw 1
363 .Guest.tr resw 1
364 .Guest.trPadding resw 1
365
366 .Guest.SysEnter.cs resb 8
367 .Guest.SysEnter.eip resb 8
368 .Guest.SysEnter.esp resb 8
369
370 .Guest.msrEFER resb 8
371 .Guest.msrSTAR resb 8
372 .Guest.msrPAT resb 8
373 .Guest.msrLSTAR resb 8
374 .Guest.msrCSTAR resb 8
375 .Guest.msrSFMASK resb 8
376 .Guest.msrKERNELGSBASE resb 8
377
378 .Guest.ldtrHid.u64Base resq 1
379 .Guest.ldtrHid.u32Limit resd 1
380 .Guest.ldtrHid.Attr resd 1
381
382 .Guest.trHid.u64Base resq 1
383 .Guest.trHid.u32Limit resd 1
384 .Guest.trHid.Attr resd 1
385
386 ; padding
387;;;; .Guest.padding resd 6
388
389
390
391 ;
392 ; Other stuff.
393 ;
394 alignb 32
395 ; hypervisor core context.
396 .pHyperCoreR3 RTR3PTR_RES 1
397 .pHyperCoreR0 RTR0PTR_RES 1
398 .pHyperCoreGC RTGCPTR32_RES 1
399 ;...
400 .fUseFlags resd 1
401 .fChanged resd 1
402 .fValidHiddenSelRegs resd 1
403
404 ; CPUID eax=1
405 .CPUFeatures.edx resd 1
406 .CPUFeatures.ecx resd 1
407
408 ; CPUID eax=0x80000001
409 .CPUFeaturesExt.edx resd 1
410 .CPUFeaturesExt.ecx resd 1
411
412 .enmCPUVendor resd 1
413
414 ; CR4 masks
415 .CR4.AndMask resd 1
416 .CR4.OrMask resd 1
417 ; entered rawmode?
418 .fRawEntered resb 1
419%if RTHCPTR_CB == 8
420 .abPadding resb 7
421%else
422 .abPadding resb 3
423%endif
424
425 ; CPUID leafs
426 .aGuestCpuIdStd resb 16*6
427 .aGuestCpuIdExt resb 16*10
428 .aGuestCpuIdCentaur resb 16*4
429 .GuestCpuIdDef resb 16
430
431 ; CPUMCTX debug stuff...
432 .GuestEntry resb 1024
433
434endstruc
435
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