From patchwork Thu Jun 16 14:12:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Corneliu ZUZU X-Patchwork-Id: 9181025 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 767AA60776 for ; Thu, 16 Jun 2016 14:14:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 66D8C2793B for ; Thu, 16 Jun 2016 14:14:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5B6B628359; Thu, 16 Jun 2016 14:14:29 +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 81B062793B for ; Thu, 16 Jun 2016 14:14:28 +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 1bDY1y-000599-5f; Thu, 16 Jun 2016 14:12:26 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bDY1x-00058z-1A for xen-devel@lists.xen.org; Thu, 16 Jun 2016 14:12:25 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id 38/4D-09256-8C3B2675; Thu, 16 Jun 2016 14:12:24 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrKIsWRWlGSWpSXmKPExsUSfTxjoe7xzUn hBpvPalss+biYxYHR4+ju30wBjFGsmXlJ+RUJrBnzlj5iK1gZWPH+0QamBsYmxy5GTg4hAQ+J o7cesHYxcgHZaxklXi6ZywzhnGSUeNY5kRWm6vvxh2wQidWMEq1XJ7CAJNgEtCXOHbrHBGKLC EhLXPt8mRGkiFlgKaPEwwVXwRLCAgES9zt3sYPYLAKqEosvbANr5hVwkbi3ZBXQVA4OCQE5iQ UX0kHCnAKuEh/2TgQLCwGVdB2MhKjIkbj+XQ3ClJL436oEskhCYAmLxJwzG9hAOiUEZCQeTbz JNoFRaAEjwypG9eLUorLUIl0jvaSizPSMktzEzBxdQwMzvdzU4uLE9NScxKRiveT83E2MwCBk AIIdjMv+Oh1ilORgUhLlra9PChfiS8pPqcxILM6ILyrNSS0+xCjDwaEkwftoE1BOsCg1PbUiL TMHGA8waQkOHiUR3lcgad7igsTc4sx0iNQpRl2OY3NvrGUSYsnLz0uVEud9AlIkAFKUUZoHNw IWm5cYZaWEeRmBjhLiKUgtys0sQZV/xSjOwagkDDGFJzOvBG7TK6AjmICOsJkeD3JESSJCSqq B0eILk/cEpnvyDa/fx0loyf/2m6+gtnpr9/pF7+MYnRn5/Yx/bVR6fuVKQGHJLNkguRczDC+q pQr5fesM3c9yzDhYav0eJ3m+iQIMKQG5WboKp2tL9/JKfUj4ky9QeMjE+sVnkan/9TtETgYZt EX7MX75+MW05Pu7g/3hzdbTDidefCtlpvNGiaU4I9FQi7moOBEAo0Rql8gCAAA= X-Env-Sender: czuzu@bitdefender.com X-Msg-Ref: server-2.tower-21.messagelabs.com!1466086343!5411832!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 41821 invoked from network); 16 Jun 2016 14:12:23 -0000 Received: from mx01.bbu.dsd.mx.bitdefender.com (HELO mx01.bbu.dsd.mx.bitdefender.com) (91.199.104.161) by server-2.tower-21.messagelabs.com with DHE-RSA-AES128-GCM-SHA256 encrypted SMTP; 16 Jun 2016 14:12:23 -0000 Received: (qmail 19949 invoked from network); 16 Jun 2016 17:12:21 +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; 16 Jun 2016 17:12:21 +0300 Received: from smtp02.buh.bitdefender.net (unknown [10.17.80.76]) by mx-sr.buh.bitdefender.com (Postfix) with ESMTP id 9E2FA7FC37 for ; Thu, 16 Jun 2016 17:12:21 +0300 (EEST) Received: (qmail 31392 invoked from network); 16 Jun 2016 17:12:21 +0300 Received: from unknown (HELO czuzu-dev-vm.clj.bitdefender.biz) (czuzu@bitdefender.com@91.199.104.243) by smtp02.buh.bitdefender.net with SMTP; 16 Jun 2016 17:12:21 +0300 From: Corneliu ZUZU To: xen-devel@lists.xen.org Date: Thu, 16 Jun 2016 17:12:25 +0300 Message-Id: <1466086345-7705-1-git-send-email-czuzu@bitdefender.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1466085888-7428-1-git-send-email-czuzu@bitdefender.com> References: <1466085888-7428-1-git-send-email-czuzu@bitdefender.com> X-BitDefender-Scanner: Clean, Agent: BitDefender qmail 3.1.6 on smtp02.buh.bitdefender.net, sigver: 7.65934 X-BitDefender-Spam: No (0) X-BitDefender-SpamStamp: Build: [Engines: 2.15.6.911, Dats: 424498, Stamp: 3], Multi: [Enabled, t: (0.000013, 0.010089)], BW: [Enabled, t: (0.000007,0.000001)], RBL DNSBL: [Disabled], APM: [Enabled, Score: 500, t: (0.007019), Flags: BB9BAF5C; NN_TP_TAG_HTTP; NN_NO_CONTENT_TYPE; NN_LEGIT_SUMM_400_WORDS; NN_LEGIT_BITDEFENDER; NN_LEGIT_S_SQARE_BRACKETS; NN_LEGIT_MAILING_LIST_TO], SGN: [Enabled, t: (0.016984)], URL: [Enabled, t: (0.000014)], RTDA: [Enabled, t: (0.041711), Hit: No, Details: v2.4.2; Id: 2m1ghhc.1akqq6vuu.q1mi], total: 0(775) X-BitDefender-CF-Stamp: none Cc: Andrew Cooper , Tamas K Lengyel , Razvan Cojocaru , Jan Beulich Subject: [Xen-devel] [PATCH 6/7] vm-event/arm: move hvm_event_cr->common vm_event_monitor_cr 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 Prepare for ARM implementation of control-register write vm-events by moving X86-specific hvm_event_cr to the common-side. Signed-off-by: Corneliu ZUZU --- xen/arch/x86/hvm/event.c | 30 ------------------------------ xen/arch/x86/hvm/hvm.c | 2 +- xen/arch/x86/monitor.c | 37 ------------------------------------- xen/arch/x86/vm_event.c | 2 +- xen/common/monitor.c | 40 ++++++++++++++++++++++++++++++++++++++++ xen/common/vm_event.c | 31 +++++++++++++++++++++++++++++++ xen/include/asm-x86/hvm/event.h | 13 ++++--------- xen/include/asm-x86/monitor.h | 2 -- xen/include/xen/monitor.h | 4 ++++ xen/include/xen/vm_event.h | 10 ++++++++++ 10 files changed, 91 insertions(+), 80 deletions(-) diff --git a/xen/arch/x86/hvm/event.c b/xen/arch/x86/hvm/event.c index 26165b4..e8175e4 100644 --- a/xen/arch/x86/hvm/event.c +++ b/xen/arch/x86/hvm/event.c @@ -21,38 +21,8 @@ * this program; If not, see . */ -#include #include #include -#include -#include - -bool_t hvm_event_cr(unsigned int index, unsigned long value, unsigned long old) -{ - struct vcpu *curr = current; - struct arch_domain *ad = &curr->domain->arch; - unsigned int ctrlreg_bitmask = monitor_ctrlreg_bitmask(index); - - if ( (ad->monitor.write_ctrlreg_enabled & ctrlreg_bitmask) && - (!(ad->monitor.write_ctrlreg_onchangeonly & ctrlreg_bitmask) || - value != old) ) - { - bool_t sync = !!(ad->monitor.write_ctrlreg_sync & ctrlreg_bitmask); - - vm_event_request_t req = { - .reason = VM_EVENT_REASON_WRITE_CTRLREG, - .vcpu_id = curr->vcpu_id, - .u.write_ctrlreg.index = index, - .u.write_ctrlreg.new_value = value, - .u.write_ctrlreg.old_value = old - }; - - vm_event_monitor_traps(curr, sync, &req); - return 1; - } - - return 0; -} void hvm_event_msr(unsigned int msr, uint64_t value) { diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 4596662..26f8625 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -52,7 +53,6 @@ #include #include #include -#include #include #include #include diff --git a/xen/arch/x86/monitor.c b/xen/arch/x86/monitor.c index 1e5445f..264f0fc 100644 --- a/xen/arch/x86/monitor.c +++ b/xen/arch/x86/monitor.c @@ -29,43 +29,6 @@ int arch_monitor_domctl_event(struct domain *d, switch ( mop->event ) { - case XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG: - { - unsigned int ctrlreg_bitmask; - bool_t old_status; - - /* sanity check: avoid left-shift undefined behavior */ - if ( unlikely(mop->u.mov_to_cr.index > 31) ) - return -EINVAL; - - ctrlreg_bitmask = monitor_ctrlreg_bitmask(mop->u.mov_to_cr.index); - old_status = !!(ad->monitor.write_ctrlreg_enabled & ctrlreg_bitmask); - - if ( unlikely(old_status == requested_status) ) - return -EEXIST; - - domain_pause(d); - - if ( mop->u.mov_to_cr.sync ) - ad->monitor.write_ctrlreg_sync |= ctrlreg_bitmask; - else - ad->monitor.write_ctrlreg_sync &= ~ctrlreg_bitmask; - - if ( mop->u.mov_to_cr.onchangeonly ) - ad->monitor.write_ctrlreg_onchangeonly |= ctrlreg_bitmask; - else - ad->monitor.write_ctrlreg_onchangeonly &= ~ctrlreg_bitmask; - - if ( requested_status ) - ad->monitor.write_ctrlreg_enabled |= ctrlreg_bitmask; - else - ad->monitor.write_ctrlreg_enabled &= ~ctrlreg_bitmask; - - domain_unpause(d); - - break; - } - case XEN_DOMCTL_MONITOR_EVENT_MOV_TO_MSR: { bool_t old_status = ad->monitor.mov_to_msr_enabled; diff --git a/xen/arch/x86/vm_event.c b/xen/arch/x86/vm_event.c index 94342d5..aa65840 100644 --- a/xen/arch/x86/vm_event.c +++ b/xen/arch/x86/vm_event.c @@ -19,7 +19,7 @@ */ #include -#include +#include #include #include diff --git a/xen/common/monitor.c b/xen/common/monitor.c index c46df5a..2366bae 100644 --- a/xen/common/monitor.c +++ b/xen/common/monitor.c @@ -62,6 +62,46 @@ int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *mop) switch ( mop->event ) { +#if CONFIG_X86 + case XEN_DOMCTL_MONITOR_EVENT_WRITE_CTRLREG: + { + struct arch_domain *ad = &d->arch; + unsigned int ctrlreg_bitmask; + bool_t old_status; + + /* sanity check: avoid left-shift undefined behavior */ + if ( unlikely(mop->u.mov_to_cr.index > 31) ) + return -EINVAL; + + ctrlreg_bitmask = monitor_ctrlreg_bitmask(mop->u.mov_to_cr.index); + old_status = !!(ad->monitor.write_ctrlreg_enabled & ctrlreg_bitmask); + + if ( unlikely(old_status == requested_status) ) + return -EEXIST; + + domain_pause(d); + + if ( mop->u.mov_to_cr.sync ) + ad->monitor.write_ctrlreg_sync |= ctrlreg_bitmask; + else + ad->monitor.write_ctrlreg_sync &= ~ctrlreg_bitmask; + + if ( mop->u.mov_to_cr.onchangeonly ) + ad->monitor.write_ctrlreg_onchangeonly |= ctrlreg_bitmask; + else + ad->monitor.write_ctrlreg_onchangeonly &= ~ctrlreg_bitmask; + + if ( requested_status ) + ad->monitor.write_ctrlreg_enabled |= ctrlreg_bitmask; + else + ad->monitor.write_ctrlreg_enabled &= ~ctrlreg_bitmask; + + domain_unpause(d); + + break; + } +#endif + case XEN_DOMCTL_MONITOR_EVENT_GUEST_REQUEST: { bool_t old_status = d->monitor.guest_request_enabled; diff --git a/xen/common/vm_event.c b/xen/common/vm_event.c index 15152ba..53dc048 100644 --- a/xen/common/vm_event.c +++ b/xen/common/vm_event.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -823,6 +824,36 @@ int vm_event_monitor_traps(struct vcpu *v, uint8_t sync, return 1; } +#if CONFIG_X86 +bool_t vm_event_monitor_cr(unsigned int index, unsigned long value, + unsigned long old) +{ + struct vcpu *curr = current; + struct arch_domain *ad = &curr->domain->arch; + unsigned int ctrlreg_bitmask = monitor_ctrlreg_bitmask(index); + + if ( (ad->monitor.write_ctrlreg_enabled & ctrlreg_bitmask) && + (!(ad->monitor.write_ctrlreg_onchangeonly & ctrlreg_bitmask) || + value != old) ) + { + bool_t sync = !!(ad->monitor.write_ctrlreg_sync & ctrlreg_bitmask); + + vm_event_request_t req = { + .reason = VM_EVENT_REASON_WRITE_CTRLREG, + .vcpu_id = curr->vcpu_id, + .u.write_ctrlreg.index = index, + .u.write_ctrlreg.new_value = value, + .u.write_ctrlreg.old_value = old + }; + + vm_event_monitor_traps(curr, sync, &req); + return 1; + } + + return 0; +} +#endif + void vm_event_monitor_guest_request(void) { struct vcpu *curr = current; diff --git a/xen/include/asm-x86/hvm/event.h b/xen/include/asm-x86/hvm/event.h index 504bd66..7fb9d96 100644 --- a/xen/include/asm-x86/hvm/event.h +++ b/xen/include/asm-x86/hvm/event.h @@ -19,6 +19,7 @@ #ifndef __ASM_X86_HVM_EVENT_H__ #define __ASM_X86_HVM_EVENT_H__ +#include #include enum hvm_event_breakpoint_type @@ -27,19 +28,13 @@ enum hvm_event_breakpoint_type HVM_EVENT_SINGLESTEP_BREAKPOINT, }; -/* - * Called for current VCPU on crX/MSR changes by guest. - * The event might not fire if the client has subscribed to it in onchangeonly - * mode, hence the bool_t return type for control register write events. - */ -bool_t hvm_event_cr(unsigned int index, unsigned long value, - unsigned long old); -#define hvm_event_crX(cr, new, old) \ - hvm_event_cr(VM_EVENT_X86_##cr, new, old) void hvm_event_msr(unsigned int msr, uint64_t value); int hvm_event_breakpoint(unsigned long rip, enum hvm_event_breakpoint_type type); +#define hvm_event_crX(cr, new, old) \ + vm_event_monitor_cr(VM_EVENT_X86_##cr, new, old) + #endif /* __ASM_X86_HVM_EVENT_H__ */ /* diff --git a/xen/include/asm-x86/monitor.h b/xen/include/asm-x86/monitor.h index 7a662f9..99538b9 100644 --- a/xen/include/asm-x86/monitor.h +++ b/xen/include/asm-x86/monitor.h @@ -24,8 +24,6 @@ #include -#define monitor_ctrlreg_bitmask(ctrlreg_index) (1U << (ctrlreg_index)) - static inline int arch_monitor_domctl_op(struct domain *d, struct xen_domctl_monitor_op *mop) { diff --git a/xen/include/xen/monitor.h b/xen/include/xen/monitor.h index 7015e6d..422fd93 100644 --- a/xen/include/xen/monitor.h +++ b/xen/include/xen/monitor.h @@ -25,6 +25,10 @@ struct domain; struct xen_domctl_monitor_op; +#if CONFIG_X86 +#define monitor_ctrlreg_bitmask(ctrlreg_index) (1U << (ctrlreg_index)) +#endif + int monitor_domctl(struct domain *d, struct xen_domctl_monitor_op *op); #endif /* __XEN_MONITOR_H__ */ diff --git a/xen/include/xen/vm_event.h b/xen/include/xen/vm_event.h index f124143..71ae84a 100644 --- a/xen/include/xen/vm_event.h +++ b/xen/include/xen/vm_event.h @@ -96,6 +96,16 @@ void vm_event_vcpu_unpause(struct vcpu *v); int vm_event_monitor_traps(struct vcpu *v, uint8_t sync, vm_event_request_t *req); +#if CONFIG_X86 +/* + * Called for the current vCPU on control-register changes by guest. + * The event might not fire if the client has subscribed to it in onchangeonly + * mode, hence the bool_t return type for control register write events. + */ +bool_t vm_event_monitor_cr(unsigned int index, unsigned long value, + unsigned long old); +#endif + void vm_event_monitor_guest_request(void); #endif /* __VM_EVENT_H__ */