From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Egger Subject: [PATCH] xen: merge efer check Date: Wed, 31 Mar 2010 15:22:13 +0100 Message-ID: <201003311622.13360.Christoph.Egger@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary-00=_Vq1sL5EcCq+NNHK" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --Boundary-00=_Vq1sL5EcCq+NNHK Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi! Attached patch merges the efer check done in hvm_load_cpu_ctxt and hvm_set_efer. No functional changes. Signed-off-by: Christoph Egger -- ---to satisfy European Law for business letters: Advanced Micro Devices GmbH Karl-Hammerschmidt-Str. 34, 85609 Dornach b. Muenchen Geschaeftsfuehrer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632 --Boundary-00=_Vq1sL5EcCq+NNHK Content-Type: text/x-diff; charset="iso 8859-15"; name="xen_efer.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xen_efer.diff" diff -r fa1ad484bf0b xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c Wed Mar 31 14:28:31 2010 +0200 +++ b/xen/arch/x86/hvm/hvm.c Wed Mar 31 16:13:59 2010 +0200 @@ -583,6 +583,24 @@ static int hvm_save_cpu_ctxt(struct doma return 0; } +static int hvm_validate_efer(uint64_t value, uint64_t efer_validbits) +{ + if ( (value & ~efer_validbits) || + ((sizeof(long) != 8) && (value & EFER_LME)) || + (!cpu_has_nx && (value & EFER_NX)) || + (!cpu_has_syscall && (value & EFER_SCE)) || + (!cpu_has_ffxsr && (value & EFER_FFXSE)) ) + { + return 1; + } + + if ( efer_validbits & EFER_LMA ) + if (( value & (EFER_LME|EFER_LMA)) == EFER_LMA ) + return 1; + + return 0; +} + static int hvm_load_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) { int vcpuid, rc; @@ -629,13 +647,8 @@ static int hvm_load_cpu_ctxt(struct doma return -EINVAL; } - if ( (ctxt.msr_efer & ~(EFER_FFXSE | EFER_LME | EFER_LMA | - EFER_NX | EFER_SCE)) || - ((sizeof(long) != 8) && (ctxt.msr_efer & EFER_LME)) || - (!cpu_has_nx && (ctxt.msr_efer & EFER_NX)) || - (!cpu_has_syscall && (ctxt.msr_efer & EFER_SCE)) || - (!cpu_has_ffxsr && (ctxt.msr_efer & EFER_FFXSE)) || - ((ctxt.msr_efer & (EFER_LME|EFER_LMA)) == EFER_LMA) ) + if ( hvm_validate_efer(ctxt.msr_efer, + EFER_FFXSE | EFER_LME | EFER_LMA | EFER_NX | EFER_SCE) ) { gdprintk(XENLOG_ERR, "HVM restore: bad EFER 0x%"PRIx64"\n", ctxt.msr_efer); @@ -984,11 +997,7 @@ int hvm_set_efer(uint64_t value) value &= ~EFER_LMA; - if ( (value & ~(EFER_FFXSE | EFER_LME | EFER_NX | EFER_SCE)) || - ((sizeof(long) != 8) && (value & EFER_LME)) || - (!cpu_has_nx && (value & EFER_NX)) || - (!cpu_has_syscall && (value & EFER_SCE)) || - (!cpu_has_ffxsr && (value & EFER_FFXSE)) ) + if ( hvm_validate_efer(value, EFER_FFXSE | EFER_LME | EFER_NX | EFER_SCE) ) { gdprintk(XENLOG_WARNING, "Trying to set reserved bit in " "EFER: %"PRIx64"\n", value); --Boundary-00=_Vq1sL5EcCq+NNHK Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --Boundary-00=_Vq1sL5EcCq+NNHK--