All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chao Peng <chao.p.peng@linux.intel.com>
To: xen-devel@lists.xen.org
Cc: keir@xen.org, Ian.Campbell@citrix.com,
	stefano.stabellini@eu.citrix.com, George.Dunlap@eu.citrix.com,
	andrew.cooper3@citrix.com, Ian.Jackson@eu.citrix.com,
	JBeulich@suse.com, dgdegra@tycho.nsa.gov
Subject: [PATCH v14 01/10] x86: add generic resource (e.g. MSR) access hypercall
Date: Thu, 28 Aug 2014 15:43:50 +0800	[thread overview]
Message-ID: <1409211839-21718-2-git-send-email-chao.p.peng@linux.intel.com> (raw)
In-Reply-To: <1409211839-21718-1-git-send-email-chao.p.peng@linux.intel.com>

Add a generic resource access hypercall for tool stack or other
components, e.g., accessing MSR, port I/O, etc.

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com>
---
 xen/arch/x86/platform_hypercall.c        |   90 ++++++++++++++++++++++++++++++
 xen/arch/x86/x86_64/platform_hypercall.c |    4 ++
 xen/include/public/platform.h            |   27 +++++++++
 xen/include/xlat.lst                     |    2 +
 4 files changed, 123 insertions(+)

diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index 2162811..52d89c7 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -61,6 +61,42 @@ long cpu_down_helper(void *data);
 long core_parking_helper(void *data);
 uint32_t get_cur_idle_nums(void);
 
+struct xen_resource_access {
+    int32_t ret;
+    struct xenpf_resource_data data;
+};
+
+static bool_t allow_access_msr(unsigned int msr)
+{
+    return 0;
+}
+
+static void resource_access_one(void *info)
+{
+    struct xen_resource_access *ra = info;
+    int ret = 0;
+
+    switch ( ra->data.cmd )
+    {
+    case XEN_RESOURCE_OP_MSR_READ:
+    case XEN_RESOURCE_OP_MSR_WRITE:
+        if ( ra->data.idx >> 32 )
+            ret = -EINVAL;
+        if ( !allow_access_msr(ra->data.idx) )
+            ret = -EACCES;
+        if ( ra->data.cmd == XEN_RESOURCE_OP_MSR_READ )
+            ret = rdmsr_safe(ra->data.idx, ra->data.val);
+        else
+            ret = wrmsr_safe(ra->data.idx, ra->data.val);
+        break;
+    default:
+        ret = -EINVAL;
+        break;
+    }
+
+    ra->ret = ret;
+}
+
 ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
 {
     ret_t ret = 0;
@@ -601,6 +637,60 @@ ret_t do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op)
     }
     break;
 
+    case XENPF_resource_op:
+    {
+        struct xen_resource_access ra;
+        struct xenpf_resource_op *rsc_op = &op->u.resource_op;
+        unsigned int i, j = 0, cpu = smp_processor_id();
+
+        for ( i = 0; i < rsc_op->nr; i++ )
+        {
+            if ( copy_from_guest_offset(&ra.data, rsc_op->data, i, 1) )
+            {
+                ret = -EFAULT;
+                break;
+            }
+
+            if ( ra.data.cpu == cpu )
+                resource_access_one(&ra);
+            else if ( cpu_online(ra.data.cpu) )
+                on_selected_cpus(cpumask_of(ra.data.cpu),
+                                 resource_access_one, &ra, 1);
+            else
+            {
+                ret = -ENODEV;
+                break;
+            }
+
+            if ( ra.ret )
+            {
+                ret = ra.ret;
+                break;
+            }
+
+            if ( copy_to_guest_offset(rsc_op->data, i, &ra.data, 1) )
+            {
+                ret = -EFAULT;
+                break;
+            }
+
+            /* Find the start point that requires no preemption */
+            if ( ra.data.flag && j == 0 )
+                j = i;
+            /* Set j = 0 when walking out of the non-preemption area */
+            if ( ra.data.flag == 0 )
+                j = 0;
+            if ( hypercall_preempt_check() )
+            {
+                ret = hypercall_create_continuation(
+                    __HYPERVISOR_platform_op, "ih",
+                    ra.data.flag ? j : i, u_xenpf_op);
+                break;
+            }
+        }
+    }
+    break;
+
     default:
         ret = -ENOSYS;
         break;
diff --git a/xen/arch/x86/x86_64/platform_hypercall.c b/xen/arch/x86/x86_64/platform_hypercall.c
index b6f380e..4db6622 100644
--- a/xen/arch/x86/x86_64/platform_hypercall.c
+++ b/xen/arch/x86/x86_64/platform_hypercall.c
@@ -32,6 +32,10 @@ CHECK_pf_pcpu_version;
 CHECK_pf_enter_acpi_sleep;
 #undef xen_pf_enter_acpi_sleep
 
