From: Erik van der Kouwe Date: Fri, 26 Nov 2010 17:01:09 +0000 (-0600) Subject: This patch virtualizes VM_CR_MSR to tell the guest it cannot use SVM. X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=5aac3f94fc38bfef003c41496089eb3793778342 This patch virtualizes VM_CR_MSR to tell the guest it cannot use SVM. --- diff --git a/palacios/include/palacios/vmm_ctrl_regs.h b/palacios/include/palacios/vmm_ctrl_regs.h index 0063473..e072a04 100644 --- a/palacios/include/palacios/vmm_ctrl_regs.h +++ b/palacios/include/palacios/vmm_ctrl_regs.h @@ -215,6 +215,9 @@ int v3_handle_cr4_read(struct guest_info * info); int v3_handle_efer_write(struct guest_info * core, uint_t msr, struct v3_msr src, void * priv_data); int v3_handle_efer_read(struct guest_info * core, uint_t msr, struct v3_msr * dst, void * priv_data); +int v3_handle_vm_cr_write(struct guest_info * core, uint_t msr, struct v3_msr src, void * priv_data); +int v3_handle_vm_cr_read(struct guest_info * core, uint_t msr, struct v3_msr * dst, void * priv_data); + #endif // ! __V3VEE__ diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 975010f..f20d78c 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -279,6 +279,12 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info * core) { guest_state->g_pat = 0x7040600070406ULL; } + + /* tell the guest that we don't support SVM */ + v3_hook_msr(core->vm_info, SVM_VM_CR_MSR, + &v3_handle_vm_cr_read, + &v3_handle_vm_cr_write, + core); } diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 1afb255..afecc74 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -24,6 +24,7 @@ #include #include #include +#include #ifndef CONFIG_DEBUG_CTRL_REGS #undef PrintDebug @@ -571,3 +572,29 @@ int v3_handle_efer_write(struct guest_info * core, uint_t msr, struct v3_msr src return 0; } + +int v3_handle_vm_cr_read(struct guest_info * core, uint_t msr, struct v3_msr * dst, void * priv_data) { + /* tell the guest that the BIOS disabled SVM, that way it doesn't get + * confused by the fact that CPUID reports SVM as available but it still + * cannot be used + */ + dst->value = SVM_VM_CR_MSR_lock | SVM_VM_CR_MSR_svmdis; + PrintDebug("VM_CR Read HI=%x LO=%x\n", dst->hi, dst->lo); + return 0; +} + +int v3_handle_vm_cr_write(struct guest_info * core, uint_t msr, struct v3_msr src, void * priv_data) { + PrintDebug("VM_CR Write\n"); + PrintDebug("VM_CR Write Values: HI=%x LO=%x\n", src.hi, src.lo); + + /* writes to LOCK and SVMDIS are silently ignored (according to the spec), + * other writes indicate the guest wants to use some feature we haven't + * implemented + */ + if (src.value & ~(SVM_VM_CR_MSR_lock | SVM_VM_CR_MSR_svmdis)) { + PrintDebug("VM_CR write sets unsupported bits: HI=%x LO=%x\n", src.hi, src.lo); + return -1; + } + + return 0; +}