Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Release 1.0
[palacios.git] / palacios / src / palacios / vmx_lowlevel.asm
1 ; -*- fundamental -*- 
2 ;;
3 ;; This file is part of the Palacios Virtual Machine Monitor developed
4 ;; by the V3VEE Project with funding from the United States National 
5 ;; Science Foundation and the Department of Energy.  
6 ;;
7 ;; The V3VEE Project is a joint project between Northwestern University
8 ;; and the University of New Mexico.  You can find out more at 
9 ;; http://www.v3vee.org
10 ;;
11 ;; Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu> 
12 ;; Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org> 
13 ;; All rights reserved.
14 ;;
15 ;; Author: Jack Lange <jarusl@cs.northwestern.edu>
16 ;;
17 ;; This is free software.  You are permitted to use,
18 ;; redistribute, and modify it as specified in the file "V3VEE_LICENSE".
19 ;;
20
21 %ifndef VMX_ASM
22 %define VMX_ASM
23
24
25 %include "defs.asm"
26 %include "symbol.asm"
27
28
29 %include "vmcs_fields.asm"
30
31 VMX_SUCCESS equ 0x00000000
32 VMX_FAIL_INVALID equ 0x00000001
33 VMX_FAIL_VALID  equ 0x00000002
34 VMM_ERROR       equ 0x00000003
35
36 [BITS 32]
37
38 IMPORT Do_VMM
39
40
41 ; VMX Functions
42 EXPORT VMCS_READ
43 EXPORT VMCS_WRITE
44 EXPORT VMCS_CLEAR
45 EXPORT VMCS_LOAD
46 EXPORT VMCS_STORE
47 EXPORT Enable_VMX
48 EXPORT Disable_VMX
49 EXPORT Launch_VM
50 EXPORT VMCS_LAUNCH
51 EXPORT VMCS_RESUME
52 EXPORT RunVMM
53 EXPORT SAFE_VM_LAUNCH
54 EXPORT Init_VMCS_HostState
55 EXPORT Init_VMCS_GuestState
56         
57 ;
58 ; Enable_VMX - Turn on VMX
59 ;
60 align 8
61 Enable_VMX:
62         push    ebp
63         mov     ebp, esp
64         push    ebx
65         mov     ebx, cr4
66         or      ebx, dword 0x00002000
67         mov     cr4, ebx
68         mov     ebx, cr0
69         or      ebx, dword 0x80000021
70         mov     cr0, ebx
71         vmxon   [ebp+8]
72         pop     ebx
73         pop     ebp
74         mov     eax, VMX_SUCCESS
75         jnc     .return
76         mov     eax, VMX_FAIL_INVALID
77 .return
78         ret
79
80         
81 ;
82 ; VMREAD  - read a value from a VMCS
83 ;
84 align 8
85 VMCS_READ:
86         push    ebp
87         mov     ebp, esp
88         push    ecx
89         push    ebx
90
91         mov     ecx, [ebp + 8]
92         mov     ebx,[ebp + 12]
93 ;       lea     ebx, ebp
94         vmread  [ebx], ecx
95
96         pop     ebx
97         pop     ecx
98         pop     ebp
99         jz      .error_code
100         jc      .error
101
102         mov     eax, VMX_SUCCESS
103         jmp     .return
104 .error
105         mov     eax, VMX_FAIL_INVALID
106         jmp     .return
107 .error_code
108         mov     eax, VMX_FAIL_VALID
109 .return
110         ret
111
112 ;
113 ; VMWRITE - write a value to a VMCS
114 align 8
115 VMCS_WRITE:
116         push    ebp
117         mov     ebp, esp
118         push    ebx
119
120         mov     eax, [ebp + 8]
121         mov     ebx, [ebp + 12]
122         vmwrite eax, [ebx]
123
124         pop     ebx
125         pop     ebp
126         jz      .error_code
127         jc      .error
128
129         mov     eax, VMX_SUCCESS
130         jmp     .return
131 .error
132         mov     eax, VMX_FAIL_INVALID
133         jmp     .return
134 .error_code
135         mov     eax, VMX_FAIL_VALID
136 .return
137         ret
138
139 ;
140 ; VMCLEAR - Initializes a VMCS
141 ;
142 align 8
143 VMCS_CLEAR:
144         vmclear [esp+4]
145         jz      .error_code
146         jc      .error
147
148         mov     eax, VMX_SUCCESS
149         jmp     .return
150 .error
151         mov     eax, VMX_FAIL_INVALID
152         jmp     .return
153 .error_code
154         mov     eax, VMX_FAIL_VALID
155 .return
156         ret
157
158
159
160 ;
161 ; VMCS_LOAD - load a VMCS 
162 ;
163 align 8
164 VMCS_LOAD:
165         vmptrld [esp+4]
166         jz      .error_code
167         jc      .error
168
169         mov     eax, VMX_SUCCESS
170         jmp     .return
171 .error
172         mov     eax, VMX_FAIL_INVALID
173         jmp     .return
174 .error_code
175         mov     eax, VMX_FAIL_VALID
176 .return
177         ret
178
179
180
181 ;
182 ; VMCS_STORE - Store a VMCS
183 ;
184 align 8
185 VMCS_STORE:
186         mov     eax, [esp+4]
187         vmptrst [eax]
188         jz      .error_code
189         jc      .error
190
191         mov     eax, VMX_SUCCESS
192         jmp     .return
193 .error
194         mov     eax, VMX_FAIL_INVALID
195         jmp     .return
196 .error_code
197         mov     eax, VMX_FAIL_VALID
198 .return
199         ret
200
201
202 ;
203 ; VMCS_LAUNCH
204 ;
205 align 8
206 VMCS_LAUNCH:
207         vmlaunch
208         jz      .error_code
209         jc      .error
210
211         mov     eax, VMX_SUCCESS
212         jmp     .return
213 .error
214         mov     eax, VMX_FAIL_INVALID
215         jmp     .return
216 .error_code
217         mov     eax, VMX_FAIL_VALID
218 .return
219         ret
220
221
222
223 ;
224 ; VMCS_RESUME
225 ;
226 align 8
227 VMCS_RESUME:
228         vmresume
229         jz      .error_code
230         jc      .error
231
232         mov     eax, VMX_SUCCESS
233         jmp     .return
234 .error
235         mov     eax, VMX_FAIL_INVALID
236         jmp     .return
237 .error_code
238         mov     eax, VMX_FAIL_VALID
239 .return
240         ret
241
242 align 8
243 SAFE_VM_LAUNCH:
244         pushf
245         pusha
246         mov     eax, HOST_RSP
247         vmwrite eax, esp
248         jz      .esp_err
249         jc      .esp_err
250         jmp     .vm_cont
251
252 .esp_err
253         popa
254         jz      .error_code
255         jc      .error
256 .vm_cont
257         vmlaunch
258         popa
259         jz      .error_code
260         jc      .error  
261
262         mov     eax, VMX_SUCCESS
263         jmp     .return
264 .error
265         mov     eax, VMX_FAIL_INVALID
266         jmp     .return
267 .error_code
268         mov     eax, VMX_FAIL_VALID
269 .return
270         popf
271         ret
272
273
274 ;
275 ; RunVMM
276 ;
277 align 8
278 RunVMM:
279         pusha
280         call    Do_VMM
281         and     eax, eax
282         jnz     .vmm_error
283         jmp     .vm_cont
284
285 .vmm_error
286         popa
287         popa
288         mov     eax, VMM_ERROR
289         jmp     .return
290
291 .vm_cont
292         popa
293         vmresume
294         popa    ; we only get here if there is an error in the vmresume
295                 ; we restore the host state and return an error code
296
297         jz      .error_code
298         jc      .error
299
300         mov     eax, VMX_SUCCESS
301         jmp     .return
302 .error
303         mov     eax, VMX_FAIL_INVALID
304         jmp     .return
305 .error_code
306         mov     eax, VMX_FAIL_VALID
307 .return
308         popf
309         ret
310
311
312
313
314 ;
315 ; Setup_VMCS_GuestState
316 ; Copy all of the Guest registers into the guest state of a vmcs 
317 ;
318
319 align 8
320 InitGuestSelectors:
321         push    ebp
322         mov     ebp, esp
323         push    ebx
324         push    ebx
325
326         mov     ebx, VMCS_GUEST_ES_SELECTOR
327         mov     eax, es
328         vmwrite ebx, eax
329         jz      .error_code
330         jc      .error
331
332         mov     ebx, VMCS_GUEST_CS_SELECTOR
333         mov     eax, cs
334         vmwrite ebx, eax
335         jz      .error_code
336         jc      .error
337
338         mov     ebx, VMCS_GUEST_SS_SELECTOR
339         mov     eax, ss
340         vmwrite ebx, eax
341         jz      .error_code
342         jc      .error
343
344         mov     ebx, VMCS_GUEST_DS_SELECTOR
345         mov     eax, ds
346         vmwrite ebx, eax
347         jz      .error_code
348         jc      .error
349
350         mov     ebx, VMCS_GUEST_FS_SELECTOR
351         mov     eax, fs
352         vmwrite ebx, eax
353         jz      .error_code
354         jc      .error
355
356         mov     ebx, VMCS_GUEST_GS_SELECTOR
357         mov     eax, gs
358         vmwrite ebx, eax
359         jz      .error_code
360         jc      .error
361
362         str     [esp]
363         mov     eax, [esp]
364         mov     ebx, VMCS_GUEST_TR_SELECTOR
365         vmwrite ebx, eax
366         jz      .error_code
367         jc      .error
368
369         mov     eax, VMX_SUCCESS
370         jmp     .return
371 .error
372         mov     eax, VMX_FAIL_INVALID
373         jmp     .return
374 .error_code
375         mov     eax, VMX_FAIL_VALID
376 .return
377         pop     ebx
378         pop     ebx
379         pop     ebp
380         ret
381 ret
382
383 align 8
384 InitGuestDescRegs:
385         push    ebp
386         mov     ebp, esp
387         push    ebx
388         sub     esp, 6
389
390
391         sgdt    [esp]
392         mov     eax, [esp]
393         and     eax, 0xffff
394         mov     ebx, GUEST_GDTR_LIMIT
395         vmwrite ebx, eax
396         jz      .error_code
397         jc      .error
398
399         mov     eax, [esp+2]
400         mov     ebx, GUEST_GDTR_BASE
401         vmwrite ebx, eax
402         jz      .error_code
403         jc      .error
404
405
406         sidt    [esp]
407         mov     eax, [esp]
408         and     eax, 0xffff
409         mov     ebx, GUEST_IDTR_LIMIT
410         vmwrite ebx, eax
411         jz      .error_code
412         jc      .error
413
414         mov     eax, [esp+2]
415         mov     ebx, GUEST_IDTR_BASE
416         vmwrite ebx, eax
417         jz      .error_code
418         jc      .error
419
420
421         sldt    [esp]
422         mov     eax, [esp]      
423         mov     ebx, GUEST_LDTR_BASE
424         vmwrite ebx, eax
425         jz      .error_code
426         jc      .error
427
428
429         mov     eax, 0x00000000
430         mov     ebx, GUEST_LDTR_LIMIT
431         vmwrite ebx, eax
432         jz      .error_code     
433         jc      .error
434
435
436         mov     eax, VMX_SUCCESS
437         jmp     .return
438 .error
439         mov     eax, VMX_FAIL_INVALID
440         jmp     .return
441 .error_code
442         mov     eax, VMX_FAIL_VALID
443 .return
444
445         add     esp, 6
446         pop     ebx
447         pop     ebp
448         ret
449
450
451
452
453
454 align 8
455 InitGuestSegBases:
456         push    ebp
457         mov     ebp, esp
458         push    ebx
459
460
461         mov     eax, dword 0
462         mov     ebx, GUEST_ES_BASE
463         vmwrite ebx, eax
464         jz      .error_code
465         jc      .error
466
467         mov     eax, dword 0
468         mov     ebx, GUEST_CS_BASE
469         vmwrite ebx, eax
470         jz      .error_code
471         jc      .error
472
473         mov     eax, dword 0
474         mov     ebx, GUEST_SS_BASE
475         vmwrite ebx, eax
476         jz      .error_code
477         jc      .error
478
479         mov     eax, dword 0
480         mov     ebx, GUEST_DS_BASE
481         vmwrite ebx, eax
482         jz      .error_code
483         jc      .error
484
485         mov     eax, dword 0
486         mov     ebx, GUEST_FS_BASE
487         vmwrite ebx, eax
488         jz      .error_code
489         jc      .error
490
491         mov     eax, dword 0
492         mov     ebx, GUEST_GS_BASE
493         vmwrite ebx, eax
494         jz      .error_code
495         jc      .error
496
497 ;       mov     eax, dword 0
498         mov     eax, 0x000220a0
499         mov     ebx, GUEST_TR_BASE
500         vmwrite ebx, eax
501         jz      .error_code
502         jc      .error
503
504         mov     eax, VMX_SUCCESS
505         jmp     .return
506 .error
507         mov     eax, VMX_FAIL_INVALID
508         jmp     .return
509 .error_code
510         mov     eax, VMX_FAIL_VALID
511 .return
512
513         pop     ebx
514         pop     ebp
515         ret
516
517 align 8
518 InitGuestSegsAccess:
519         push    ebp
520         mov     ebp, esp
521         push    ebx
522
523         mov     eax, 1100000010010011b
524         mov     ebx, GUEST_ES_ACCESS
525         vmwrite ebx, eax
526         jz      .error_code
527         jc      .error
528
529
530
531         mov     eax, 1100000010011001b
532 ;       mov     eax, 0x0000c099
533         mov     ebx, GUEST_CS_ACCESS
534         vmwrite ebx, eax
535         jz      .error_code
536         jc      .error
537
538 ;       mov     eax, 1100000010010111b
539         mov     eax, 1100000010010011b
540         mov     ebx, GUEST_SS_ACCESS
541         vmwrite ebx, eax
542         jz      .error_code
543         jc      .error
544
545         mov     eax, 1100000010010011b
546         mov     ebx, GUEST_DS_ACCESS
547         vmwrite ebx, eax
548         jz      .error_code
549         jc      .error
550
551
552         mov     eax, 1100000010010011b
553         mov     ebx, GUEST_FS_ACCESS
554         vmwrite ebx, eax
555         jz      .error_code
556         jc      .error
557
558
559         mov     eax, 1100000010010011b
560         mov     ebx, GUEST_GS_ACCESS
561         vmwrite ebx, eax
562         jz      .error_code
563         jc      .error
564
565         mov     eax, 0x10000
566         mov     ebx, GUEST_LDTR_ACCESS
567         vmwrite ebx, eax
568         jz      .error_code
569         jc      .error
570
571         mov     eax, 01000000010001011b
572         mov     ebx, GUEST_TR_ACCESS
573         vmwrite ebx, eax
574         jz      .error_code
575         jc      .error
576
577
578
579         mov     eax, VMX_SUCCESS
580         jmp     .return
581 .error
582         mov     eax, VMX_FAIL_INVALID
583         jmp     .return
584 .error_code
585         mov     eax, VMX_FAIL_VALID
586 .return
587         pop     ebx
588         pop     ebp
589         ret
590
591 ;; Do seg limit
592 align 8
593 InitGuestSegsLimits:
594         push    ebp
595         mov     ebp, esp
596         push    ebx
597
598         
599 ;       mov     eax, 0xffffffff
600         mov     eax, 0xffffffff
601         mov     ebx, GUEST_ES_LIMIT
602         vmwrite ebx, eax
603         jz      .error_code     
604         jc      .error
605
606 ;       mov     eax, 0xffffffff
607         mov     eax, 0xffffffff
608         mov     ebx, GUEST_CS_LIMIT
609         vmwrite ebx, eax
610         jz      .error_code     
611         jc      .error
612
613 ;       mov     eax, 0xffffffff
614         mov     eax, 0xffffffff
615         mov     ebx, GUEST_SS_LIMIT
616         vmwrite ebx, eax
617         jz      .error_code     
618         jc      .error
619
620 ;       mov     eax, 0xffffffff
621         mov     eax, 0xffffffff
622         mov     ebx, GUEST_DS_LIMIT
623         vmwrite ebx, eax
624         jz      .error_code     
625         jc      .error
626
627 ;       mov     eax, 0xffffffff
628         mov     eax, 0xffffffff
629         mov     ebx, GUEST_FS_LIMIT
630         vmwrite ebx, eax
631         jz      .error_code     
632         jc      .error
633
634 ;       mov     eax, 0xffffffff
635         mov     eax, 0xffffffff
636         mov     ebx, GUEST_GS_LIMIT
637         vmwrite ebx, eax
638         jz      .error_code     
639         jc      .error
640
641 ;       mov     eax, 0xffffffff
642         mov     eax, 0x68fff
643         mov     ebx, GUEST_TR_LIMIT
644         vmwrite ebx, eax
645         jz      .error_code     
646         jc      .error
647
648         mov     eax, VMX_SUCCESS
649         jmp     .return
650 .error
651         mov     eax, VMX_FAIL_INVALID
652         jmp     .return
653 .error_code
654         mov     eax, VMX_FAIL_VALID
655 .return
656         pop     ebx
657         pop     ebp
658         ret
659
660
661 align 8
662 Init_VMCS_GuestState:
663         push    ebp
664         mov     ebp, esp
665         push    ebx
666
667         mov     ebx, GUEST_CR3
668         mov     eax, cr3
669         vmwrite ebx, eax
670         jz      .error_code
671         jc      .error
672
673         call    InitGuestSelectors
674         and     eax, 0xffffffff
675         jz      .selDone
676         jmp     .return
677 .selDone
678
679         call    InitGuestDescRegs
680         and     eax, 0xffffffff
681         jz      .descRegsDone
682         jmp     .return
683 .descRegsDone
684
685         call    InitGuestSegBases
686         and     eax, 0xffffffff
687         jz      .descSegBasesDone
688         jmp     .return
689 .descSegBasesDone
690
691
692         call    InitGuestSegsLimits
693         and     eax, 0xffffffff
694         jz      .segsLimitsDone
695         jmp     .return
696 .segsLimitsDone
697
698         call    InitGuestSegsAccess
699         and     eax, 0xffffffff
700         jz      .segsAccessDone
701         jmp     .return
702 .segsAccessDone
703
704         mov     ebx, GUEST_RSP
705         mov     eax, esp
706         vmwrite ebx, eax
707         jz      .error_code
708         jc      .error
709
710         mov     ebx, GUEST_RFLAGS
711         mov     eax, dword 0x00000002
712         vmwrite ebx, eax
713         jz      .error_code
714         jc      .error
715
716         mov     ebx, GUEST_DR7
717         mov     eax, dword 0x00000400
718         vmwrite ebx, eax
719         jz      .error_code
720         jc      .error
721
722         mov     eax, VMX_SUCCESS
723         jmp     .return
724 .error
725         mov     eax, VMX_FAIL_INVALID
726         jmp     .return
727 .error_code
728         mov     eax, VMX_FAIL_VALID
729 .return
730         pop     ebx
731         pop     ebp
732         ret
733
734 ;
735 ; Setup_VMCS_HostState
736 ; Copy all of the host registers into the host state of a vmcs 
737 ;
738
739 align 8
740 InitHostSelectors:
741         push    ebp
742         mov     ebp, esp
743         push    ebx
744         push    ebx
745
746         mov     ebx, VMCS_HOST_ES_SELECTOR
747         mov     eax, es
748         vmwrite ebx, eax
749         jz      .error_code
750         jc      .error
751
752         mov     ebx, VMCS_HOST_CS_SELECTOR
753         mov     eax, cs
754         vmwrite ebx, eax
755         jz      .error_code
756         jc      .error
757
758         mov     ebx, VMCS_HOST_SS_SELECTOR
759         mov     eax, ss
760         vmwrite ebx, eax
761         jz      .error_code
762         jc      .error
763
764         mov     ebx, VMCS_HOST_DS_SELECTOR
765         mov     eax, ds
766         vmwrite ebx, eax
767         jz      .error_code
768         jc      .error
769
770         mov     ebx, VMCS_HOST_FS_SELECTOR
771         mov     eax, fs
772         vmwrite ebx, eax
773         jz      .error_code
774         jc      .error
775
776         mov     ebx, VMCS_HOST_GS_SELECTOR
777         mov     eax, gs
778         vmwrite ebx, eax
779         jz      .error_code
780         jc      .error
781
782         str     [esp]
783         mov     eax, [esp]
784         mov     ebx, VMCS_HOST_TR_SELECTOR
785         vmwrite ebx, eax
786         jz      .error_code
787         jc      .error
788
789         mov     eax, VMX_SUCCESS
790         jmp     .return
791 .error
792         mov     eax, VMX_FAIL_INVALID
793         jmp     .return
794 .error_code
795         mov     eax, VMX_FAIL_VALID
796 .return
797         pop     ebx
798         pop     ebx
799         pop     ebp
800         ret
801 ret
802
803
804
805
806
807 align 8
808 InitHostBaseRegs:
809         push    ebp
810         mov     ebp, esp
811         push    ebx
812         sub     esp, 6
813
814         sgdt    [esp]
815         mov     eax, [esp+2]
816         mov     ebx, HOST_GDTR_BASE
817         vmwrite ebx, eax
818         jz      .error_code
819         jc      .error
820
821         sidt    [esp]
822         mov     eax, [esp+2]
823         mov     ebx, HOST_IDTR_BASE
824         vmwrite ebx, eax
825         jz      .error_code
826         jc      .error
827
828
829         mov     eax, dword 0
830         mov     ebx, HOST_FS_BASE
831         vmwrite ebx, eax
832         jz      .error_code
833         jc      .error
834
835         mov     eax, dword 0
836         mov     ebx, HOST_GS_BASE
837         vmwrite ebx, eax
838         jz      .error_code
839         jc      .error
840
841         mov     eax, dword 0
842         mov     ebx, HOST_TR_BASE
843         vmwrite ebx, eax
844         jz      .error_code
845         jc      .error
846
847         mov     eax, VMX_SUCCESS
848         jmp     .return
849 .error
850         mov     eax, VMX_FAIL_INVALID
851         jmp     .return
852 .error_code
853         mov     eax, VMX_FAIL_VALID
854 .return
855
856         add     esp, 6
857         pop     ebx
858         pop     ebp
859         ret
860
861
862 align 8
863 Init_VMCS_HostState:
864         push    ebp
865         mov     ebp, esp
866         push    ebx
867         
868         mov     ebx, HOST_CR3
869         mov     eax, cr3
870         vmwrite ebx, eax
871         jz      .error_code
872         jc      .error
873
874
875         mov     ebx, HOST_RSP
876         mov     eax, esp
877         vmwrite ebx, eax
878         jz      .error_code
879         jc      .error
880
881 ;       push    esp
882         call    InitHostSelectors
883         and     eax, 0xffffffff
884         jz      .selDone
885         jmp     .return
886 .selDone
887 ;       push    esp
888         call    InitHostBaseRegs
889         and     eax, 0xffffffff
890         jz      .baseRegsDone
891         jmp     .return
892 .baseRegsDone
893
894
895         mov     eax, VMX_SUCCESS
896         jmp     .return
897 .error
898         mov     eax, VMX_FAIL_INVALID
899         jmp     .return
900 .error_code
901         mov     eax, VMX_FAIL_VALID
902 .return
903         pop     ebx
904         pop     ebp
905         ret
906
907 ;
908 ; Launch_VM - inits a vmcs with an ip and launches it
909 ; [eip = ebp + 8], [vmcs = ebp + 12]
910 ; int Launch_VM(ullont_t VMCS, uint_t eip);
911 ;
912 align 8
913 Launch_VM:
914         push    ebp
915         mov     ebp, esp
916         push    ebx
917         mov     ebx, dword 0
918         vmclear [ebp+8]
919         jz      .error_code
920         jc      .error
921         add     ebx, dword 1
922         vmptrld [ebp+8]
923         jz      .error_code
924         jc      .error
925         mov     eax, dword 0x0000681E
926         add     ebx, dword 1
927         vmwrite eax, [ebp+16]
928         jz      .error_code
929         jc      .error
930         add     ebx, dword 1
931         vmlaunch
932         jz      .error_code
933         jc      .error
934         mov     eax, VMX_SUCCESS
935         jmp     .return
936 .error
937         shl     ebx, 4
938         mov     eax, VMX_FAIL_INVALID
939         or      eax, ebx
940         jmp     .return
941 .error_code
942         shl     ebx, 4
943         mov     eax, VMX_FAIL_VALID
944         or      eax, ebx
945         mov     ebx, dword 0x00004400
946         vmread  eax, ebx
947 .return
948         pop     ebx
949         pop     ebp
950
951         ret
952
953
954 %endif