VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMSwitcher/32BitToAMD64.asm@ 14748

Last change on this file since 14748 was 14653, checked in by vboxsync, 16 years ago

Switcher updates

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.4 KB
Line 
1; VMM - World Switchers, 32Bit to AMD64.
2;
3
4;
5; Copyright (C) 2006-2007 Sun Microsystems, Inc.
6;
7; This file is part of VirtualBox Open Source Edition (OSE), as
8; available from http://www.virtualbox.org. This file is free software;
9; you can redistribute it and/or modify it under the terms of the GNU
10; General Public License (GPL) as published by the Free Software
11; Foundation, in version 2 as it comes in the "COPYING" file of the
12; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
13; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
14;
15; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
16; Clara, CA 95054 USA or visit http://www.sun.com if you need
17; additional information or have any questions.
18;
19
20;%define DEBUG_STUFF 1
21;%define STRICT_IF 1
22
23;*******************************************************************************
24;* Defined Constants And Macros *
25;*******************************************************************************
26;; Prefix all names.
27%define NAME_OVERLOAD(name) vmmR3Switcher32BitToAMD64_ %+ name
28
29
30;*******************************************************************************
31;* Header Files *
32;*******************************************************************************
33%include "VBox/asmdefs.mac"
34%include "VBox/x86.mac"
35%include "VBox/cpum.mac"
36%include "VBox/stam.mac"
37%include "VBox/vm.mac"
38%include "CPUMInternal.mac"
39%include "VMMSwitcher/VMMSwitcher.mac"
40
41
42;
43; Start the fixup records
44; We collect the fixups in the .data section as we go along
45; It is therefore VITAL that no-one is using the .data section
46; for anything else between 'Start' and 'End'.
47;
48BEGINDATA
49GLOBALNAME Fixups
50
51
52
53BEGINCODE
54GLOBALNAME Start
55
56BITS 32
57
58;;
59; The C interface.
60;
61BEGINPROC vmmR0HostToGuest
62 %ifdef DEBUG_STUFF
63 COM32_S_NEWLINE
64 COM32_S_CHAR '^'
65 %endif
66
67 %ifdef VBOX_WITH_STATISTICS
68 ;
69 ; Switcher stats.
70 ;
71 FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToGC
72 mov edx, 0ffffffffh
73 STAM_PROFILE_ADV_START edx
74 %endif
75
76 ;
77 ; Call worker.
78 ;
79 FIXUP FIX_HC_CPUM_OFF, 1, 0
80 mov edx, 0ffffffffh
81 push cs ; allow for far return and restore cs correctly.
82 call NAME(vmmR0HostToGuestAsm)
83
84%ifdef VBOX_WITH_STATISTICS
85 ;
86 ; Switcher stats.
87 ;
88 FIXUP FIX_HC_VM_OFF, 1, VM.StatSwitcherToHC
89 mov edx, 0ffffffffh
90 STAM_PROFILE_ADV_STOP edx
91%endif
92
93 ret
94
95ENDPROC vmmR0HostToGuest
96
97; *****************************************************************************
98; vmmR0HostToGuestAsm
99;
100; Phase one of the switch from host to guest context (host MMU context)
101;
102; INPUT:
103; - edx virtual address of CPUM structure (valid in host context)
104;
105; USES/DESTROYS:
106; - eax, ecx, edx, esi
107;
108; ASSUMPTION:
109; - current CS and DS selectors are wide open
110;
111; *****************************************************************************
112ALIGNCODE(16)
113BEGINPROC vmmR0HostToGuestAsm
114 ;;
115 ;; Save CPU host context
116 ;; Skip eax, edx and ecx as these are not preserved over calls.
117 ;;
118 CPUMCPU_FROM_CPUM(edx)
119 ; general registers.
120 mov [edx + CPUMCPU.Host.ebx], ebx
121 mov [edx + CPUMCPU.Host.edi], edi
122 mov [edx + CPUMCPU.Host.esi], esi
123 mov [edx + CPUMCPU.Host.esp], esp
124 mov [edx + CPUMCPU.Host.ebp], ebp
125 ; selectors.
126 mov [edx + CPUMCPU.Host.ds], ds
127 mov [edx + CPUMCPU.Host.es], es
128 mov [edx + CPUMCPU.Host.fs], fs
129 mov [edx + CPUMCPU.Host.gs], gs
130 mov [edx + CPUMCPU.Host.ss], ss
131 ; special registers.
132 sldt [edx + CPUMCPU.Host.ldtr]
133 sidt [edx + CPUMCPU.Host.idtr]
134 sgdt [edx + CPUMCPU.Host.gdtr]
135 str [edx + CPUMCPU.Host.tr]
136 ; flags
137 pushfd
138 pop dword [edx + CPUMCPU.Host.eflags]
139
140 FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
141 ; save MSR_IA32_SYSENTER_CS register.
142 mov ecx, MSR_IA32_SYSENTER_CS
143 mov ebx, edx ; save edx
144 rdmsr ; edx:eax <- MSR[ecx]
145 mov [ebx + CPUMCPU.Host.SysEnter.cs], eax
146 mov [ebx + CPUMCPU.Host.SysEnter.cs + 4], edx
147 xor eax, eax ; load 0:0 to cause #GP upon sysenter
148 xor edx, edx
149 wrmsr
150 xchg ebx, edx ; restore edx
151 jmp short htg_no_sysenter
152
153ALIGNCODE(16)
154htg_no_sysenter:
155
156 ;; handle use flags.
157 mov esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
158 and esi, ~CPUM_USED_FPU ; Clear CPUM_USED_* flags. ;;@todo FPU check can be optimized to use cr0 flags!
159 mov [edx + CPUMCPU.fUseFlags], esi
160
161 ; debug registers.
162 test esi, CPUM_USE_DEBUG_REGS | CPUM_USE_DEBUG_REGS_HOST
163 jz htg_debug_regs_no
164 jmp htg_debug_regs_save_dr7and6
165htg_debug_regs_no:
166
167 ; control registers.
168 mov eax, cr0
169 mov [edx + CPUMCPU.Host.cr0], eax
170 ;Skip cr2; assume host os don't stuff things in cr2. (safe)
171 mov eax, cr3
172 mov [edx + CPUMCPU.Host.cr3], eax
173 mov eax, cr4
174 mov [edx + CPUMCPU.Host.cr4], eax
175
176 ;;
177 ;; Load Intermediate memory context.
178 ;;
179 FIXUP FIX_INTER_32BIT_CR3, 1
180 mov eax, 0ffffffffh
181 mov cr3, eax
182 DEBUG_CHAR('?')
183
184 ;;
185 ;; Jump to identity mapped location
186 ;;
187 FIXUP FIX_GC_2_ID_NEAR_REL, 1, NAME(IDEnterTarget) - NAME(Start)
188 jmp near NAME(IDEnterTarget)
189
190
191 ; We're now on identity mapped pages!
192ALIGNCODE(16)
193GLOBALNAME IDEnterTarget
194 DEBUG_CHAR('2')
195
196 ; 1. Disable paging.
197 mov ebx, cr0
198 and ebx, ~X86_CR0_PG
199 mov cr0, ebx
200 DEBUG_CHAR('2')
201
202 ; 2. Enable PAE.
203 mov ecx, cr4
204 or ecx, X86_CR4_PAE
205 mov cr4, ecx
206
207 ; 3. Load long mode intermediate CR3.
208 FIXUP FIX_INTER_AMD64_CR3, 1
209 mov ecx, 0ffffffffh
210 mov cr3, ecx
211 DEBUG_CHAR('3')
212
213 ; 4. Enable long mode.
214 mov ebp, edx
215 mov ecx, MSR_K6_EFER
216 rdmsr
217 or eax, MSR_K6_EFER_LME
218 wrmsr
219 mov edx, ebp
220 DEBUG_CHAR('4')
221
222 ; 5. Enable paging.
223 or ebx, X86_CR0_PG
224 mov cr0, ebx
225 DEBUG_CHAR('5')
226
227 ; Jump from compatability mode to 64-bit mode.
228 FIXUP FIX_ID_FAR32_TO_64BIT_MODE, 1, NAME(IDEnter64Mode) - NAME(Start)
229 jmp 0ffffh:0fffffffeh
230
231 ;
232 ; We're in 64-bit mode (ds, ss, es, fs, gs are all bogus).
233BITS 64
234ALIGNCODE(16)
235NAME(IDEnter64Mode):
236 DEBUG_CHAR('6')
237 jmp [NAME(pICEnterTarget) wrt rip]
238
239; 64-bit jump target
240NAME(pICEnterTarget):
241FIXUP FIX_HC_64BIT, 0, NAME(ICEnterTarget) - NAME(Start)
242dq 0ffffffffffffffffh
243
244; 64-bit pCpum address.
245NAME(pCpumIC):
246FIXUP FIX_HC_64BIT_CPUM, 0
247dq 0ffffffffffffffffh
248
249 ;
250 ; When we arrive here we're at the 64 bit mode of intermediate context
251 ;
252ALIGNCODE(16)
253GLOBALNAME ICEnterTarget
254 ; at this moment we're in 64-bit mode. let's write something to CPUM
255 ; Load CPUM pointer into rdx
256 mov rdx, [NAME(pCpumIC) wrt rip]
257 ; Load the CPUMCPU offset.
258 mov r8, [rdx + CPUM.ulOffCPUMCPU]
259
260 mov rsi, 012345678h
261 mov [rdx + r8 + CPUMCPU.uPadding], rsi
262
263 ; now let's switch back
264 mov rax, 0666h
265 jmp NAME(VMMGCGuestToHostAsm) ; rax = returncode.
266
267BITS 32
268;;
269; Detour for saving the host DR7 and DR6.
270; esi and edx must be preserved.
271htg_debug_regs_save_dr7and6:
272DEBUG_S_CHAR('s');
273 mov eax, dr7 ; not sure, but if I read the docs right this will trap if GD is set. FIXME!!!
274 mov [edx + CPUMCPU.Host.dr7], eax
275 xor eax, eax ; clear everything. (bit 12? is read as 1...)
276 mov dr7, eax
277 mov eax, dr6 ; just in case we save the state register too.
278 mov [edx + CPUMCPU.Host.dr6], eax
279 jmp htg_debug_regs_no
280
281
282BITS 64
283ENDPROC vmmR0HostToGuestAsm
284
285
286;;
287; Trampoline for doing a call when starting the hyper visor execution.
288;
289; Push any arguments to the routine.
290; Push the argument frame size (cArg * 4).
291; Push the call target (_cdecl convention).
292; Push the address of this routine.
293;
294;
295ALIGNCODE(16)
296BEGINPROC vmmGCCallTrampoline
297%ifdef DEBUG_STUFF
298 COM32_S_CHAR 'c'
299 COM32_S_CHAR 't'
300 COM32_S_CHAR '!'
301%endif
302 int3
303ENDPROC vmmGCCallTrampoline
304
305
306BITS 64
307;;
308; The C interface.
309;
310ALIGNCODE(16)
311BEGINPROC vmmGCGuestToHost
312%ifdef DEBUG_STUFF
313 push esi
314 COM_NEWLINE
315 DEBUG_CHAR('b')
316 DEBUG_CHAR('a')
317 DEBUG_CHAR('c')
318 DEBUG_CHAR('k')
319 DEBUG_CHAR('!')
320 COM_NEWLINE
321 pop esi
322%endif
323 int3
324ENDPROC vmmGCGuestToHost
325
326;;
327; VMMGCGuestToHostAsm
328;
329; This is an alternative entry point which we'll be using
330; when the we have saved the guest state already or we haven't
331; been messing with the guest at all.
332;
333; @param eax Return code.
334; @uses eax, edx, ecx (or it may use them in the future)
335;
336ALIGNCODE(16)
337BEGINPROC VMMGCGuestToHostAsm
338 CPUMCPU_FROM_CPUM(rdx)
339 FIXUP FIX_INTER_AMD64_CR3, 1
340 mov rax, 0ffffffffh
341 mov cr3, rax
342 ;; We're now in intermediate memory context!
343
344 ;;
345 ;; Jump to identity mapped location
346 ;;
347 FIXUP FIX_GC_2_ID_NEAR_REL, 1, NAME(IDExitTarget) - NAME(Start)
348 jmp near NAME(IDExitTarget)
349
350 ; We're now on identity mapped pages!
351ALIGNCODE(16)
352GLOBALNAME IDExitTarget
353BITS 32
354 DEBUG_CHAR('1')
355
356 ; 1. Deactivate long mode by turning off paging.
357 mov ebx, cr0
358 and ebx, ~X86_CR0_PG
359 mov cr0, ebx
360 DEBUG_CHAR('2')
361
362 ; 2. Load 32-bit intermediate page table.
363 FIXUP FIX_INTER_32BIT_CR3, 1
364 mov edx, 0ffffffffh
365 mov cr3, edx
366 DEBUG_CHAR('3')
367
368 ; 3. Disable long mode.
369 mov ecx, MSR_K6_EFER
370 rdmsr
371 DEBUG_CHAR('5')
372 and eax, ~(MSR_K6_EFER_LME)
373 wrmsr
374 DEBUG_CHAR('6')
375
376 ; 3b. Disable PAE.
377 mov eax, cr4
378 and eax, ~X86_CR4_PAE
379 mov cr4, eax
380 DEBUG_CHAR('7')
381
382 ; 4. Enable paging.
383 or ebx, X86_CR0_PG
384 mov cr0, ebx
385 jmp short just_a_jump
386just_a_jump:
387 DEBUG_CHAR('8')
388
389 ;;
390 ;; 5. Jump to guest code mapping of the code and load the Hypervisor CS.
391 ;;
392 FIXUP FIX_ID_2_GC_NEAR_REL, 1, NAME(ICExitTarget) - NAME(Start)
393 jmp near NAME(ICExitTarget)
394
395 ;;
396 ;; When we arrive at this label we're at the
397 ;; intermediate mapping of the switching code.
398 ;;
399BITS 32
400ALIGNCODE(16)
401GLOBALNAME ICExitTarget
402 DEBUG_CHAR('8')
403 FIXUP FIX_HC_CPUM_OFF, 1, 0
404 mov edx, 0ffffffffh
405 CPUMCPU_FROM_CPUM(edx)
406 mov esi, [edx + CPUMCPU.Host.cr3]
407 mov cr3, esi
408
409 ;; now we're in host memory context, let's restore regs
410
411 ; activate host gdt and idt
412 lgdt [edx + CPUMCPU.Host.gdtr]
413 DEBUG_CHAR('0')
414 lidt [edx + CPUMCPU.Host.idtr]
415 DEBUG_CHAR('1')
416
417 ; Restore TSS selector; must mark it as not busy before using ltr (!)
418 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p)
419 movzx eax, word [edx + CPUMCPU.Host.tr] ; eax <- TR
420 and al, 0F8h ; mask away TI and RPL bits, get descriptor offset.
421 add eax, [edx + CPUMCPU.Host.gdtr + 2] ; eax <- GDTR.address + descriptor offset.
422 and dword [eax + 4], ~0200h ; clear busy flag (2nd type2 bit)
423 ltr word [edx + CPUMCPU.Host.tr]
424
425 ; activate ldt
426 DEBUG_CHAR('2')
427 lldt [edx + CPUMCPU.Host.ldtr]
428 ; Restore segment registers
429 mov eax, [edx + CPUMCPU.Host.ds]
430 mov ds, eax
431 mov eax, [edx + CPUMCPU.Host.es]
432 mov es, eax
433 mov eax, [edx + CPUMCPU.Host.fs]
434 mov fs, eax
435 mov eax, [edx + CPUMCPU.Host.gs]
436 mov gs, eax
437 ; restore stack
438 lss esp, [edx + CPUMCPU.Host.esp]
439
440 FIXUP FIX_NO_SYSENTER_JMP, 0, gth_sysenter_no - NAME(Start) ; this will insert a jmp gth_sysenter_no if host doesn't use sysenter.
441
442 ; restore MSR_IA32_SYSENTER_CS register.
443 mov ecx, MSR_IA32_SYSENTER_CS
444 mov eax, [edx + CPUMCPU.Host.SysEnter.cs]
445 mov ebx, [edx + CPUMCPU.Host.SysEnter.cs + 4]
446 xchg edx, ebx ; save/load edx
447 wrmsr ; MSR[ecx] <- edx:eax
448 xchg edx, ebx ; restore edx
449 jmp short gth_sysenter_no
450
451ALIGNCODE(16)
452gth_sysenter_no:
453
454 ;; @todo AMD syscall
455
456 ; Restore FPU if guest has used it.
457 ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
458 mov esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
459 test esi, CPUM_USED_FPU
460 jz near gth_fpu_no
461 mov ecx, cr0
462 and ecx, ~(X86_CR0_TS | X86_CR0_EM)
463 mov cr0, ecx
464
465 FIXUP FIX_NO_FXSAVE_JMP, 0, gth_no_fxsave - NAME(Start) ; this will insert a jmp gth_no_fxsave if fxsave isn't supported.
466 fxsave [edx + CPUMCPU.Guest.fpu]
467 fxrstor [edx + CPUMCPU.Host.fpu]
468 jmp near gth_fpu_no
469
470gth_no_fxsave:
471 fnsave [edx + CPUMCPU.Guest.fpu]
472 mov eax, [edx + CPUMCPU.Host.fpu] ; control word
473 not eax ; 1 means exception ignored (6 LS bits)
474 and eax, byte 03Fh ; 6 LS bits only
475 test eax, [edx + CPUMCPU.Host.fpu + 4] ; status word
476 jz gth_no_exceptions_pending
477
478 ; technically incorrect, but we certainly don't want any exceptions now!!
479 and dword [edx + CPUMCPU.Host.fpu + 4], ~03Fh
480
481gth_no_exceptions_pending:
482 frstor [edx + CPUMCPU.Host.fpu]
483 jmp short gth_fpu_no
484
485ALIGNCODE(16)
486gth_fpu_no:
487
488 ; Control registers.
489 ; Would've liked to have these highere up in case of crashes, but
490 ; the fpu stuff must be done before we restore cr0.
491 mov ecx, [edx + CPUMCPU.Host.cr4]
492 mov cr4, ecx
493 mov ecx, [edx + CPUMCPU.Host.cr0]
494 mov cr0, ecx
495 ;mov ecx, [edx + CPUMCPU.Host.cr2] ; assumes this is waste of time.
496 ;mov cr2, ecx
497
498 ; restore debug registers (if modified) (esi must still be fUseFlags!)
499 ; (must be done after cr4 reload because of the debug extension.)
500 test esi, CPUM_USE_DEBUG_REGS | CPUM_USE_DEBUG_REGS_HOST
501 jz short gth_debug_regs_no
502 jmp gth_debug_regs_restore
503gth_debug_regs_no:
504
505 ; restore general registers.
506 mov eax, edi ; restore return code. eax = return code !!
507 mov edi, [edx + CPUMCPU.Host.edi]
508 mov esi, [edx + CPUMCPU.Host.esi]
509 mov ebx, [edx + CPUMCPU.Host.ebx]
510 mov ebp, [edx + CPUMCPU.Host.ebp]
511 push dword [edx + CPUMCPU.Host.eflags]
512 popfd
513
514%ifdef DEBUG_STUFF
515; COM_S_CHAR '4'
516%endif
517 retf
518
519;;
520; Detour for restoring the host debug registers.
521; edx and edi must be preserved.
522gth_debug_regs_restore:
523 DEBUG_S_CHAR('d')
524 xor eax, eax
525 mov dr7, eax ; paranoia or not?
526 test esi, CPUM_USE_DEBUG_REGS
527 jz short gth_debug_regs_dr7
528 DEBUG_S_CHAR('r')
529 mov eax, [edx + CPUMCPU.Host.dr0]
530 mov dr0, eax
531 mov ebx, [edx + CPUMCPU.Host.dr1]
532 mov dr1, ebx
533 mov ecx, [edx + CPUMCPU.Host.dr2]
534 mov dr2, ecx
535 mov eax, [edx + CPUMCPU.Host.dr3]
536 mov dr3, eax
537gth_debug_regs_dr7:
538 mov ebx, [edx + CPUMCPU.Host.dr6]
539 mov dr6, ebx
540 mov ecx, [edx + CPUMCPU.Host.dr7]
541 mov dr7, ecx
542 jmp gth_debug_regs_no
543
544ENDPROC VMMGCGuestToHostAsm
545
546;;
547; VMMGCGuestToHostAsmHyperCtx
548;
549; This is an alternative entry point which we'll be using
550; when the we have the hypervisor context and need to save
551; that before going to the host.
552;
553; This is typically useful when abandoning the hypervisor
554; because of a trap and want the trap state to be saved.
555;
556; @param eax Return code.
557; @param ecx Points to CPUMCTXCORE.
558; @uses eax,edx,ecx
559ALIGNCODE(16)
560BEGINPROC VMMGCGuestToHostAsmHyperCtx
561 int3
562
563;;
564; VMMGCGuestToHostAsmGuestCtx
565;
566; Switches from Guest Context to Host Context.
567; Of course it's only called from within the GC.
568;
569; @param eax Return code.
570; @param esp + 4 Pointer to CPUMCTXCORE.
571;
572; @remark ASSUMES interrupts disabled.
573;
574ALIGNCODE(16)
575BEGINPROC VMMGCGuestToHostAsmGuestCtx
576 int3
577
578GLOBALNAME End
579;
580; The description string (in the text section).
581;
582NAME(Description):
583 db "32-bits to/from AMD64", 0
584
585extern NAME(Relocate)
586
587;
588; End the fixup records.
589;
590BEGINDATA
591 db FIX_THE_END ; final entry.
592GLOBALNAME FixupsEnd
593
594;;
595; The switcher definition structure.
596ALIGNDATA(16)
597GLOBALNAME Def
598 istruc VMMSWITCHERDEF
599 at VMMSWITCHERDEF.pvCode, RTCCPTR_DEF NAME(Start)
600 at VMMSWITCHERDEF.pvFixups, RTCCPTR_DEF NAME(Fixups)
601 at VMMSWITCHERDEF.pszDesc, RTCCPTR_DEF NAME(Description)
602 at VMMSWITCHERDEF.pfnRelocate, RTCCPTR_DEF NAME(Relocate)
603 at VMMSWITCHERDEF.enmType, dd VMMSWITCHER_32_TO_AMD64
604 at VMMSWITCHERDEF.cbCode, dd NAME(End) - NAME(Start)
605 at VMMSWITCHERDEF.offR0HostToGuest, dd NAME(vmmR0HostToGuest) - NAME(Start)
606 at VMMSWITCHERDEF.offGCGuestToHost, dd NAME(vmmGCGuestToHost) - NAME(Start)
607 at VMMSWITCHERDEF.offGCCallTrampoline, dd NAME(vmmGCCallTrampoline) - NAME(Start)
608 at VMMSWITCHERDEF.offGCGuestToHostAsm, dd NAME(VMMGCGuestToHostAsm) - NAME(Start)
609 at VMMSWITCHERDEF.offGCGuestToHostAsmHyperCtx, dd NAME(VMMGCGuestToHostAsmHyperCtx)- NAME(Start)
610 at VMMSWITCHERDEF.offGCGuestToHostAsmGuestCtx, dd NAME(VMMGCGuestToHostAsmGuestCtx)- NAME(Start)
611 ; disasm help
612 at VMMSWITCHERDEF.offHCCode0, dd 0
613 at VMMSWITCHERDEF.cbHCCode0, dd NAME(IDEnterTarget) - NAME(Start)
614 at VMMSWITCHERDEF.offHCCode1, dd NAME(ICExitTarget) - NAME(Start)
615 at VMMSWITCHERDEF.cbHCCode1, dd NAME(End) - NAME(ICExitTarget)
616 at VMMSWITCHERDEF.offIDCode0, dd NAME(IDEnterTarget) - NAME(Start)
617 at VMMSWITCHERDEF.cbIDCode0, dd NAME(ICEnterTarget) - NAME(IDEnterTarget)
618 at VMMSWITCHERDEF.offIDCode1, dd NAME(IDExitTarget) - NAME(Start)
619 at VMMSWITCHERDEF.cbIDCode1, dd NAME(ICExitTarget) - NAME(IDExitTarget)
620 at VMMSWITCHERDEF.offGCCode, dd NAME(ICEnterTarget) - NAME(Start)
621 at VMMSWITCHERDEF.cbGCCode, dd NAME(IDExitTarget) - NAME(ICEnterTarget)
622
623 iend
624
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