From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jean Guyader Subject: [PATCH] Hypercall continuation cancelation in compat mode for XENMEM_get/set_pod_target. Date: Thu, 10 Nov 2011 17:17:43 +0000 Message-ID: <1320945463-13844-1-git-send-email-jean.guyader@eu.citrix.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------true" 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 Cc: Jean Guyader , JBeulich@suse.com List-Id: xen-devel@lists.xenproject.org --------------true Content-Type: text/plain; charset="UTF-8"; format=fixed Content-Transfer-Encoding: 8bit If copy_to_guest failed in the compat code after a continuation as been done in the native code we need to cancel it so we won't reexecute the hypercall but return from the hypercall with the appropriate error. Signed-off-by: Jean Guyader --- xen/arch/x86/domain.c | 18 ++++++++++++++++++ xen/arch/x86/x86_64/compat/mm.c | 4 ++++ xen/include/xen/sched.h | 1 + 3 files changed, 23 insertions(+), 0 deletions(-) --------------true Content-Type: text/x-patch; name="0001-Hypercall-continuation-cancelation-in-compat-mode-fo.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0001-Hypercall-continuation-cancelation-in-compat-mode-fo.patch" diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 52c7f37..acc3241 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -1723,6 +1723,24 @@ void sync_vcpu_execstate(struct vcpu *v) __arg; \ }) +void hypercall_cancel_continuation(void) +{ + struct cpu_user_regs *regs = guest_cpu_user_regs(); + struct mc_state *mcs = ¤t->mc_state; + + if ( test_bit(_MCSF_in_multicall, &mcs->flags) ) + { + __clear_bit(_MCSF_call_preempted, &mcs->flags); + } + else + { + if ( !is_hvm_vcpu(current) ) + regs->eip += 2; /* skip re-execute 'syscall' / 'int $xx' */ + else + current->arch.hvm_vcpu.hcall_preempted = 0; + } +} + unsigned long hypercall_create_continuation( unsigned int op, const char *format, ...) { diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c index 2c05099..3ef08a5 100644 --- a/xen/arch/x86/x86_64/compat/mm.c +++ b/xen/arch/x86/x86_64/compat/mm.c @@ -133,7 +133,11 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg) XLAT_pod_target(&cmp, nat); if ( copy_to_guest(arg, &cmp, 1) ) + { + if ( rc == __HYPERVISOR_memory_op ) + hypercall_cancel_continuation(); rc = -EFAULT; + } break; } diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 3ba5495..80d5c4b 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -554,6 +554,7 @@ extern void (*dead_idle) (void); */ unsigned long hypercall_create_continuation( unsigned int op, const char *format, ...); +void hypercall_cancel_continuation(void); #define hypercall_preempt_check() (unlikely( \ softirq_pending(smp_processor_id()) | \ --------------true 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 --------------true--