VirtualBox

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

Last change on this file since 40170 was 40170, checked in by vboxsync, 13 years ago

MSRs and MTRRs, CPUM saved state changed. (linux 2.4.31 seems to ignore the capabilites when it comes to fixed MTRRs.)

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

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