All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Ostrovsky <boris.ostrovsky@oracle.com>
To: xen-devel@lists.xen.org
Cc: wei.liu2@citrix.com, andrew.cooper3@citrix.com,
	ian.jackson@eu.citrix.com, jbeulich@suse.com,
	Boris Ostrovsky <boris.ostrovsky@oracle.com>,
	roger.pau@citrix.com
Subject: [PATCH v5 06/13] x86/domctl: Handle ACPI access from domctl
Date: Fri, 16 Dec 2016 18:18:32 -0500	[thread overview]
Message-ID: <1481930319-4796-7-git-send-email-boris.ostrovsky@oracle.com> (raw)
In-Reply-To: <1481930319-4796-1-git-send-email-boris.ostrovsky@oracle.com>

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
---
Changes in v5:
* Code movement due to changes in patch 4

 xen/arch/x86/hvm/acpi.c | 64 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 55 insertions(+), 9 deletions(-)

diff --git a/xen/arch/x86/hvm/acpi.c b/xen/arch/x86/hvm/acpi.c
index b2299a4..044699d 100644
--- a/xen/arch/x86/hvm/acpi.c
+++ b/xen/arch/x86/hvm/acpi.c
@@ -7,9 +7,11 @@
 #include <xen/lib.h>
 #include <xen/sched.h>
 
+#include <asm/guest_access.h>
+
 #include <public/arch-x86/xen.h>
 
