$NetBSD: patch-CVE-2013-1918_7,v 1.1 2013/05/03 16:48:38 drochner Exp $ --- xen/common/domain.c.orig 2013-05-03 13:28:00.000000000 +0000 +++ xen/common/domain.c @@ -770,14 +770,18 @@ int boot_vcpu(struct domain *d, int vcpu return arch_set_info_guest(v, ctxt); } -void vcpu_reset(struct vcpu *v) +int vcpu_reset(struct vcpu *v) { struct domain *d = v->domain; + int rc; vcpu_pause(v); domain_lock(d); - arch_vcpu_reset(v); + set_bit(_VPF_in_reset, &v->pause_flags); + rc = arch_vcpu_reset(v); + if ( rc ) + goto out_unlock; set_bit(_VPF_down, &v->pause_flags); @@ -793,9 +797,13 @@ void vcpu_reset(struct vcpu *v) #endif cpus_clear(v->cpu_affinity_tmp); clear_bit(_VPF_blocked, &v->pause_flags); + clear_bit(_VPF_in_reset, &v->pause_flags); + out_unlock: domain_unlock(v->domain); vcpu_unpause(v); + + return rc; } @@ -834,6 +842,11 @@ long do_vcpu_op(int cmd, int vcpuid, XEN domain_unlock(d); xfree(ctxt); + + if ( rc == -EAGAIN ) + rc = hypercall_create_continuation(__HYPERVISOR_vcpu_op, "iih", + cmd, vcpuid, arg); + break; case VCPUOP_up: