mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/domctl: don't ignore errors from vmce_restore_vcpu()
What started out as a simple cleanup patch (eliminating the redundant
check of domctl->cmd before setting "copyback", which as a result
turned the "ext_vcpucontext_out" label useless) revealed a bug in the
handling of XEN_DOMCTL_set_ext_vcpucontext.
Fix this, retaining the cleanup, and at once dropping a stale comment
and an accompanying formatting issue.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: af172d655c
master date: 2014-02-04 09:22:12 +0100
This commit is contained in:
1 parent
2778b572ab
commit
2428aa8cde
1 file changed
+13
-16
+13
-16
@@ -815,7 +815,7 @@ long arch_do_domctl(
|
||||
ret = -ESRCH;
|
||||
if ( (evc->vcpu >= d->max_vcpus) ||
|
||||
((v = d->vcpu[evc->vcpu]) == NULL) )
|
||||
goto ext_vcpucontext_out;
|
||||
break;
|
||||
|
||||
if ( domctl->cmd == XEN_DOMCTL_get_ext_vcpucontext )
|
||||
{
|
||||
@@ -847,17 +847,20 @@ long arch_do_domctl(
|
||||
evc->vmce.caps = v->arch.vmce.mcg_cap;
|
||||
evc->vmce.mci_ctl2_bank0 = v->arch.vmce.bank[0].mci_ctl2;
|
||||
evc->vmce.mci_ctl2_bank1 = v->arch.vmce.bank[1].mci_ctl2;
|
||||
|
||||
ret = 0;
|
||||
copyback = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = -EINVAL;
|
||||
if ( evc->size < offsetof(typeof(*evc), vmce) )
|
||||
goto ext_vcpucontext_out;
|
||||
break;
|
||||
if ( !is_hvm_domain(d) )
|
||||
{
|
||||
if ( !is_canonical_address(evc->sysenter_callback_eip) ||
|
||||
!is_canonical_address(evc->syscall32_callback_eip) )
|
||||
goto ext_vcpucontext_out;
|
||||
break;
|
||||
fixup_guest_code_selector(d, evc->sysenter_callback_cs);
|
||||
v->arch.pv_vcpu.sysenter_callback_cs =
|
||||
evc->sysenter_callback_cs;
|
||||
@@ -873,13 +876,11 @@ long arch_do_domctl(
|
||||
v->arch.pv_vcpu.syscall32_disables_events =
|
||||
evc->syscall32_disables_events;
|
||||
}
|
||||
else
|
||||
/* We do not support syscall/syscall32/sysenter on 32-bit Xen. */
|
||||
if ( (evc->sysenter_callback_cs & ~3) ||
|
||||
evc->sysenter_callback_eip ||
|
||||
(evc->syscall32_callback_cs & ~3) ||
|
||||
evc->syscall32_callback_eip )
|
||||
goto ext_vcpucontext_out;
|
||||
else if ( (evc->sysenter_callback_cs & ~3) ||
|
||||
evc->sysenter_callback_eip ||
|
||||
(evc->syscall32_callback_cs & ~3) ||
|
||||
evc->syscall32_callback_eip )
|
||||
break;
|
||||
|
||||
BUILD_BUG_ON(offsetof(struct xen_domctl_ext_vcpucontext,
|
||||
mcg_cap) !=
|
||||
@@ -896,13 +897,9 @@ long arch_do_domctl(
|
||||
|
||||
ret = vmce_restore_vcpu(v, &vmce);
|
||||
}
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
ext_vcpucontext_out:
|
||||
if ( domctl->cmd == XEN_DOMCTL_get_ext_vcpucontext )
|
||||
copyback = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||