Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:GA
xen.481
544e6885-x86-HVM-sanity-check-xsave-area-when-m...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 544e6885-x86-HVM-sanity-check-xsave-area-when-migrating-from-older-Xen.patch of Package xen.481
# Commit d7bb8e88a087690feba63ef83c13ba067f041da0 # Date 2014-10-27 16:45:09 +0100 # Author Don Koch <dkoch@verizon.com> # Committer Jan Beulich <jbeulich@suse.com> x86/HVM: sanity check xsave area when migrating or restoring from older Xen versions Xen 4.3.0, 4.2.3 and older transferred a maximum sized xsave area (as if all the available XCR0 bits were set); the new version only transfers based on the actual XCR0 bits. This may result in a smaller area if the last sections were missing (e.g., the LWP area from an AMD machine). If the size doesn't match the XCR0 derived size, the size is checked against the maximum size and the part of the xsave area between the actual and maximum used size is checked for zero data. If either the max size check or any part of the overflow area is non-zero, we return with an error. Signed-off-by: Don Koch <dkoch@verizon.com> Reviewed-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1108,6 +1108,7 @@ static int hvm_load_cpu_xsave_states(str struct vcpu *v; struct hvm_hw_cpu_xsave *ctxt; struct hvm_save_descriptor *desc; + unsigned int i, desc_start; /* Which vcpu is this? */ vcpuid = hvm_load_instance(h); @@ -1148,15 +1149,8 @@ static int hvm_load_cpu_xsave_states(str save_area) + XSTATE_AREA_MIN_SIZE); return -EINVAL; } - size = HVM_CPU_XSAVE_SIZE(xfeature_mask); - if ( desc->length > size ) - { - printk(XENLOG_G_WARNING - "HVM%d.%d restore mismatch: xsave length %u > %u\n", - d->domain_id, vcpuid, desc->length, size); - return -EOPNOTSUPP; - } h->cur += sizeof (*desc); + desc_start = h->cur; ctxt = (struct hvm_hw_cpu_xsave *)&h->data[h->cur]; h->cur += desc->length; @@ -1176,10 +1170,24 @@ static int hvm_load_cpu_xsave_states(str size = HVM_CPU_XSAVE_SIZE(ctxt->xcr0_accum); if ( desc->length > size ) { + /* + * Xen 4.3.0, 4.2.3 and older used to send longer-than-needed + * xsave regions. Permit loading the record if the extra data + * is all zero. + */ + for ( i = size; i < desc->length; i++ ) + { + if ( h->data[desc_start + i] ) + { + printk(XENLOG_G_WARNING + "HVM%d.%u restore mismatch: xsave length %#x > %#x (non-zero data at %#x)\n", + d->domain_id, vcpuid, desc->length, size, i); + return -EOPNOTSUPP; + } + } printk(XENLOG_G_WARNING - "HVM%d.%d restore mismatch: xsave length %u > %u\n", + "HVM%d.%u restore mismatch: xsave length %#x > %#x\n", d->domain_id, vcpuid, desc->length, size); - return -EOPNOTSUPP; } /* Checking finished */ @@ -1188,7 +1196,8 @@ static int hvm_load_cpu_xsave_states(str if ( ctxt->xcr0_accum & XSTATE_NONLAZY ) v->arch.nonlazy_xstate_used = 1; memcpy(v->arch.xsave_area, &ctxt->save_area, - desc->length - offsetof(struct hvm_hw_cpu_xsave, save_area)); + min(desc->length, size) - offsetof(struct hvm_hw_cpu_xsave, + save_area)); return 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