X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_lowlevel.S;fp=palacios%2Fsrc%2Fpalacios%2Fvmx_lowlevel.S;h=35914631b5976add2fe6290c8a8e713791d07a7a;hb=26807ca4c1fd7ea21a615b29626e73a75873bead;hp=0000000000000000000000000000000000000000;hpb=ec75f3ad6503e3c7996e7a445404b8813740804d;p=palacios.git diff --git a/palacios/src/palacios/vmx_lowlevel.S b/palacios/src/palacios/vmx_lowlevel.S new file mode 100644 index 0000000..3591463 --- /dev/null +++ b/palacios/src/palacios/vmx_lowlevel.S @@ -0,0 +1,116 @@ + +#define VMX_SUCCESS 0 +#define VMX_FAIL_INVALID 1 +#define VMX_FAIL_VALID 2 + +#define VMCS_HOST_RSP 0x00006C14 + +#if defined(__V3_64BIT__) + +#define r(reg) %r##reg + +#define PUSHA \ + push %rax; \ + push %rbx; \ + push %rcx; \ + push %rdx; \ + push %rbp; \ + push %rdi; \ + push %rsi; \ + push %r8 ; \ + push %r9 ; \ + push %r10; \ + push %r11; \ + push %r12; \ + push %r13; \ + push %r14; \ + push %r15; + +#define POPA \ + pop %r15; \ + pop %r14; \ + pop %r13; \ + pop %r12; \ + pop %r11; \ + pop %r10; \ + pop %r9 ; \ + pop %r8 ; \ + pop %rsi; \ + pop %rdi; \ + pop %rbp; \ + pop %rdx; \ + pop %rcx; \ + pop %rbx; \ + pop %rax; +#else + +#define r(reg) %e##reg + +#define PUSHA \ + push %eax; \ + push %ebx; \ + push %ecx; \ + push %edx; \ + push %ebp; \ + push %edi; \ + push %esi; + +#define POPA \ + pop %esi; \ + pop %edi; \ + pop %ebp; \ + pop %edx; \ + pop %ecx; \ + pop %ebx; \ + pop %eax; + +#endif + +.align 8 +.globl v3_vmx_exit_handler +v3_vmx_exit_handler: + PUSHA + call v3_vmx_handle_exit + POPA + +v3_vmx_vmresume: + vmresume + sti + jz .Lfail_valid + jc .Lfail_invalid + jmp .Lreturn + +.globl v3_vmx_vmlaunch +v3_vmx_vmlaunch: + cli + pushf + PUSHA + + mov r(sp), r(ax) + mov $VMCS_HOST_RSP, r(bx) + vmwrite r(bx), r(ax) + jz .Lfail_valid + jc .Lfail_invalid + + vmlaunch + sti + jz .Lfail_valid + jc .Lfail_invalid + jmp .Lreturn + +.Lfail_valid: + mov $VMX_FAIL_VALID, r(ax) + jmp .Lreturn + +.Lfail_invalid: + mov $VMX_FAIL_INVALID, r(ax) + jmp .Lreturn + +.Lreturn: + POPA + popf + ret + + + +