+#define xen_pf_resource_data xenpf_resource_data
+CHECK_pf_resource_data;
+#undef xen_pf_resource_data
+
 #define COMPAT
 #define _XEN_GUEST_HANDLE(t) XEN_GUEST_HANDLE(t)
 #define _XEN_GUEST_HANDLE_PARAM(t) XEN_GUEST_HANDLE_PARAM(t)
diff --git a/xen/include/public/platform.h b/xen/include/public/platform.h
index 053b9fa..7590179 100644
--- a/xen/include/public/platform.h
+++ b/xen/include/public/platform.h
@@ -527,6 +527,32 @@ struct xenpf_core_parking {
 typedef struct xenpf_core_parking xenpf_core_parking_t;
 DEFINE_XEN_GUEST_HANDLE(xenpf_core_parking_t);
 
+#define XENPF_resource_op   61
+
+#define XEN_RESOURCE_OP_MSR_READ  0
+#define XEN_RESOURCE_OP_MSR_WRITE 1
+
+struct xenpf_resource_data {
+    uint16_t cmd;       /* XEN_RESOURCE_OP_* */
+    uint16_t flag;      /* avoid preemption between certain iterations */
+    uint32_t cpu;
+    uint64_t idx;
+    uint64_t val;
+};
+typedef struct xenpf_resource_data xenpf_resource_data_t;
+DEFINE_XEN_GUEST_HANDLE(xenpf_resource_data_t);
+
+/*
+ * This is a dynamic interface structure where "data" points to the elements
+ * start address, and "nr" specifies the element number.
+ */
+struct xenpf_resource_op {
+    uint32_t nr;
+    XEN_GUEST_HANDLE(xenpf_resource_data_t) data;
+};
+typedef struct xenpf_resource_op xenpf_resource_op_t;
+DEFINE_XEN_GUEST_HANDLE(xenpf_resource_op_t);
+
 /*
  * ` enum neg_errnoval
  * ` HYPERVISOR_platform_op(const struct xen_platform_op*);
@@ -553,6 +579,7 @@ struct xen_platform_op {
         struct xenpf_cpu_hotadd        cpu_add;
         struct xenpf_mem_hotadd        mem_add;
         struct xenpf_core_parking      core_parking;
+        struct xenpf_resource_op       resource_op;
         uint8_t                        pad[128];
     } u;
 };
diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
index 9a35dd7..100fcf5 100644
--- a/xen/include/xlat.lst
+++ b/xen/include/xlat.lst
@@ -88,6 +88,8 @@
 ?	xenpf_enter_acpi_sleep		platform.h
 ?	xenpf_pcpuinfo			platform.h
 ?	xenpf_pcpu_version		platform.h
+?	xenpf_resource_op		platform.h
+?	xenpf_resource_data		platform.h
 !	sched_poll			sched.h
 ?	sched_remote_shutdown		sched.h
 ?	sched_shutdown			sched.h
-- 
1.7.9.5

  reply	other threads:[~2014-08-28  7:43 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-28  7:43 [PATCH v14 00/10] enable Cache QoS Monitoring (CQM) feature Chao Peng
2014-08-28  7:43 ` Chao Peng [this message]
2014-08-29 15:40   ` [PATCH v14 01/10] x86: add generic resource (e.g. MSR) access hypercall Jan Beulich
2014-09-02  8:33     ` Chao Peng
2014-09-02  8:52       ` Jan Beulich
2014-09-02 10:04         ` Chao Peng
2014-09-02 10:24           ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 02/10] xsm: add resource operation related xsm policy Chao Peng
2014-08-29 18:55   ` Daniel De Graaf
2014-08-28  7:43 ` [PATCH v14 03/10] tools: provide interface for generic resource access Chao Peng
2014-08-28  7:43 ` [PATCH v14 04/10] x86: detect and initialize Platform QoS Monitoring feature Chao Peng
2014-08-28 10:52   ` Andrew Cooper
2014-09-02  8:40     ` Chao Peng
2014-09-01 11:38   ` Jan Beulich
2014-09-02  9:05     ` Chao Peng
2014-09-02  9:30       ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 05/10] x86: dynamically attach/detach QoS monitoring service for a guest Chao Peng
2014-09-01 11:39   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 06/10] x86: collect global QoS monitoring information Chao Peng
2014-09-01 11:44   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 07/10] x86: enable QoS monitoring for each domain RMID Chao Peng
2014-09-01 11:49   ` Jan Beulich
2014-08-28  7:43 ` [PATCH v14 08/10] x86: add QoS monitoring related MSRs in allowed list Chao Peng
2014-08-28  7:43 ` [PATCH v14 09/10] xsm: add platform QoS related xsm policies Chao Peng
2014-08-28  7:43 ` [PATCH v14 10/10] tools: CMDs and APIs for Platform QoS Monitoring Chao Peng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1409211839-21718-2-git-send-email-chao.p.peng@linux.intel.com \
    --to=chao.p.peng@linux.intel.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=Ian.Campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=keir@xen.org \
    --cc=stefano.stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.