-static int acpi_cpumap_access_common(struct domain *d,
+static int acpi_cpumap_access_common(struct domain *d, bool is_guest_access,
                                      int dir, unsigned int port,
                                      unsigned int bytes, uint32_t *val)
 {
@@ -32,14 +34,15 @@ static int acpi_cpumap_access_common(struct domain *d,
             memcpy(val, (uint8_t *)d->avail_vcpus + first_byte,
                    min(bytes, ((d->max_vcpus + 7) / 8) - first_byte));
     }
-    else
+    else if ( !is_guest_access )
         /* Guests do not write CPU map */
-        return X86EMUL_UNHANDLEABLE;
+        memcpy((uint8_t *)d->avail_vcpus + first_byte, val,
+               min(bytes, ((d->max_vcpus + 7) / 8) - first_byte));
 
     return X86EMUL_OKAY;
 }
 
-static int acpi_access_common(struct domain *d,
+static int acpi_access_common(struct domain *d, bool is_guest_access,
                               int dir, unsigned int port,
                               unsigned int bytes, uint32_t *val)
 {
@@ -96,14 +99,20 @@ static int acpi_access_common(struct domain *d,
         switch ( port & 3 )
         {
         case 0:
-            *sts &= ~(v & 0xff);
+            if ( is_guest_access )
+                *sts &= ~(v & 0xff);
+            else
+                *sts = (*sts & 0xff00) | (v & 0xff);
             *sts &= *mask_sts;
             if ( !--bytes )
                 break;
             v >>= 8;
             /* fallthrough */
         case 1:
-            *sts &= ~((v & 0xff) << 8);
+            if ( is_guest_access )
+                *sts &= ~((v & 0xff) << 8);
+            else
+                *sts = ((v & 0xff) << 8) | (*sts & 0xff);
             *sts &= *mask_sts;
             if ( !--bytes )
                 break;
@@ -129,13 +138,50 @@ int hvm_acpi_domctl_access(struct domain *d, uint8_t rw,
                            const xen_acpi_access_t *access,
                            XEN_GUEST_HANDLE_PARAM(void) arg)
 {
-    return -ENOSYS;
+    unsigned int bytes, i;
+    uint32_t val;
+    uint8_t *ptr = (uint8_t *)&val;
+    int rc;
+    int (*do_acpi_access)(struct domain *d, bool is_guest_access,
+                          int dir, unsigned int port,
+                          unsigned int bytes, uint32_t *val);
+
+    if ( has_acpi_dm_ff(d) )
+        return -EINVAL;
+
+    if ( access->space_id != XEN_ACPI_SYSTEM_IO )
+        return -EINVAL;
+
+    if ( (access->address >= XEN_ACPI_CPU_MAP) &&
+         (access->address < XEN_ACPI_CPU_MAP + XEN_ACPI_CPU_MAP_LEN) )
+        do_acpi_access = acpi_cpumap_access_common;
+    else
+        do_acpi_access = acpi_access_common;
+
+    for ( i = 0; i < access->width; i += sizeof(val) )
+    {
+        bytes = (access->width - i > sizeof(val)) ? sizeof(val) : access->width - i;
+
+        if ( (rw == XEN_DOMCTL_ACPI_WRITE) &&
+             copy_from_guest_offset(ptr, arg, i, bytes) )
+            return -EFAULT;
+
+        rc = do_acpi_access(d, false, rw, access->address, bytes, &val);
+        if ( rc )
+            return rc;
+
+        if ( (rw == XEN_DOMCTL_ACPI_READ) &&
+             copy_to_guest_offset(arg, i, ptr, bytes) )
+            return -EFAULT;
+    }
+
+    return 0;
 }
 
 static int acpi_guest_access(int dir, unsigned int port,
                              unsigned int bytes, uint32_t *val)
 {
-    return  acpi_access_common(current->domain,
+    return  acpi_access_common(current->domain, true,
                                (dir == IOREQ_READ) ?
                                XEN_DOMCTL_ACPI_READ: XEN_DOMCTL_ACPI_WRITE,
                                port, bytes, val);
@@ -144,7 +190,7 @@ static int acpi_guest_access(int dir, unsigned int port,
 static int acpi_cpumap_guest_access(int dir, unsigned int port,
                                     unsigned int bytes, uint32_t *val)
 {
-    return  acpi_cpumap_access_common(current->domain,
+    return  acpi_cpumap_access_common(current->domain, true,
                                       (dir == IOREQ_READ) ?
                                       XEN_DOMCTL_ACPI_READ: XEN_DOMCTL_ACPI_WRITE,
                                       port, bytes, val);
-- 
2.7.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2016-12-16 23:18 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-16 23:18 [PATCH v5 00/13] PVH VCPU hotplug support Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 01/13] x86/pmtimer: Move ACPI registers from PMTState to hvm_domain Boris Ostrovsky
2016-12-19 14:12   ` Jan Beulich
2016-12-16 23:18 ` [PATCH v5 02/13] acpi/x86: Define ACPI IO registers for PVH guests Boris Ostrovsky
2016-12-20 18:07   ` Julien Grall
2016-12-16 23:18 ` [PATCH v5 03/13] domctl: Add XEN_DOMCTL_acpi_access Boris Ostrovsky
2016-12-19 14:17   ` Jan Beulich
2016-12-19 14:48     ` Boris Ostrovsky
2016-12-19 14:53       ` Jan Beulich
2016-12-16 23:18 ` [PATCH v5 04/13] pvh/acpi: Install handlers for ACPI-related PVH IO accesses Boris Ostrovsky
2016-12-20 11:24   ` Jan Beulich
2016-12-20 14:03     ` Boris Ostrovsky
2016-12-20 14:10       ` Jan Beulich
2016-12-20 14:16         ` Boris Ostrovsky
2016-12-20 14:45           ` Jan Beulich
2016-12-20 14:55             ` Andrew Cooper
2016-12-20 15:31               ` Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 05/13] pvh/acpi: Handle ACPI accesses for PVH guests Boris Ostrovsky
2016-12-20 11:50   ` Jan Beulich
2016-12-20 14:35     ` Boris Ostrovsky
2016-12-20 14:47       ` Jan Beulich
2016-12-20 15:29         ` Boris Ostrovsky
2016-12-20 15:41           ` Jan Beulich
2016-12-20 16:46             ` Andrew Cooper
2016-12-20 16:51               ` Boris Ostrovsky
2016-12-16 23:18 ` Boris Ostrovsky [this message]
2016-12-20 13:24   ` [PATCH v5 06/13] x86/domctl: Handle ACPI access from domctl Jan Beulich
2016-12-20 14:45     ` Boris Ostrovsky
2016-12-20 14:52       ` Jan Beulich
2016-12-16 23:18 ` [PATCH v5 07/13] events/x86: Define SCI virtual interrupt Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 08/13] pvh: Send an SCI on VCPU hotplug event Boris Ostrovsky
2016-12-20 13:37   ` Jan Beulich
2016-12-20 14:54     ` Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 09/13] libxl: Update xenstore on VCPU hotplug for all guest types Boris Ostrovsky
2017-01-04 10:34   ` Wei Liu
2017-01-04 13:53     ` Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 10/13] tools: Call XEN_DOMCTL_acpi_access on PVH VCPU hotplug Boris Ostrovsky
2017-01-04 10:35   ` Wei Liu
2016-12-16 23:18 ` [PATCH v5 11/13] pvh: Set online VCPU map to avail_vcpus Boris Ostrovsky
2016-12-16 23:18 ` [PATCH v5 12/13] pvh/acpi: Save ACPI registers for PVH guests Boris Ostrovsky
2016-12-20 13:57   ` Jan Beulich
2016-12-20 15:09     ` Boris Ostrovsky
2016-12-20 15:40       ` Jan Beulich
2016-12-16 23:18 ` [PATCH v5 13/13] docs: Describe PVHv2's VCPU hotplug procedure Boris Ostrovsky

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=1481930319-4796-7-git-send-email-boris.ostrovsky@oracle.com \
    --to=boris.ostrovsky@oracle.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=roger.pau@citrix.com \
    --cc=wei.liu2@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.