X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm_lowlevel.S;h=0d5e870adaedf5bde8bd3e1f72b6573bffa84cdd;hb=217e4d9dbb18e7c8dfd26f9fd74770614dd2024c;hp=151e54b0e84b2bfe1162c086bb21095a343241ab;hpb=3f4d4561cb9187c173cc38b237a2da583b8bae65;p=palacios.git diff --git a/palacios/src/palacios/svm_lowlevel.S b/palacios/src/palacios/svm_lowlevel.S index 151e54b..0d5e870 100644 --- a/palacios/src/palacios/svm_lowlevel.S +++ b/palacios/src/palacios/svm_lowlevel.S @@ -1,6 +1,5 @@ #; -*- fundamental -*- - .text .align 4 @@ -18,6 +17,9 @@ #define clgi .byte 0x0F,0x01,0xDD +#define SVM_VM_HSAVE_PA_MSR .dword 0xc0010117 + + #ifdef __V3_32BIT__ #define Save_SVM_Registers(location) \ @@ -49,14 +51,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 +76,11 @@ v3_svm_launch: addl $4, %esp; + + movl 16(%ebp), %eax; + vmload; + popa; - pop %gs; - pop %fs; popf; pop %ebp; ret @@ -156,16 +163,21 @@ 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 +// HOST VMCB => RDX v3_svm_launch: pushf; - push %fs; - push %gs; PUSHA + + pushq %rdx; + movq %rdx, %rax; + vmsave; - pushq %rsi + pushq %rsi movq %rdi, %rax Restore_SVM_Registers(%rsi); @@ -180,9 +192,11 @@ v3_svm_launch: addq $8, %rsp + + popq %rax; + vmload; + POPA - pop %gs; - pop %fs; popf; ret