X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_lowlevel.S;h=aaae943a03e64d436abca126ee4dae68fc4df2c8;hp=ee244edd7e56d0ef745fdabbee333294b327e60b;hb=5bf6d0c260240e314876a2fca8e3fd56bd6a1029;hpb=a24a1722328a575cec8dd8578902fd0f68c72c1c diff --git a/palacios/src/palacios/vmx_lowlevel.S b/palacios/src/palacios/vmx_lowlevel.S index ee244ed..aaae943 100644 --- a/palacios/src/palacios/vmx_lowlevel.S +++ b/palacios/src/palacios/vmx_lowlevel.S @@ -21,7 +21,7 @@ movq %rdx, 40(%rax); \ movq %rcx, 48(%rax); \ pushq %rbx; \ - movq 16(%rsp), %rbx; \ + movq 8(%rsp), %rbx; \ movq %rbx, 56(%rax); \ popq %rbx; \ \ @@ -35,16 +35,14 @@ movq %r15, 120(%rax); \ popq %rax; - #define restore_registers(location) \ - push %rax; \ mov location, %rax; \ mov (%rax), %rdi; \ mov 8(%rax), %rsi; \ mov 16(%rax), %rbp; \ mov 32(%rax), %rbx; \ mov 40(%rax), %rdx; \ - mov 48(%rax), %rcx; \ + mov 48(%rax), %rcx; \ \ mov 64(%rax), %r8; \ mov 72(%rax), %r9; \ @@ -54,9 +52,28 @@ mov 104(%rax), %r13; \ mov 112(%rax), %r14; \ mov 120(%rax), %r15; \ - pop %rax; - - + pushq %rbx; \ + movq 56(%rax), %rbx; \ + movq %rbx, %rax; \ + popq %rbx; + +#define save_ctrl_regs(location) \ + pushq %rax; \ + pushq %rbx; \ + movq location, %rax; \ + movq %cr2, %rbx; \ + movq %rbx, 8(%rax); \ + popq %rbx; \ + popq %rax + +#define restore_ctrl_regs(location) \ + pushq %rax; \ + pushq %rbx; \ + movq location, %rax; \ + movq 8(%rax), %rbx; \ + movq %rbx, %cr2; \ + popq %rbx; \ + popq %rax #define PUSHA \ push %rax; \ @@ -92,82 +109,94 @@ pop %rbx; \ pop %rax; -.align 8 -.globl v3_vmx_exit_handler -v3_vmx_exit_handler: - save_registers(8(%rsp)); - addq $8, %rsp - POPA - popf - pushq %rdi - call v3_handle_vmx_exit - - andq %rax, %rax - jnz .Lvmm_failure -v3_vmx_vmresume: - pop %rdi - pushf - PUSHA - pushq %rdi +#define PRE_LAUNCH(return_target) \ + pushf; \ + PUSHA; \ + pushq %rdi; \ + pushq %rdx; \ + \ + movq %rsp, %rax; \ + movq $VMCS_HOST_RSP, %rbx; \ + vmwrite %rax, %rbx; \ + jz .Lfail_valid; \ + jc .Lfail_invalid; \ + \ + movq return_target, %rax; \ + movq $VMCS_HOST_RIP, %rbx; \ + vmwrite %rax, %rbx; \ + jz .Lfail_valid; \ + jc .Lfail_invalid; \ + \ + restore_ctrl_regs(%rdx); \ restore_registers(%rdi); - vmresume - jz .Lfail_valid - jc .Lfail_invalid - addq $8, %rsp - jmp .Lreturn + .align 8 -.globl v3_vmx_vmlaunch -// vm_regs = %rdi -v3_vmx_vmlaunch: - cli - pushf - PUSHA - pushq %rdi - - movq %rsp, %rax - movq $VMCS_HOST_RSP, %rbx - vmwrite %rax, %rbx - jz .Lfail_valid - jc .Lfail_invalid +.globl v3_vmx_resume +// vm_regs = %rdi, guest_info * = %rsi, ctrl_regs = %rdx +v3_vmx_resume: + + PRE_LAUNCH($vmx_resume_ret); - movq $v3_vmx_exit_handler, %rax - movq $VMCS_HOST_RIP, %rbx - vmwrite %rax, %rbx + vmresume + +vmx_resume_ret: jz .Lfail_valid jc .Lfail_invalid + jmp .Lnormal_exit - restore_registers(%rdi); + +.align 8 +.globl v3_vmx_launch +// vm_regs = %rdi, guest_info * = %rsi, ctrl_regs = %rdx +v3_vmx_launch: + + PRE_LAUNCH($vmx_launch_ret); vmlaunch + +vmx_launch_ret: jz .Lfail_valid jc .Lfail_invalid - jmp .Lreturn + jmp .Lnormal_exit + + + .Lfail_valid: - addq $8, %rsp + addq $16, %rsp POPA popf movq $VMX_FAIL_VALID, %rax jmp .Lreturn .Lfail_invalid: - addq $8, %rsp + addq $16, %rsp POPA popf movq $VMX_FAIL_INVALID, %rax jmp .Lreturn .Lvmm_failure: - addq $8, %rsp + addq $24, %rsp movq $VMM_FAILURE, %rax jmp .Lreturn + +.Lnormal_exit: + save_registers(16(%rsp)); + save_ctrl_regs(16(%rsp)); + addq $16, %rsp + POPA + popf + xorq %rax, %rax + jmp .Lreturn + + .Lreturn: - sti ret #else