Nested Virtualization: efer
PATCH 8/14 Nested Virtualization: efer
Signed-off-by Christoph Egger <[email protected]>
Signature · 6 lines
---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
# HG changeset patch
# User cegger
# Date 1281003856 -7200
Allow guest to enable SVM in EFER
xen/arch/x86/hvm/hvm.c +15 -6
@@ -616,6 +616,7 @@ static bool_t hvm_efer_valid(uint64_t va { return !((value & ~efer_validbits) || ((sizeof(long) != 8) && (value & EFER_LME)) || + (!cpu_has_svm && (value & EFER_SVME)) || (!cpu_has_nx && (value & EFER_NX)) || (!cpu_has_syscall && (value & EFER_SCE)) || (!cpu_has_lmsl && (value & EFER_LMSLE)) ||
@@ -630,6 +631,7 @@ static int hvm_load_cpu_ctxt(struct domastruct hvm_hw_cpu ctxt;struct segment_register seg;struct vcpu_guest_context *vc; +uint64_t efer_validbits;/* Which vcpu is this? */ vcpuid =hvm_load_instance (h);
@@ -669,9 +671,12 @@ static int hvm_load_cpu_ctxt(struct domareturn -EINVAL ; } -if ( !hvm_efer_valid ( - ctxt.msr_efer, -EFER_FFXSE |EFER_LMSLE |EFER_LME |EFER_LMA |EFER_NX |EFER_SCE ) ) + efer_validbits =EFER_FFXSE |EFER_LMSLE |EFER_LME |EFER_LMA + |EFER_NX |EFER_SCE ; +if (nestedhvm_enabled (v->domain) ) + efer_validbits |=EFER_SVME ; + +if ( !hvm_efer_valid (ctxt.msr_efer, efer_validbits) ) {gdprintk (XENLOG_ERR ,"HVM restore: bad EFER 0x%" PRIx64"\n" , ctxt.msr_efer);
@@ -1081,14 +1086,18 @@ bool_t hvm_hap_nested_page_fault(unsigneint hvm_set_efer (uint64_t value) {struct vcpu *v = current; +uint64_t efer_validbits; value &= ~EFER_LMA ; -if ( !hvm_efer_valid (value, -EFER_FFXSE |EFER_LMSLE |EFER_LME |EFER_NX |EFER_SCE ) ) + efer_validbits =EFER_FFXSE |EFER_LMSLE |EFER_LME |EFER_NX |EFER_SCE ; +if (nestedhvm_enabled (v->domain) ) + efer_validbits |=EFER_SVME ; + +if ( !hvm_efer_valid (value, efer_validbits) ) {gdprintk (XENLOG_WARNING ,"Trying to set reserved bit in " -"EFER: %" PRIx64"\n" , value); +"EFER: 0x%" PRIx64"\n" , value);hvm_inject_exception (TRAP_gp_fault,0 ,0 );return X86EMUL_EXCEPTION ; }
xen/include/asm-x86/cpufeature.h +2 -0
@@ -199,6 +199,8 @@#define cpu_has_rdtscp boot_cpu_has(X86_FEATURE_RDTSCP) +#define cpu_has_svm boot_cpu_has(X86_FEATURE_SVME) +#endif /* __ASM_I386_CPUFEATURE_H */ /*
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel