X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_lowlevel.S;h=11cc3b003157fbf35f9ff55457ae1b576c354769;hb=1df1d51642fd023684326023459da17765b428ce;hp=975fe9891deb2bb8a2c9c1ef5980a2abcf4de839;hpb=33f53e0ad567d9b810015efacd85e8062a0efec1;p=palacios.git diff --git a/palacios/src/palacios/svm_lowlevel.S b/palacios/src/palacios/svm_lowlevel.S index 975fe98..11cc3b0 100644 --- a/palacios/src/palacios/svm_lowlevel.S +++ b/palacios/src/palacios/svm_lowlevel.S @@ -1,6 +1,5 @@ #; -*- fundamental -*- - .text .align 4 @@ -18,8 +17,12 @@ #define clgi .byte 0x0F,0x01,0xDD +#define SVM_VM_HSAVE_PA_MSR .dword 0xc0010117 + + #ifdef __V3_32BIT__ +// Note that RAX is saved in the VMCB, so we don't touch it here #define Save_SVM_Registers(location) \ pushl %eax; \ movl location, %eax; \ @@ -29,11 +32,7 @@ movl $0, 24(%eax); \ movl %ebx, 32(%eax); \ movl %edx, 40(%eax); \ - movl %ecx, 48(%eax); \ - pushl %ebx; \ - movl 8(%esp), %ebx; \ - movl %ebx, 56(%eax); \ - popl %ebx; \ + movl %ecx, 48(%eax); \ popl %eax; @@ -49,14 +48,17 @@ popl %eax; +// 32 bit GCC passes arguments via stack + v3_svm_launch: push %ebp; movl %esp, %ebp; pushf; - push %fs; - push %gs; pusha; + movl 16(%ebp), %eax; + vmsave; + pushl 12(%ebp); pushl 8(%ebp); @@ -71,9 +73,11 @@ v3_svm_launch: addl $4, %esp; + + movl 16(%ebp), %eax; + vmload; + popa; - pop %gs; - pop %fs; popf; pop %ebp; ret @@ -82,6 +86,7 @@ v3_svm_launch: #elif __V3_64BIT__ +// Note that RAX is saved in the VMCB, so we don't touch it here #define Save_SVM_Registers(location) \ pushq %rax; \ movq location, %rax; \ @@ -92,10 +97,6 @@ v3_svm_launch: movq %rbx, 32(%rax); \ movq %rdx, 40(%rax); \ movq %rcx, 48(%rax); \ - pushq %rbx; \ - movq 16(%rsp), %rbx; \ - movq %rbx, 56(%rax); \ - popq %rbx; \ \ movq %r8, 64(%rax); \ movq %r9, 72(%rax); \ @@ -156,29 +157,19 @@ v3_svm_launch: popq %rbx; \ popq %rbp; + +// Note that this is only for 64 bit GCC, 32 bit GCC passes via stack // VMCB => RDI // vm_regs => RSI -// ptr to fs => RDX -// ptr to gs => RCX +// HOST VMCB => RDX v3_svm_launch: pushf; - push %fs; - push %gs; PUSHA - - - -// pushq %rdx // fs -// pushq %rcx // gs - - -// pushq (%rdx) -// pop %fs -// pushq (%rcx) -// pop %gs - - + + pushq %rdx; + movq %rdx, %rax; + vmsave; pushq %rsi @@ -195,21 +186,11 @@ v3_svm_launch: addq $8, %rsp -// popq %rcx -// popq %rdx - -// push %fs -// popq %rax -// movq %rax, (%rdx) - -// push %gs -// popq %rax -// movq %rax, (%rcx) + popq %rax; + vmload; POPA - pop %gs; - pop %fs; popf; ret