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.


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