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.


Added shadow page handling, IO and MSR bitmap allocation, and started
[palacios.git] / palacios / src / palacios / vmx_lowlevel.S
1 #;  -*- fundamental -*-
2
3 #define VMX_SUCCESS         0
4 #define VMX_FAIL_INVALID    1
5 #define VMX_FAIL_VALID      2
6 #define VMM_FAILURE         3
7
8 #define VMCS_HOST_RSP       0x00006C14
9 #define VMCS_HOST_RIP       0x00006C16
10
11 #if defined(__V3_64BIT__)
12
13 #define save_registers(location)        \
14         pushq   %rax;                   \
15         movq    location, %rax;         \
16         movq    %rdi, (%rax);           \
17         movq    %rsi, 8(%rax);          \
18         movq    %rbp, 16(%rax);         \
19         movq    $0, 24(%rax);           \
20         movq    %rbx, 32(%rax);         \
21         movq    %rdx, 40(%rax);         \
22         movq    %rcx, 48(%rax);         \
23         pushq   %rbx;                   \
24         movq    16(%rsp), %rbx;         \
25         movq    %rbx, 56(%rax);         \
26         popq    %rbx;                   \
27                                         \
28         movq    %r8, 64(%rax);          \
29         movq    %r9, 72(%rax);          \
30         movq    %r10, 80(%rax);         \
31         movq    %r11, 88(%rax);         \
32         movq    %r12, 96(%rax);         \
33         movq    %r13, 104(%rax);        \
34         movq    %r14, 112(%rax);        \
35         movq    %r15, 120(%rax);        \
36         popq    %rax;                   
37         
38
39 #define restore_registers(location) \
40         push    %rax;                   \
41         mov     location, %rax;         \
42         mov     (%rax), %rdi;           \
43         mov     8(%rax), %rsi;          \
44         mov     16(%rax), %rbp;         \
45         mov     32(%rax), %rbx;         \
46         mov     40(%rax), %rdx;         \
47         mov     48(%rax), %rcx;         \
48                                         \
49         mov     64(%rax), %r8;          \
50         mov     72(%rax), %r9;          \
51         mov     80(%rax), %r10;         \
52         mov     88(%rax), %r11;         \
53         mov     96(%rax), %r12;         \
54         mov     104(%rax), %r13;        \
55         mov     112(%rax), %r14;        \
56         mov     120(%rax), %r15;        \
57         pop     %rax;
58
59
60
61 #define PUSHA    \
62     push %rax;   \
63     push %rbx;   \
64     push %rcx;   \
65     push %rdx;   \
66     push %rbp;   \
67     push %rdi;   \
68     push %rsi;   \
69     push %r8 ;   \
70     push %r9 ;   \
71     push %r10;   \
72     push %r11;   \
73     push %r12;   \
74     push %r13;   \
75     push %r14;   \
76     push %r15;   
77
78 #define POPA     \
79     pop %r15;    \
80     pop %r14;    \
81     pop %r13;    \
82     pop %r12;    \
83     pop %r11;    \
84     pop %r10;    \
85     pop %r9 ;    \
86     pop %r8 ;    \
87     pop %rsi;    \
88     pop %rdi;    \
89     pop %rbp;    \
90     pop %rdx;    \
91     pop %rcx;    \
92     pop %rbx;    \
93     pop %rax;    
94
95 .align 8
96 .globl v3_vmx_exit_handler
97 v3_vmx_exit_handler:
98     save_registers(8(%rsp));
99     addq $8, %rsp
100     POPA
101     popf
102     pushq %rdi
103     pushq %rsi
104     call v3_handle_vmx_exit
105
106     andq %rax, %rax
107     jnz .Lvmm_failure
108
109 v3_vmx_vmresume:
110     pop %rsi
111     pop %rdi
112     pushf
113     PUSHA
114     pushq %rdi
115     restore_registers(%rdi);
116
117     vmresume
118
119     jz .Lfail_valid
120     jc .Lfail_invalid
121     addq $8, %rsp
122     jmp .Lreturn
123
124 .align 8
125 .globl v3_vmx_vmlaunch
126 // vm_regs = %rdi
127 v3_vmx_vmlaunch:
128     cli
129     pushf
130     PUSHA
131     pushq %rdi
132     
133     movq %rsp, %rax
134     movq $VMCS_HOST_RSP, %rbx
135     vmwrite %rax, %rbx
136     jz .Lfail_valid
137     jc .Lfail_invalid
138
139     movq $v3_vmx_exit_handler, %rax
140     movq $VMCS_HOST_RIP, %rbx
141     vmwrite %rax, %rbx
142     jz .Lfail_valid
143     jc .Lfail_invalid
144
145     restore_registers(%rdi);
146
147     vmlaunch
148     jz .Lfail_valid
149     jc .Lfail_invalid
150     jmp .Lreturn
151
152 .Lfail_valid:
153     addq $8, %rsp
154     POPA
155     popf
156     movq $VMX_FAIL_VALID, %rax
157     jmp .Lreturn
158
159 .Lfail_invalid:
160     addq $8, %rsp
161     POPA
162     popf
163     movq $VMX_FAIL_INVALID, %rax
164     jmp .Lreturn
165
166 .Lvmm_failure:
167     addq $16, %rsp
168     movq $VMM_FAILURE, %rax
169     jmp .Lreturn
170
171 .Lreturn:
172     sti
173     ret
174     
175 #else
176
177 #define save_resgisters(location)       \
178         pushl   %eax;                   \
179         movl    location, %eax;         \
180         movl    %edi, (%eax);           \
181         movl    %esi, 8(%eax);          \
182         movl    %ebp, 16(%eax);         \
183         movl    $0, 24(%eax);           \
184         movl    %ebx, 32(%eax);         \
185         movl    %edx, 40(%eax);         \
186         movl    %ecx, 48(%eax);         \
187         pushl   %ebx;                   \
188         movl    8(%esp), %ebx;          \
189         movl    %ebx, 56(%eax);         \
190         popl    %ebx;                   \
191         popl    %eax;                   
192         
193
194 #define restore_registers(location) \
195         pushl   %eax;                   \
196         movl    location, %eax;         \
197         movl    (%eax), %edi;           \
198         movl    8(%eax), %esi;          \
199         movl    16(%eax), %ebp;         \
200         movl    32(%eax), %ebx;         \
201         movl    40(%eax), %edx;         \
202         movl    48(%eax), %ecx;         \
203         popl    %eax;
204  
205 #define PUSHA    \
206     push %eax;   \
207     push %ebx;   \
208     push %ecx;   \
209     push %edx;   \
210     push %ebp;   \
211     push %edi;   \
212     push %esi;
213
214 #define POPA     \
215     pop %esi;    \
216     pop %edi;    \
217     pop %ebp;    \
218     pop %edx;    \
219     pop %ecx;    \
220     pop %ebx;    \
221     pop %eax;
222
223 .align 8
224 .globl v3_vmx_exit_handler
225 v3_vmx_exit_handler:
226     save_registers(4(%esp))
227     addl $8, %esp
228     POPA
229     popf
230     pushl %edi
231     call v3_handle_vmx_exit
232
233     andl %eax, %eax
234     jnz .Lvmm_failure
235
236 v3_vmx_vmresume:
237     popl %edi
238     pushf
239     PUSHA
240     pushl %edi
241     restore_registers(%rdi)
242
243     vmresume
244
245     addl $8, %esp
246     jz .Lfail_valid
247     jc .Lfail_invalid
248     jmp .Lreturn
249
250 .align 8
251 .globl v3_vmx_vmlaunch
252 // vm_regs = %edi
253 v3_vmx_vmlaunch:
254     cli
255     pushf
256     PUSHA
257     pushl %edi
258
259     movl %esp, %eax
260     movl $VMCS_HOST_RSP, %ebx
261     vmwrite %eax, %ebx
262     jz .Lfail_valid
263     jc .Lfail_invalid
264
265     movl $v3_vmx_exit_handler, %eax
266     movl $VMCS_HOST_RIP, %ebx
267     vmwrite %eax, %ebx
268     jz .Lfail_valid
269     jc .Lfail_invalid
270
271     restore_registers(%edi)
272
273     vmlaunch
274     jz .Lfail_valid
275     jc .Lfail_invalid
276     jmp .Lreturn
277
278 .Lfail_valid:
279     addl $8, %esp
280     POPA
281     movl $VMX_FAIL_VALID, %eax
282     jmp .Lreturn
283
284 .Lfail_invalid:
285     addq $8, %esp
286     POPA
287     movl $MVX_FAIL_INVALID, %eax
288     jmp .Lreturn
289
290 .Lvmm_failure:
291     addq $8, %esp
292     POPA
293     movl $VMM_FAILURE, %eax
294     jmp .Lreturn
295
296 .Lreturn:
297     sti
298     popf
299     ret
300
301 #endif
302