From: Jack Lange Date: Wed, 29 Oct 2008 00:01:26 +0000 (-0500) Subject: added full EFER virtualization X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=a901a91b64a0aa5d33ecb072a826c6e2f505380d added full EFER virtualization --- diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index f60129f..634064d 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -93,7 +93,7 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { vm_info->guest_efer.value = 0x0LL; v3_hook_msr(vm_info, EFER_MSR, - NULL, /*&v3_handle_efer_read,*/ + &v3_handle_efer_read, &v3_handle_efer_write, vm_info); diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index afdd374..90a5eab 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -573,8 +573,13 @@ int v3_handle_cr4_write(struct guest_info * info) { int v3_handle_efer_read(uint_t msr, struct v3_msr * dst, void * priv_data) { - PrintError("EFER Read not handled\n"); - return -1; + struct guest_info * info = (struct guest_info *)(priv_data); + PrintDebug("EFER Read\n"); + + dst->value = info->guest_efer.value; + + info->rip += 2; // WRMSR/RDMSR are two byte operands + return 0; } @@ -583,8 +588,12 @@ int v3_handle_efer_write(uint_t msr, struct v3_msr src, void * priv_data) { struct efer_64 * new_efer = (struct efer_64 *)&(src.value); struct efer_64 * old_efer = (struct efer_64 *)&(info->ctrl_regs.efer); + PrintDebug("EFER Write\n"); PrintDebug("Old EFER=%p\n", (void *)*(addr_t*)(old_efer)); + // We virtualize the guests efer to hide the SVME and LMA bits + info->guest_efer.value = src.value; + if ((info->shdw_pg_mode == SHADOW_PAGING) && (v3_get_mem_mode(info) == PHYSICAL_MEM)) { @@ -609,8 +618,6 @@ int v3_handle_efer_write(uint_t msr, struct v3_msr src, void * priv_data) { // Does this mean we will have to fully virtualize a shadow EFER?? (yes it does) - ((struct efer_64 *)&(info->guest_efer.value))->lme = 1; - new_efer->lma = 1; } else if ((old_efer->lme == 1) && (new_efer->lme == 0)) {