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.


major VMX update
[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    8(%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 #define restore_registers(location) \
39         mov     location, %rax;         \
40         mov     (%rax), %rdi;           \
41         mov     8(%rax), %rsi;          \
42         mov     16(%rax), %rbp;         \
43         mov     32(%rax), %rbx;         \
44         mov     40(%rax), %rdx;         \
45         mov 48(%rax), %rcx;             \
46                                         \
47         mov     64(%rax), %r8;          \
48         mov     72(%rax), %r9;          \
49         mov     80(%rax), %r10;         \
50         mov     88(%rax), %r11;         \
51         mov     96(%rax), %r12;         \
52         mov     104(%rax), %r13;        \
53         mov     112(%rax), %r14;        \
54         mov     120(%rax), %r15;        \
55         pushq %rbx;                     \
56         movq 56(%rax), %rbx;            \
57         movq %rbx, %rax;                \
58         popq %rbx;
59
60 #define save_ctrl_regs(location)  \
61     pushq %rax;              \
62     pushq %rbx;              \
63     movq location, %rax;     \
64     movq %cr2, %rbx;         \
65     movq %rbx, 8(%rax);      \
66     popq %rbx;               \
67     popq %rax
68
69 #define restore_ctrl_regs(location)  \
70     pushq %rax;              \
71     pushq %rbx;              \
72     movq location, %rax;     \
73     movq 8(%rax), %rbx;      \
74     movq %rbx, %cr2;         \
75     popq %rbx;               \
76     popq %rax
77
78 #define PUSHA    \
79     push %rax;   \
80     push %rbx;   \
81     push %rcx;   \
82     push %rdx;   \
83     push %rbp;   \
84     push %rdi;   \
85     push %rsi;   \
86     push %r8 ;   \
87     push %r9 ;   \
88     push %r10;   \
89     push %r11;   \
90     push %r12;   \
91     push %r13;   \
92     push %r14;   \
93     push %r15;   
94
95 #define POPA     \
96     pop %r15;    \
97     pop %r14;    \
98     pop %r13;    \
99     pop %r12;    \
100     pop %r11;    \
101     pop %r10;    \
102     pop %r9 ;    \
103     pop %r8 ;    \
104     pop %rsi;    \
105     pop %rdi;    \
106     pop %rbp;    \
107     pop %rdx;    \
108     pop %rcx;    \
109     pop %rbx;    \
110     pop %rax;    
111
112
113 #define PRE_LAUNCH(return_target)       \
114     pushf;                              \
115     PUSHA;                              \
116     pushq %rdi;                         \
117     pushq %rdx;                         \
118                                         \
119     movq %rsp, %rax;                    \
120     movq $VMCS_HOST_RSP, %rbx;          \
121     vmwrite %rax, %rbx;                 \
122     jz .Lfail_valid;                    \
123     jc .Lfail_invalid;                  \
124                                         \
125     movq return_target, %rax;           \
126     movq $VMCS_HOST_RIP, %rbx;          \
127     vmwrite %rax, %rbx;                 \
128     jz .Lfail_valid;                    \
129     jc .Lfail_invalid;                  \
130                                         \
131     restore_ctrl_regs(%rdx);            \
132     restore_registers(%rdi);
133
134
135
136
137 .align 8
138 .globl v3_vmx_resume
139 // vm_regs = %rdi, guest_info * = %rsi, ctrl_regs = %rdx
140 v3_vmx_resume:
141
142     PRE_LAUNCH($vmx_resume_ret);
143
144     vmresume
145
146 vmx_resume_ret:
147     jz .Lfail_valid
148     jc .Lfail_invalid
149     jmp .Lnormal_exit
150
151
152 .align 8
153 .globl v3_vmx_launch
154 // vm_regs = %rdi, guest_info * = %rsi, ctrl_regs = %rdx
155 v3_vmx_launch:
156
157     PRE_LAUNCH($vmx_launch_ret);
158
159     vmlaunch
160
161 vmx_launch_ret:
162     jz .Lfail_valid
163     jc .Lfail_invalid
164     jmp .Lnormal_exit
165
166
167
168
169 .Lfail_valid:
170     addq $16, %rsp
171     POPA
172     popf
173     movq $VMX_FAIL_VALID, %rax
174     jmp .Lreturn
175
176 .Lfail_invalid:
177     addq $16, %rsp
178     POPA
179     popf
180     movq $VMX_FAIL_INVALID, %rax
181     jmp .Lreturn
182
183 .Lvmm_failure:
184     addq $24, %rsp
185     movq $VMM_FAILURE, %rax
186     jmp .Lreturn
187
188
189 .Lnormal_exit:
190     save_registers(16(%rsp));
191     save_ctrl_regs(16(%rsp));
192     addq $16, %rsp
193     POPA
194     popf
195     xorq %rax, %rax
196     jmp .Lreturn
197
198
199 .Lreturn:
200     ret
201     
202 #else
203
204 #define save_resgisters(location)       \
205         pushl   %eax;                   \
206         movl    location, %eax;         \
207         movl    %edi, (%eax);           \
208         movl    %esi, 8(%eax);          \
209         movl    %ebp, 16(%eax);         \
210         movl    $0, 24(%eax);           \
211         movl    %ebx, 32(%eax);         \
212         movl    %edx, 40(%eax);         \
213         movl    %ecx, 48(%eax);         \
214         pushl   %ebx;                   \
215         movl    8(%esp), %ebx;          \
216         movl    %ebx, 56(%eax);         \
217         popl    %ebx;                   \
218         popl    %eax;                   
219         
220
221 #define restore_registers(location) \
222         pushl   %eax;                   \
223         movl    location, %eax;         \
224         movl    (%eax), %edi;           \
225         movl    8(%eax), %esi;          \
226         movl    16(%eax), %ebp;         \
227         movl    32(%eax), %ebx;         \
228         movl    40(%eax), %edx;         \
229         movl    48(%eax), %ecx;         \
230         popl    %eax;
231  
232 #define PUSHA    \
233     push %eax;   \
234     push %ebx;   \
235     push %ecx;   \
236     push %edx;   \
237     push %ebp;   \
238     push %edi;   \
239     push %esi;
240
241 #define POPA     \
242     pop %esi;    \
243     pop %edi;    \
244     pop %ebp;    \
245     pop %edx;    \
246     pop %ecx;    \
247     pop %ebx;    \
248     pop %eax;
249
250 .align 8
251 .globl v3_vmx_exit_handler
252 v3_vmx_exit_handler:
253     save_registers(4(%esp))
254     addl $8, %esp
255     POPA
256     popf
257     pushl %edi
258     call v3_handle_vmx_exit
259
260     andl %eax, %eax
261     jnz .Lvmm_failure
262
263 v3_vmx_vmresume:
264     popl %edi
265     pushf
266     PUSHA
267     pushl %edi
268     restore_registers(%rdi)
269
270     vmresume
271
272     addl $8, %esp
273     jz .Lfail_valid
274     jc .Lfail_invalid
275     jmp .Lreturn
276
277 .align 8
278 .globl v3_vmx_vmlaunch
279 // vm_regs = %edi
280 v3_vmx_vmlaunch:
281     cli
282     pushf
283     PUSHA
284     pushl %edi
285
286     movl %esp, %eax
287     movl $VMCS_HOST_RSP, %ebx
288     vmwrite %eax, %ebx
289     jz .Lfail_valid
290     jc .Lfail_invalid
291
292     movl $v3_vmx_exit_handler, %eax
293     movl $VMCS_HOST_RIP, %ebx
294     vmwrite %eax, %ebx
295     jz .Lfail_valid
296     jc .Lfail_invalid
297
298     restore_registers(%edi)
299
300     vmlaunch
301     jz .Lfail_valid
302     jc .Lfail_invalid
303     jmp .Lreturn
304
305 .Lfail_valid:
306     addl $8, %esp
307     POPA
308     movl $VMX_FAIL_VALID, %eax
309     jmp .Lreturn
310
311 .Lfail_invalid:
312     addq $8, %esp
313     POPA
314     movl $MVX_FAIL_INVALID, %eax
315     jmp .Lreturn
316
317 .Lvmm_failure:
318     addq $8, %esp
319     POPA
320     movl $VMM_FAILURE, %eax
321     jmp .Lreturn
322
323 .Lreturn:
324     sti
325     popf
326     ret
327
328 #endif
329