Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
xen.8389
5af03009-x86-pv-hide-more-EFER-bits-from-PV.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 5af03009-x86-pv-hide-more-EFER-bits-from-PV.patch of Package xen.8389
# Commit 589263031c04e2ba527783b4e04e8df27d364769 # Date 2018-05-07 11:52:57 +0100 # Author Andrew Cooper <andrew.cooper3@citrix.com> # Committer Andrew Cooper <andrew.cooper3@citrix.com> x86/pv: Hide more EFER bits from PV guests We don't advertise SVM in CPUID so a PV guest shouldn't be under the impression that it can use SVM functionality, but despite this, it really shouldn't see SVME set when reading EFER. On Intel processors, 32bit PV guests don't see, and can't use SYSCALL. Introduce EFER_KNOWN_MASK to whitelist the features Xen knows about, and use this to clamp the guests view. Take the opportunity to reuse the mask to simplify svm_vmcb_isvalid(), and change "undefined" to "unknown" in the print message, as there is at least EFER.TCE (Translation Cache Extension) defined but unknown to Xen. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/hvm/svm/svmdebug.c +++ b/xen/arch/x86/hvm/svm/svmdebug.c @@ -131,9 +131,8 @@ bool svm_vmcb_isvalid(const char *from, PRINTF("DR7: bits [63:32] are not zero (%#"PRIx64")\n", vmcb_get_dr7(vmcb)); - if ( efer & ~(EFER_SCE | EFER_LME | EFER_LMA | EFER_NX | EFER_SVME | - EFER_LMSLE | EFER_FFXSE) ) - PRINTF("EFER: undefined bits are not zero (%#"PRIx64")\n", efer); + if ( efer & ~EFER_KNOWN_MASK ) + PRINTF("EFER: unknown bits are not zero (%#"PRIx64")\n", efer); if ( hvm_efer_valid(v, efer, -1) ) PRINTF("EFER: %s (%"PRIx64")\n", hvm_efer_valid(v, efer, -1), efer); --- a/xen/arch/x86/pv/emul-priv-op.c +++ b/xen/arch/x86/pv/emul-priv-op.c @@ -886,9 +886,16 @@ static int read_msr(unsigned int reg, ui return X86EMUL_OKAY; case MSR_EFER: - *val = read_efer(); + /* Hide unknown bits, and unconditionally hide SVME from guests. */ + *val = read_efer() & EFER_KNOWN_MASK & ~EFER_SVME; + /* + * Hide the 64-bit features from 32-bit guests. SCE has + * vendor-dependent behaviour. + */ if ( is_pv_32bit_domain(currd) ) - *val &= ~(EFER_LME | EFER_LMA | EFER_LMSLE); + *val &= ~(EFER_LME | EFER_LMA | EFER_LMSLE | + (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL + ? EFER_SCE : 0)); return X86EMUL_OKAY; case MSR_K7_FID_VID_CTL: --- a/xen/include/asm-x86/msr-index.h +++ b/xen/include/asm-x86/msr-index.h @@ -31,6 +31,9 @@ #define EFER_LMSLE (1<<_EFER_LMSLE) #define EFER_FFXSE (1<<_EFER_FFXSE) +#define EFER_KNOWN_MASK (EFER_SCE | EFER_LME | EFER_LMA | EFER_NX | \ + EFER_SVME | EFER_LMSLE | EFER_FFXSE) + /* Speculation Controls. */ #define MSR_SPEC_CTRL 0x00000048 #define SPEC_CTRL_IBRS (_AC(1, ULL) << 0)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor