From: Jack Lange Date: Thu, 5 Feb 2009 22:09:55 +0000 (-0600) Subject: save/restore MSRs before VM entry/exit X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=3f4d4561cb9187c173cc38b237a2da583b8bae65 save/restore MSRs before VM entry/exit --- diff --git a/palacios/include/palacios/vm_guest.h b/palacios/include/palacios/vm_guest.h index bb3bad9..9987fe5 100644 --- a/palacios/include/palacios/vm_guest.h +++ b/palacios/include/palacios/vm_guest.h @@ -55,7 +55,7 @@ struct v3_gprs { v3_reg_t r14; v3_reg_t r15; -}; +} __attribute__((packed)); struct v3_ctrl_regs { @@ -165,6 +165,13 @@ struct guest_info { struct v3_msr guest_efer; + + struct v3_msr shadow_cstar; + struct v3_msr shadow_star; + struct v3_msr shadow_lstar; + struct v3_msr shadow_syscall_mask; + + /* TEMP */ //ullong_t exit_tsc; diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 86424e9..36d3d46 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -352,7 +352,20 @@ static int start_svm_guest(struct guest_info *info) { while (1) { ullong_t tmp_tsc; - uint_t vm_cr_low = 0, vm_cr_high = 0; + + + +#define MSR_STAR 0xc0000081 +#define MSR_LSTAR 0xc0000082 +#define MSR_CSTAR 0xc0000083 +#define MSR_SF_MASK 0xc0000084 +#define MSR_GS_BASE 0xc0000101 + + struct v3_msr host_cstar; + struct v3_msr host_star; + struct v3_msr host_lstar; + struct v3_msr host_syscall_mask; + struct v3_msr host_gs_base; v3_enable_ints(); v3_clgi(); @@ -364,7 +377,12 @@ static int start_svm_guest(struct guest_info *info) { (void *)(addr_t)info->rip); */ - v3_get_msr(0xc0000101, &vm_cr_high, &vm_cr_low); + + v3_get_msr(MSR_STAR, &(host_star.hi), &(host_star.lo)); + v3_get_msr(MSR_LSTAR, &(host_lstar.hi), &(host_lstar.lo)); + v3_get_msr(MSR_CSTAR, &(host_cstar.hi), &(host_cstar.lo)); + v3_get_msr(MSR_SF_MASK, &(host_syscall_mask.hi), &(host_syscall_mask.lo)); + v3_get_msr(MSR_GS_BASE, &(host_gs_base.hi), &(host_gs_base.lo)); rdtscll(info->time_state.cached_host_tsc); @@ -373,7 +391,12 @@ static int start_svm_guest(struct guest_info *info) { v3_svm_launch((vmcb_t*)V3_PAddr(info->vmm_data), &(info->vm_regs)); rdtscll(tmp_tsc); - v3_set_msr(0xc0000101, vm_cr_high, vm_cr_low); + v3_set_msr(MSR_STAR, host_star.hi, host_star.lo); + v3_set_msr(MSR_LSTAR, host_lstar.hi, host_lstar.lo); + v3_set_msr(MSR_CSTAR, host_cstar.hi, host_cstar.lo); + v3_set_msr(MSR_SF_MASK, host_syscall_mask.hi, host_syscall_mask.lo); + v3_set_msr(MSR_GS_BASE, host_gs_base.hi, host_gs_base.lo); + //PrintDebug("SVM Returned\n"); diff --git a/palacios/src/palacios/svm_lowlevel.S b/palacios/src/palacios/svm_lowlevel.S index 5616b7f..151e54b 100644 --- a/palacios/src/palacios/svm_lowlevel.S +++ b/palacios/src/palacios/svm_lowlevel.S @@ -165,18 +165,12 @@ v3_svm_launch: push %gs; PUSHA - - - - pushq %rsi movq %rdi, %rax Restore_SVM_Registers(%rsi); - - vmload; vmrun; vmsave; @@ -186,10 +180,6 @@ v3_svm_launch: addq $8, %rsp - - - - POPA pop %gs; pop %fs;