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.


94f743254a11a1e84163c42efc4e877cbc5a2fe9
[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 ;
59 ; VMCS_LAUNCH
60 ;
61 align 8
62 VMCS_LAUNCH:
63         vmlaunch
64         jz      .error_code
65         jc      .error
66
67         mov     eax, VMX_SUCCESS
68         jmp     .return
69 .error
70         mov     eax, VMX_FAIL_INVALID
71         jmp     .return
72 .error_code
73         mov     eax, VMX_FAIL_VALID
74 .return
75         ret
76
77
78
79 ;
80 ; VMCS_RESUME
81 ;
82 align 8
83 VMCS_RESUME:
84         vmresume
85         jz      .error_code
86         jc      .error
87
88         mov     eax, VMX_SUCCESS
89         jmp     .return
90 .error
91         mov     eax, VMX_FAIL_INVALID
92         jmp     .return
93 .error_code
94         mov     eax, VMX_FAIL_VALID
95 .return
96         ret
97
98 align 8
99 SAFE_VM_LAUNCH:
100         pushf
101         pusha
102         mov     eax, HOST_RSP
103         vmwrite eax, esp
104         jz      .esp_err
105         jc      .esp_err
106         jmp     .vm_cont
107
108 .esp_err
109         popa
110         jz      .error_code
111         jc      .error
112 .vm_cont
113         vmlaunch
114         popa
115         jz      .error_code
116         jc      .error  
117
118         mov     eax, VMX_SUCCESS
119         jmp     .return
120 .error
121         mov     eax, VMX_FAIL_INVALID
122         jmp     .return
123 .error_code
124         mov     eax, VMX_FAIL_VALID
125 .return
126         popf
127         ret
128
129
130 ;
131 ; RunVMM
132 ;
133 align 8
134 RunVMM:
135         pusha
136         call    Do_VMM
137         and     eax, eax
138         jnz     .vmm_error
139         jmp     .vm_cont
140
141 .vmm_error
142         popa
143         popa
144         mov     eax, VMM_ERROR
145         jmp     .return
146
147 .vm_cont
148         popa
149         vmresume
150         popa    ; we only get here if there is an error in the vmresume
151                 ; we restore the host state and return an error code
152
153         jz      .error_code
154         jc      .error
155
156         mov     eax, VMX_SUCCESS
157         jmp     .return
158 .error
159         mov     eax, VMX_FAIL_INVALID
160         jmp     .return
161 .error_code
162         mov     eax, VMX_FAIL_VALID
163 .return
164         popf
165         ret
166
167
168
169
170 ;
171 ; Setup_VMCS_GuestState
172 ; Copy all of the Guest registers into the guest state of a vmcs 
173 ;
174
175 align 8
176 InitGuestSelectors:
177         push    ebp
178         mov     ebp, esp
179         push    ebx
180         push    ebx
181
182         mov     ebx, VMCS_GUEST_ES_SELECTOR
183         mov     eax, es
184         vmwrite ebx, eax
185         jz      .error_code
186         jc      .error
187
188         mov     ebx, VMCS_GUEST_CS_SELECTOR
189         mov     eax, cs
190         vmwrite ebx, eax
191         jz      .error_code
192         jc      .error
193
194         mov     ebx, VMCS_GUEST_SS_SELECTOR
195         mov     eax, ss
196         vmwrite ebx, eax
197         jz      .error_code
198         jc      .error
199
200         mov     ebx, VMCS_GUEST_DS_SELECTOR
201         mov     eax, ds
202         vmwrite ebx, eax
203         jz      .error_code
204         jc      .error
205
206         mov     ebx, VMCS_GUEST_FS_SELECTOR
207         mov     eax, fs
208         vmwrite ebx, eax
209         jz      .error_code
210         jc      .error
211
212         mov     ebx, VMCS_GUEST_GS_SELECTOR
213         mov     eax, gs
214         vmwrite ebx, eax
215         jz      .error_code
216         jc      .error
217
218         str     [esp]
219         mov     eax, [esp]
220         mov     ebx, VMCS_GUEST_TR_SELECTOR
221         vmwrite ebx, eax
222         jz      .error_code
223         jc      .error
224
225         mov     eax, VMX_SUCCESS
226         jmp     .return
227 .error
228         mov     eax, VMX_FAIL_INVALID
229         jmp     .return
230 .error_code
231         mov     eax, VMX_FAIL_VALID
232 .return
233         pop     ebx
234         pop     ebx
235         pop     ebp
236         ret
237 ret
238
239 align 8
240 InitGuestDescRegs:
241         push    ebp
242         mov     ebp, esp
243         push    ebx
244         sub     esp, 6
245
246
247         sgdt    [esp]
248         mov     eax, [esp]
249         and     eax, 0xffff
250         mov     ebx, GUEST_GDTR_LIMIT
251         vmwrite ebx, eax
252         jz      .error_code
253         jc      .error
254
255         mov     eax, [esp+2]
256         mov     ebx, GUEST_GDTR_BASE
257         vmwrite ebx, eax
258         jz      .error_code
259         jc      .error
260
261
262         sidt    [esp]
263         mov     eax, [esp]
264         and     eax, 0xffff
265         mov     ebx, GUEST_IDTR_LIMIT
266         vmwrite ebx, eax
267         jz      .error_code
268         jc      .error
269
270         mov     eax, [esp+2]
271         mov     ebx, GUEST_IDTR_BASE
272         vmwrite ebx, eax
273         jz      .error_code
274         jc      .error
275
276
277         sldt    [esp]
278         mov     eax, [esp]      
279         mov     ebx, GUEST_LDTR_BASE
280         vmwrite ebx, eax
281         jz      .error_code
282         jc      .error
283
284
285         mov     eax, 0x00000000
286         mov     ebx, GUEST_LDTR_LIMIT
287         vmwrite ebx, eax
288         jz      .error_code     
289         jc      .error
290
291
292         mov     eax, VMX_SUCCESS
293         jmp     .return
294 .error
295         mov     eax, VMX_FAIL_INVALID
296         jmp     .return
297 .error_code
298         mov     eax, VMX_FAIL_VALID
299 .return
300
301         add     esp, 6
302         pop     ebx
303         pop     ebp
304         ret
305
306
307
308
309
310 align 8
311 InitGuestSegBases:
312         push    ebp
313         mov     ebp, esp
314         push    ebx
315
316
317         mov     eax, dword 0
318         mov     ebx, GUEST_ES_BASE
319         vmwrite ebx, eax
320         jz      .error_code
321         jc      .error
322
323         mov     eax, dword 0
324         mov     ebx, GUEST_CS_BASE
325         vmwrite ebx, eax
326         jz      .error_code
327         jc      .error
328
329         mov     eax, dword 0
330         mov     ebx, GUEST_SS_BASE
331         vmwrite ebx, eax
332         jz      .error_code
333         jc      .error
334
335         mov     eax, dword 0
336         mov     ebx, GUEST_DS_BASE
337         vmwrite ebx, eax
338         jz      .error_code
339         jc      .error
340
341         mov     eax, dword 0
342         mov     ebx, GUEST_FS_BASE
343         vmwrite ebx, eax
344         jz      .error_code
345         jc      .error
346
347         mov     eax, dword 0
348         mov     ebx, GUEST_GS_BASE
349         vmwrite ebx, eax
350         jz      .error_code
351         jc      .error
352
353 ;       mov     eax, dword 0
354         mov     eax, 0x000220a0
355         mov     ebx, GUEST_TR_BASE
356         vmwrite ebx, eax
357         jz      .error_code
358         jc      .error
359
360         mov     eax, VMX_SUCCESS
361         jmp     .return
362 .error
363         mov     eax, VMX_FAIL_INVALID
364         jmp     .return
365 .error_code
366         mov     eax, VMX_FAIL_VALID
367 .return
368
369         pop     ebx
370         pop     ebp
371         ret
372
373 align 8
374 InitGuestSegsAccess:
375         push    ebp
376         mov     ebp, esp
377         push    ebx
378
379         mov     eax, 1100000010010011b
380         mov     ebx, GUEST_ES_ACCESS
381         vmwrite ebx, eax
382         jz      .error_code
383         jc      .error
384
385
386
387         mov     eax, 1100000010011001b
388 ;       mov     eax, 0x0000c099
389         mov     ebx, GUEST_CS_ACCESS
390         vmwrite ebx, eax
391         jz      .error_code
392         jc      .error
393
394 ;       mov     eax, 1100000010010111b
395         mov     eax, 1100000010010011b
396         mov     ebx, GUEST_SS_ACCESS
397         vmwrite ebx, eax
398         jz      .error_code
399         jc      .error
400
401         mov     eax, 1100000010010011b
402         mov     ebx, GUEST_DS_ACCESS
403         vmwrite ebx, eax
404         jz      .error_code
405         jc      .error
406
407
408         mov     eax, 1100000010010011b
409         mov     ebx, GUEST_FS_ACCESS
410         vmwrite ebx, eax
411         jz      .error_code
412         jc      .error
413
414
415         mov     eax, 1100000010010011b
416         mov     ebx, GUEST_GS_ACCESS
417         vmwrite ebx, eax
418         jz      .error_code
419         jc      .error
420
421         mov     eax, 0x10000
422         mov     ebx, GUEST_LDTR_ACCESS
423         vmwrite ebx, eax
424         jz      .error_code
425         jc      .error
426
427         mov     eax, 01000000010001011b
428         mov     ebx, GUEST_TR_ACCESS
429         vmwrite ebx, eax
430         jz      .error_code
431         jc      .error
432
433
434
435         mov     eax, VMX_SUCCESS
436         jmp     .return
437 .error
438         mov     eax, VMX_FAIL_INVALID
439         jmp     .return
440 .error_code
441         mov     eax, VMX_FAIL_VALID
442 .return
443         pop     ebx
444         pop     ebp
445         ret
446
447 ;; Do seg limit
448 align 8
449 InitGuestSegsLimits:
450         push    ebp
451         mov     ebp, esp
452         push    ebx
453
454         
455 ;       mov     eax, 0xffffffff
456         mov     eax, 0xffffffff
457         mov     ebx, GUEST_ES_LIMIT
458         vmwrite ebx, eax
459         jz      .error_code     
460         jc      .error
461
462 ;       mov     eax, 0xffffffff
463         mov     eax, 0xffffffff
464         mov     ebx, GUEST_CS_LIMIT
465         vmwrite ebx, eax
466         jz      .error_code     
467         jc      .error
468
469 ;       mov     eax, 0xffffffff
470         mov     eax, 0xffffffff
471         mov     ebx, GUEST_SS_LIMIT
472         vmwrite ebx, eax
473         jz      .error_code     
474         jc      .error
475
476 ;       mov     eax, 0xffffffff
477         mov     eax, 0xffffffff
478         mov     ebx, GUEST_DS_LIMIT
479         vmwrite ebx, eax
480         jz      .error_code     
481         jc      .error
482
483 ;       mov     eax, 0xffffffff
484         mov     eax, 0xffffffff
485         mov     ebx, GUEST_FS_LIMIT
486         vmwrite ebx, eax
487         jz      .error_code     
488         jc      .error
489
490 ;       mov     eax, 0xffffffff
491         mov     eax, 0xffffffff
492         mov     ebx, GUEST_GS_LIMIT
493         vmwrite ebx, eax
494         jz      .error_code     
495         jc      .error
496
497 ;       mov     eax, 0xffffffff
498         mov     eax, 0x68fff
499         mov     ebx, GUEST_TR_LIMIT
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         pop     ebx
513         pop     ebp
514         ret
515
516
517 align 8
518 Init_VMCS_GuestState:
519         push    ebp
520         mov     ebp, esp
521         push    ebx
522
523         mov     ebx, GUEST_CR3
524         mov     eax, cr3
525         vmwrite ebx, eax
526         jz      .error_code
527         jc      .error
528
529         call    InitGuestSelectors
530         and     eax, 0xffffffff
531         jz      .selDone
532         jmp     .return
533 .selDone
534
535         call    InitGuestDescRegs
536         and     eax, 0xffffffff
537         jz      .descRegsDone
538         jmp     .return
539 .descRegsDone
540
541         call    InitGuestSegBases
542         and     eax, 0xffffffff
543         jz      .descSegBasesDone
544         jmp     .return
545 .descSegBasesDone
546
547
548         call    InitGuestSegsLimits
549         and     eax, 0xffffffff
550         jz      .segsLimitsDone
551         jmp     .return
552 .segsLimitsDone
553
554         call    InitGuestSegsAccess
555         and     eax, 0xffffffff
556         jz      .segsAccessDone
557         jmp     .return
558 .segsAccessDone
559
560         mov     ebx, GUEST_RSP
561         mov     eax, esp
562         vmwrite ebx, eax
563         jz      .error_code
564         jc      .error
565
566         mov     ebx, GUEST_RFLAGS
567         mov     eax, dword 0x00000002
568         vmwrite ebx, eax
569         jz      .error_code
570         jc      .error
571
572         mov     ebx, GUEST_DR7
573         mov     eax, dword 0x00000400
574         vmwrite ebx, eax
575         jz      .error_code
576         jc      .error
577
578         mov     eax, VMX_SUCCESS
579         jmp     .return
580 .error
581         mov     eax, VMX_FAIL_INVALID
582         jmp     .return
583 .error_code
584         mov     eax, VMX_FAIL_VALID
585 .return
586         pop     ebx
587         pop     ebp
588         ret
589
590 ;
591 ; Setup_VMCS_HostState
592 ; Copy all of the host registers into the host state of a vmcs 
593 ;
594
595 align 8
596 InitHostSelectors:
597         push    ebp
598         mov     ebp, esp
599         push    ebx
600         push    ebx
601
602         mov     ebx, VMCS_HOST_ES_SELECTOR
603         mov     eax, es
604         vmwrite ebx, eax
605         jz      .error_code
606         jc      .error
607
608         mov     ebx, VMCS_HOST_CS_SELECTOR
609         mov     eax, cs
610         vmwrite ebx, eax
611         jz      .error_code
612         jc      .error
613
614         mov     ebx, VMCS_HOST_SS_SELECTOR;
615     PrintDebug("VMX revision: 0x%p\n", (void*)vmxon_ptr);
616
617     if (v3_enable_vmx(vmxon_ptr) == 0) {
618         PrintDebug("VMX Enabled\n");
619     } else {
620         PrintError("VMX initialization failure\n");
621         return;
622     }
623         
624
625
626         mov     eax, ss
627         vmwrite ebx, eax
628         jz      .error_code
629         jc      .error
630
631         mov     ebx, VMCS_HOST_DS_SELECTOR
632         mov     eax, ds
633         vmwrite ebx, eax
634         jz      .error_code
635         jc      .error
636
637         mov     ebx, VMCS_HOST_FS_SELECTOR
638         mov     eax, fs
639         vmwrite ebx, eax
640         jz      .error_code
641         jc      .error
642
643         mov     ebx, VMCS_HOST_GS_SELECTOR
644         mov     eax, gs
645         vmwrite ebx, eax
646         jz      .error_code
647         jc      .error
648
649         str     [esp]
650         mov     eax, [esp]
651         mov     ebx, VMCS_HOST_TR_SELECTOR
652         vmwrite ebx, eax
653         jz      .error_code
654         jc      .error
655
656         mov     eax, VMX_SUCCESS
657         jmp     .return
658 .error
659         mov     eax, VMX_FAIL_INVALID
660         jmp     .return
661 .error_code
662         mov     eax, VMX_FAIL_VALID
663 .return
664         pop     ebx
665         pop     ebx
666         pop     ebp
667         ret
668 ret
669
670
671
672
673
674 align 8
675 InitHostBaseRegs:
676         push    ebp
677         mov     ebp, esp
678         push    ebx
679         sub     esp, 6
680
681         sgdt    [esp]
682         mov     eax, [esp+2]
683         mov     ebx, HOST_GDTR_BASE
684         vmwrite ebx, eax
685         jz      .error_code
686         jc      .error
687
688         sidt    [esp]
689         mov     eax, [esp+2]
690         mov     ebx, HOST_IDTR_BASE
691         vmwrite ebx, eax
692         jz      .error_code
693         jc      .error
694
695
696         mov     eax, dword 0
697         mov     ebx, HOST_FS_BASE
698         vmwrite ebx, eax
699         jz      .error_code
700         jc      .error
701
702         mov     eax, dword 0
703         mov     ebx, HOST_GS_BASE
704         vmwrite ebx, eax
705         jz      .error_code
706         jc      .error
707
708         mov     eax, dword 0
709         mov     ebx, HOST_TR_BASE
710         vmwrite ebx, eax
711         jz      .error_code
712         jc      .error
713
714         mov     eax, VMX_SUCCESS
715         jmp     .return
716 .error
717         mov     eax, VMX_FAIL_INVALID
718         jmp     .return
719 .error_code
720         mov     eax, VMX_FAIL_VALID
721 .return
722
723         add     esp, 6
724         pop     ebx
725         pop     ebp
726         ret
727
728
729 align 8
730 Init_VMCS_HostState:
731         push    ebp
732         mov     ebp, esp
733         push    ebx
734         
735         mov     ebx, HOST_CR3
736         mov     eax, cr3
737         vmwrite ebx, eax
738         jz      .error_code
739         jc      .error
740
741
742         mov     ebx, HOST_RSP
743         mov     eax, esp
744         vmwrite ebx, eax
745         jz      .error_code
746         jc      .error
747
748 ;       push    esp
749         call    InitHostSelectors
750         and     eax, 0xffffffff
751         jz      .selDone
752         jmp     .return
753 .selDone
754 ;       push    esp
755         call    InitHostBaseRegs
756         and     eax, 0xffffffff
757         jz      .baseRegsDone
758         jmp     .return
759 .baseRegsDone
760
761
762         mov     eax, VMX_SUCCESS
763         jmp     .return
764 .error
765         mov     eax, VMX_FAIL_INVALID
766         jmp     .return
767 .error_code
768         mov     eax, VMX_FAIL_VALID
769 .return
770         pop     ebx
771         pop     ebp
772         ret
773
774 ;
775 ; Launch_VM - inits a vmcs with an ip and launches it
776 ; [eip = ebp + 8], [vmcs = ebp + 12]
777 ; int Launch_VM(ullont_t VMCS, uint_t eip);
778 ;
779 align 8
780 Launch_VM:
781         push    ebp
782         mov     ebp, esp
783         push    ebx
784         mov     ebx, dword 0
785         vmclear [ebp+8]
786         jz      .error_code
787         jc      .error
788         add     ebx, dword 1
789         vmptrld [ebp+8]
790         jz      .error_code
791         jc      .error
792         mov     eax, dword 0x0000681E
793         add     ebx, dword 1
794         vmwrite eax, [ebp+16]
795         jz      .error_code
796         jc      .error
797         add     ebx, dword 1
798         vmlaunch
799         jz      .error_code
800         jc      .error
801         mov     eax, VMX_SUCCESS
802         jmp     .return
803 .error
804         shl     ebx, 4
805         mov     eax, VMX_FAIL_INVALID
806         or      eax, ebx
807         jmp     .return
808 .error_code
809         shl     ebx, 4
810         mov     eax, VMX_FAIL_VALID
811         or      eax, ebx
812         mov     ebx, dword 0x00004400
813         vmread  eax, ebx
814 .return
815         pop     ebx
816         pop     ebp
817
818         ret
819
820
821 %endif