From patchwork Thu Jun 30 18:41:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corneliu ZUZU X-Patchwork-Id: 9208831 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 44E6F607D8 for ; Thu, 30 Jun 2016 18:43:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 38539284A4 for ; Thu, 30 Jun 2016 18:43:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2C8A628683; Thu, 30 Jun 2016 18:43:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9B121284A4 for ; Thu, 30 Jun 2016 18:43:44 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bIguO-0001I0-JS; Thu, 30 Jun 2016 18:41:52 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bIguN-0001Hl-18 for xen-devel@lists.xen.org; Thu, 30 Jun 2016 18:41:51 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id 22/64-09256-EE765775; Thu, 30 Jun 2016 18:41:50 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrJIsWRWlGSWpSXmKPExsUSfTxjoe7b9NJ wg0vHdC2WfFzM4sDocXT3b6YAxijWzLyk/IoE1oxFM46xFryRqZj9rKaBsUG8i5GTQ0jAQ+LU 24lMXYxcQPZaRolNi25DOScZJfY8uswKUeUuMW/2QRa4qtvn5zODJNgEtCXOHbrHBGKLCEhLX Pt8mRGkiFlgKaPEwwVXwRLCAm4S+/5cYuti5OBgEVCVuHxDFCTMK+Ai8XThF7CwhICcxIIL6S BhTgFXiS2/+5kh9rpI/P61mwXElhDIkfi0YyETRLmUxP9WJZBNEgJLWSRO3b0EVSMj8WjiTbY JjEILGBlWMaoXpxaVpRbpGuklFWWmZ5TkJmbm6BoamOnlphYXJ6an5iQmFesl5+duYgQGIQMQ 7GBc9tfpEKMkB5OSKO+9kNJwIb6k/JTKjMTijPii0pzU4kOMMhwcShK859OAcoJFqempFWmZO cB4gElLcPAoifB2g6R5iwsSc4sz0yFSpxgVpcR5Z4EkBEASGaV5cG2wGLzEKCslzMsIdIgQT0 FqUW5mCar8K0ZxDkYlYd6ZIFN4MvNK4Ka/AlrMBLSYubQYZHFJIkJKqoGxZpd1e/E8w9p0c90 Nt1QN/rcWHdjdu+Xs8cWHHvVLfpvYV9G86HbXxqhfdeGJ17QEHrBlV1jo9ESeX/euR6A+od/z 0v8zv3VVTNhLa/o/ajn9VPv4Sc9XyuHZ0/+ySS8W+j64ULa+wNGF7/eJDHN7mdqnzyXUz5k8e ZUmVb4oftueuW+ZeESVWIozEg21mIuKEwGbXm+bvAIAAA== X-Env-Sender: czuzu@bitdefender.com X-Msg-Ref: server-10.tower-21.messagelabs.com!1467312109!21621695!1 X-Originating-IP: [91.199.104.161] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 20090 invoked from network); 30 Jun 2016 18:41:49 -0000 Received: from mx01.bbu.dsd.mx.bitdefender.com (HELO mx01.bbu.dsd.mx.bitdefender.com) (91.199.104.161) by server-10.tower-21.messagelabs.com with DHE-RSA-AES128-GCM-SHA256 encrypted SMTP; 30 Jun 2016 18:41:49 -0000 Received: (qmail 22988 invoked from network); 30 Jun 2016 21:41:48 +0300 Received: from unknown (HELO mx-sr.buh.bitdefender.com) (10.17.80.103) by mx01.bbu.dsd.mx.bitdefender.com with AES256-GCM-SHA384 encrypted SMTP; 30 Jun 2016 21:41:48 +0300 Received: from smtp02.buh.bitdefender.net (unknown [10.17.80.76]) by mx-sr.buh.bitdefender.com (Postfix) with ESMTP id 8BAFF7FBE5 for ; Thu, 30 Jun 2016 21:41:48 +0300 (EEST) Received: (qmail 3536 invoked from network); 30 Jun 2016 21:41:48 +0300 Received: from 188-24-82-29.rdsnet.ro (HELO localhost.localdomain) (czuzu@bitdefender.com@188.24.82.29) by smtp02.buh.bitdefender.net with SMTP; 30 Jun 2016 21:41:48 +0300 From: Corneliu ZUZU To: xen-devel@lists.xen.org Date: Thu, 30 Jun 2016 21:41:42 +0300 Message-Id: <1467312102-2922-1-git-send-email-czuzu@bitdefender.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1467312015-2867-1-git-send-email-czuzu@bitdefender.com> References: <1467312015-2867-1-git-send-email-czuzu@bitdefender.com> X-BitDefender-Scanner: Clean, Agent: BitDefender qmail 3.1.6 on smtp02.buh.bitdefender.net, sigver: 7.66124 X-BitDefender-Spam: No (0) X-BitDefender-SpamStamp: Build: [Engines: 2.15.6.911, Dats: 425113, Stamp: 3], Multi: [Enabled, t: (0.000010, 0.003880)], BW: [Enabled, t: (0.000007,0.000001)], RBL DNSBL: [Disabled], APM: [Enabled, Score: 500, t: (0.003954), Flags: BB9BAF5C; NN_NO_CONTENT_TYPE; NN_LEGIT_SUMM_400_WORDS; NN_NO_LINK_NMD; NN_LEGIT_BITDEFENDER; NN_LEGIT_S_SQARE_BRACKETS; NN_LEGIT_MAILING_LIST_TO], SGN: [Enabled, t: (0.008397)], URL: [Enabled, t: (0.000005)], RTDA: [Enabled, t: (0.014060), Hit: No, Details: v2.3.10; Id: 2m1ghic.1amgkuipm.15ol], total: 0(775) X-BitDefender-CF-Stamp: none Cc: Andrew Cooper , Tamas K Lengyel , Razvan Cojocaru , Jan Beulich Subject: [Xen-devel] [PATCH 1/8] x86/vm-event: proper vCPU-paused checks at resume X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP A VM_EVENT_FLAG_VCPU_PAUSED flag in a vm-event response should only be treated as informative that the toolstack user wants the vm-event subsystem to unpause the target vCPU, but not be relied upon to decide if the target vCPU is actually paused. That being said, this patch does the following: * Fixes (replaces) the old behavior in vm_event_resume, which relied on VM_EVENT_FLAG_VCPU_PAUSED to determine if the target vCPU is paused, by actually checking the vCPU vm-event pause-count. * ASSERTs that the vCPU is paused in vm_event_set_registers and vm_event_toggle_singlestep. * Ignores VM_EVENT_FLAG_DENY @ vm_event_register_write_resume if the target vCPU is not paused. Also adjusts comment in public/vm_event.h to reflect that. Signed-off-by: Corneliu ZUZU Acked-by: Razvan Cojocaru Acked-by: Tamas K Lengyel --- xen/arch/x86/vm_event.c | 10 +++++++++- xen/common/vm_event.c | 6 ++++-- xen/include/public/vm_event.h | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/vm_event.c b/xen/arch/x86/vm_event.c index a9d3861..80f84d6 100644 --- a/xen/arch/x86/vm_event.c +++ b/xen/arch/x86/vm_event.c @@ -61,9 +61,11 @@ void vm_event_cleanup_domain(struct domain *d) void vm_event_toggle_singlestep(struct domain *d, struct vcpu *v) { - if ( !is_hvm_domain(d) || !atomic_read(&v->vm_event_pause_count) ) + if ( !is_hvm_domain(d) ) return; + ASSERT(atomic_read(&v->vm_event_pause_count)); + hvm_toggle_singlestep(v); } @@ -75,6 +77,10 @@ void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp) ASSERT(w); + /* deny flag requires the vCPU to be paused */ + if ( !atomic_read(&v->vm_event_pause_count) ) + return; + switch ( rsp->reason ) { case VM_EVENT_REASON_MOV_TO_MSR: @@ -100,6 +106,8 @@ void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp) void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp) { + ASSERT(atomic_read(&v->vm_event_pause_count)); + v->arch.user_regs.eax = rsp->data.regs.x86.rax; v->arch.user_regs.ebx = rsp->data.regs.x86.rbx; v->arch.user_regs.ecx = rsp->data.regs.x86.rcx; diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c index b303180..17d2716 100644 --- a/xen/common/vm_event.c +++ b/xen/common/vm_event.c @@ -417,7 +417,8 @@ void vm_event_resume(struct domain *d, struct vm_event_domain *ved) if ( rsp.flags & VM_EVENT_FLAG_ALTERNATE_P2M ) p2m_altp2m_check(v, rsp.altp2m_idx); - if ( rsp.flags & VM_EVENT_FLAG_VCPU_PAUSED ) + /* Check flags which apply only when the vCPU is paused */ + if ( atomic_read(&v->vm_event_pause_count) ) { if ( rsp.flags & VM_EVENT_FLAG_SET_REGISTERS ) vm_event_set_registers(v, &rsp); @@ -425,7 +426,8 @@ void vm_event_resume(struct domain *d, struct vm_event_domain *ved) if ( rsp.flags & VM_EVENT_FLAG_TOGGLE_SINGLESTEP ) vm_event_toggle_singlestep(d, v); - vm_event_vcpu_unpause(v); + if ( rsp.flags & VM_EVENT_FLAG_VCPU_PAUSED ) + vm_event_vcpu_unpause(v); } } } diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h index 9270d52..f888fdd 100644 --- a/xen/include/public/vm_event.h +++ b/xen/include/public/vm_event.h @@ -77,6 +77,7 @@ /* * Deny completion of the operation that triggered the event. * Currently only useful for MSR, CR0, CR3 and CR4 write events. + * Requires the vCPU to be paused already (synchronous events only). */ #define VM_EVENT_FLAG_DENY (1 << 6) /*