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.


Succesfully launches and jumps into the exit handler. Need to write a proper exit...
[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     call v3_handle_vmx_exit
104
105     andq %rax, %rax
106     jnz .Lvmm_failure
107
108 v3_vmx_vmresume:
109     pop %rdi
110     pushf
111     PUSHA
112     pushq %rdi
113     restore_registers(%rdi);
114
115     vmresume
116
117     addq $8, %rsp
118     jz .Lfail_valid
119     jc .Lfail_invalid
120     jmp .Lreturn
121
122 .align 8
123 .globl v3_vmx_vmlaunch
124 // vm_regs = %rdi
125 v3_vmx_vmlaunch:
126     cli
127     pushf
128     PUSHA
129     pushq %rdi
130     
131     movq %rsp, %rax
132     movq $VMCS_HOST_RSP, %rbx
133     vmwrite %rax, %rbx
134     jz .Lfail_valid
135     jc .Lfail_invalid
136
137     movq $v3_vmx_exit_handler, %rax
138     movq $VMCS_HOST_RIP, %rbx
139     vmwrite %rax, %rbx
140     jz .Lfail_valid
141     jc .Lfail_invalid
142
143     restore_registers(%rdi);
144
145     vmlaunch
146     jz .Lfail_valid
147     jc .Lfail_invalid
148     jmp .Lreturn
149
150 .Lfail_valid:
151     addq $8, %rsp
152     POPA
153     movq $VMX_FAIL_VALID, %rax
154     jmp .Lreturn
155
156 .Lfail_invalid:
157     addq $8, %rsp
158     POPA
159     movq $VMX_FAIL_INVALID, %rax
160     jmp .Lreturn
161
162 .Lvmm_failure:
163     addq $8, %rsp
164     POPA
165     movq $VMM_FAILURE, %rax
166     jmp .Lreturn
167
168 .Lreturn:
169     sti
170     popf
171     ret
172     
173 #else
174
175 #define save_resgisters(location)       \
176         pushl   %eax;                   \
177         movl    location, %eax;         \
178         movl    %edi, (%eax);           \
179         movl    %esi, 8(%eax);          \
180         movl    %ebp, 16(%eax);         \
181         movl    $0, 24(%eax);           \
182         movl    %ebx, 32(%eax);         \
183         movl    %edx, 40(%eax);         \
184         movl    %ecx, 48(%eax);         \
185         pushl   %ebx;                   \
186         movl    8(%esp), %ebx;          \
187         movl    %ebx, 56(%eax);         \
188         popl    %ebx;                   \
189         popl    %eax;                   
190         
191
192 #define restore_registers(location) \
193         pushl   %eax;                   \
194         movl    location, %eax;         \
195         movl    (%eax), %edi;           \
196         movl    8(%eax), %esi;          \
197         movl    16(%eax), %ebp;         \
198         movl    32(%eax), %ebx;         \
199         movl    40(%eax), %edx;         \
200         movl    48(%eax), %ecx;         \
201         popl    %eax;
202  
203 #define PUSHA    \
204     push %eax;   \
205     push %ebx;   \
206     push %ecx;   \
207     push %edx;   \
208     push %ebp;   \
209     push %edi;   \
210     push %esi;
211
212 #define POPA     \
213     pop %esi;    \
214     pop %edi;    \
215     pop %ebp;    \
216     pop %edx;    \
217     pop %ecx;    \
218     pop %ebx;    \
219     pop %eax;
220
221 .align 8
222 .globl v3_vmx_exit_handler
223 v3_vmx_exit_handler:
224     save_registers(4(%esp))
225     addl $8, %rsp
226     POPA
227     popf
228     pushl %rdi
229     call v3_handle_vmx_exit
230
231     andl %eax, %eax
232     jnz .Lvmm_failure
233
234 v3_vmx_vmresume:
235     popl %edi
236     pushf
237     PUSHA
238     pushl %edi
239     restore_registers(%rdi)
240
241     vmresume
242
243     addl $8, %esp
244     jz .Lfail_valid
245     jc .Lfail_invalid
246     jmp .Lreturn
247
248 .align 8
249 .globl v3_vmx_vmlaunch
250 // vm_regs = %edi
251 v3_vmx_vmlaunch:
252     cli
253     pushf
254     PUSHA
255     pushl %edi
256
257     movl %esp, %eax
258     movl $VMCS_HOST_RSP, %ebx
259     vmwrite %eax, %ebx
260     jz .Lfail_valid
261     jc .Lfail_invalid
262
263     movl $v3_vmx_exit_handler, %eax
264     movl $VMCS_HOST_RIP, %ebx
265     vmwrite %eax, %ebx
266     jz .Lfail_valid
267     jc .Lfail_invalid
268
269     restore_registers(%edi)
270
271     vmlaunch
272     jz .Lfail_valid
273     jc .Lfail_invalid
274     jmp .Lreturn
275
276 .Lfail_valid:
277     addl $8, %esp
278     POPA
279     movl $VMX_FAIL_VALID, %eax
280     jmp .Lreturn
281
282 .Lfail_invalid:
283     addq $8, %esp
284     POPA
285     movl $MVX_FAIL_INVALID, %eax
286     jmp .Lreturn
287
288 .Lvmm_failure:
289     addq $8, %esp
290     POPA
291     movl $VMM_FAILURE, %eax
292     jmp .Lreturn
293
294 .Lreturn:
295     sti
296     popf
297     ret
298
299 #endif
300