All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Ed White <edmund.h.white@intel.com>
To: xen-devel@lists.xen.org
Cc: Ravi Sahita <ravi.sahita@intel.com>,
	Wei Liu <wei.liu2@citrix.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Ian Jackson <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>,
	Ed White <edmund.h.white@intel.com>,
	Jan Beulich <jbeulich@suse.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	tlengyel@novetta.com, Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [PATCH v5 11/15] x86/altp2m: define and implement alternate p2m HVMOP types.
Date: Mon, 13 Jul 2015 17:14:59 -0700	[thread overview]
Message-ID: <1436832903-12639-12-git-send-email-edmund.h.white@intel.com> (raw)
In-Reply-To: <1436832903-12639-1-git-send-email-edmund.h.white@intel.com>

Signed-off-by: Ed White <edmund.h.white@intel.com>
---
 xen/arch/x86/hvm/hvm.c          | 142 ++++++++++++++++++++++++++++++++++++++++
 xen/include/public/hvm/hvm_op.h |  82 +++++++++++++++++++++++
 2 files changed, 224 insertions(+)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index a9f4b1b..df6c6b6 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -6443,6 +6443,148 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg)
         break;
     }
 
+    case HVMOP_altp2m:
+    {
+        struct xen_hvm_altp2m_op a;
+        struct domain *d = NULL;
+
+        if ( copy_from_guest(&a, arg, 1) )
+            return -EFAULT;
+
+        if ( a.pad[0] || a.pad[1] )
+            return -EINVAL;
+
+        switch ( a.cmd )
+        {
+        case HVMOP_altp2m_get_domain_state:
+        case HVMOP_altp2m_set_domain_state:
+        case HVMOP_altp2m_create_p2m:
+        case HVMOP_altp2m_destroy_p2m:
+        case HVMOP_altp2m_switch_p2m:
+        case HVMOP_altp2m_set_mem_access:
+        case HVMOP_altp2m_change_gfn:
+            d = rcu_lock_domain_by_any_id(a.domain);
+            if ( d == NULL )
+                return -ESRCH;
+
+            if ( !is_hvm_domain(d) || !hvm_altp2m_supported() )
+                rc = -EINVAL;
+            break;
+
+        case HVMOP_altp2m_vcpu_enable_notify:
+           break;
+
+        default:
+            return -ENOSYS;
+        }
+
+        if ( !rc )
+        {
+            switch ( a.cmd )
+            {
+            case HVMOP_altp2m_get_domain_state:
+                a.u.domain_state.state = altp2m_active(d);
+                rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+                break;
+
+            case HVMOP_altp2m_set_domain_state:
+            {
+                struct vcpu *v;
+                bool_t ostate;
+                
+                if ( nestedhvm_enabled(d) )
+                {
+                    rc = -EINVAL;
+                    break;
+                }
+
+                ostate = d->arch.altp2m_active;
+                d->arch.altp2m_active = !!a.u.domain_state.state;
+
+                /* If the alternate p2m state has changed, handle appropriately */
+                if ( d->arch.altp2m_active != ostate &&
+                     (ostate || !(rc = p2m_init_altp2m_by_id(d, 0))) )
+                {
+                    for_each_vcpu( d, v )
+                    {
+                        if ( !ostate )
+                            altp2m_vcpu_initialise(v);
+                        else
+                            altp2m_vcpu_destroy(v);
+                    }
+
+                    if ( ostate )
+                        p2m_flush_altp2m(d);
+                }
+                break;
+            }
+            default:
+                if ( !(d ? d : current->domain)->arch.altp2m_active )
+                {
+                    rc = -EINVAL;
+                    break;
+                }
+
+                switch ( a.cmd )
+                {
+                case HVMOP_altp2m_vcpu_enable_notify:
+                {
+                    struct vcpu *curr = current;
+                    p2m_type_t p2mt;
+
+                    if ( (gfn_x(vcpu_altp2m(curr).veinfo_gfn) != INVALID_GFN) ||
+                         (mfn_x(get_gfn_query_unlocked(curr->domain,
+                                a.u.enable_notify.gfn, &p2mt)) == INVALID_MFN) )
+                        return -EINVAL;
+
+                    vcpu_altp2m(curr).veinfo_gfn = _gfn(a.u.enable_notify.gfn);
+                    altp2m_vcpu_update_vmfunc_ve(curr);
+                    break;
+                }
+                case HVMOP_altp2m_create_p2m:
+                    if ( !(rc = p2m_init_next_altp2m(d, &a.u.view.view)) )
+                        rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
+                    break;
+
+                case HVMOP_altp2m_destroy_p2m:
+                    rc = p2m_destroy_altp2m_by_id(d, a.u.view.view);
+                    break;
+
+                case HVMOP_altp2m_switch_p2m:
+                    rc = p2m_switch_domain_altp2m_by_id(d, a.u.view.view);
+                    break;
+
+                case HVMOP_altp2m_set_mem_access:
+                    if ( a.u.set_mem_access.pad[0] || a.u.set_mem_access.pad[1] ||
+                         a.u.set_mem_access.pad[2] || a.u.set_mem_access.pad[3] )
+                        rc = -EINVAL;
+                    else
+                        rc = p2m_set_altp2m_mem_access(d, a.u.set_mem_access.view,
+                                _gfn(a.u.set_mem_access.gfn),
+                                a.u.set_mem_access.hvmmem_access);
+                    break;
+
+                case HVMOP_altp2m_change_gfn:
+                    if ( a.u.change_gfn.pad[0] || a.u.change_gfn.pad[1] ||
+                         a.u.change_gfn.pad[2] || a.u.change_gfn.pad[3] ||
+                         a.u.change_gfn.pad[4] || a.u.change_gfn.pad[5] )
+                        rc = -EINVAL;
+                    else
+                        rc = p2m_change_altp2m_gfn(d, a.u.change_gfn.view,
+                                _gfn(a.u.change_gfn.old_gfn),
+                                _gfn(a.u.change_gfn.new_gfn));
+                    break;
+                }
+                break;
+            }
+        }
+
+        if ( d )
+            rcu_unlock_domain(d);
+
+        break;
+    }
+
     default:
     {
         gdprintk(XENLOG_DEBUG, "Bad HVM op %ld.\n", op);
diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h
index 9b84e84..05d42c4 100644
--- a/xen/include/public/hvm/hvm_op.h
+++ b/xen/include/public/hvm/hvm_op.h
@@ -396,6 +396,88 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_evtchn_upcall_vector_t);
 
 #endif /* defined(__i386__) || defined(__x86_64__) */
 
+/* HVMOP_altp2m: perform altp2m state operations */
+#define HVMOP_altp2m 24
+
+struct xen_hvm_altp2m_domain_state {
+    /* IN or OUT variable on/off */
+    uint8_t state;
+};
+typedef struct xen_hvm_altp2m_domain_state xen_hvm_altp2m_domain_state_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_domain_state_t);
+
+struct xen_hvm_altp2m_vcpu_enable_notify {
+    /* #VE info area gfn */
+    uint64_t gfn;
+};
+typedef struct xen_hvm_altp2m_vcpu_enable_notify xen_hvm_altp2m_vcpu_enable_notify_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_vcpu_enable_notify_t);
+
+struct xen_hvm_altp2m_view {
+    /* IN/OUT variable */
+    uint16_t view;
+    /* Create view only: default access type
+     * NOTE: currently ignored */
+    uint16_t hvmmem_default_access; /* xenmem_access_t */
+};
+typedef struct xen_hvm_altp2m_view xen_hvm_altp2m_view_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_view_t);
+
+struct xen_hvm_altp2m_set_mem_access {
+    /* view */
+    uint16_t view;
+    /* Memory type */
+    uint16_t hvmmem_access; /* xenmem_access_t */
+    uint8_t pad[4];
+    /* gfn */
+    uint64_t gfn;
+};
+typedef struct xen_hvm_altp2m_set_mem_access xen_hvm_altp2m_set_mem_access_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_set_mem_access_t);
+
+struct xen_hvm_altp2m_change_gfn {
+    /* view */
+    uint16_t view;
+    uint8_t pad[6];
+    /* old gfn */
+    uint64_t old_gfn;
+    /* new gfn, INVALID_GFN (~0UL) means revert */
+    uint64_t new_gfn;
+};
+typedef struct xen_hvm_altp2m_change_gfn xen_hvm_altp2m_change_gfn_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_change_gfn_t);
+
+struct xen_hvm_altp2m_op {
+    uint32_t cmd;
+/* Get/set the altp2m state for a domain */
+#define HVMOP_altp2m_get_domain_state     1
+#define HVMOP_altp2m_set_domain_state     2
+/* Set the current VCPU to receive altp2m event notifications */
+#define HVMOP_altp2m_vcpu_enable_notify   3
+/* Create a new view */
+#define HVMOP_altp2m_create_p2m           4
+/* Destroy a view */
+#define HVMOP_altp2m_destroy_p2m          5
+/* Switch view for an entire domain */
+#define HVMOP_altp2m_switch_p2m           6
+/* Notify that a page of memory is to have specific access types */
+#define HVMOP_altp2m_set_mem_access       7
+/* Change a p2m entry to have a different gfn->mfn mapping */
+#define HVMOP_altp2m_change_gfn           8
+    domid_t domain;
+    uint8_t pad[2];
+    union {
+        struct xen_hvm_altp2m_domain_state       domain_state;
+        struct xen_hvm_altp2m_vcpu_enable_notify enable_notify;
+        struct xen_hvm_altp2m_view               view;
+        struct xen_hvm_altp2m_set_mem_access     set_mem_access;
+        struct xen_hvm_altp2m_change_gfn         change_gfn;
+        uint8_t pad[64];
+    } u;
+};
+typedef struct xen_hvm_altp2m_op xen_hvm_altp2m_op_t;
+DEFINE_XEN_GUEST_HANDLE(xen_hvm_altp2m_op_t);
+
 #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
 
 /*
-- 
1.9.1

  parent reply	other threads:[~2015-07-14  0:14 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-14  0:14 [PATCH v5 00/15] Alternate p2m: support multiple copies of host p2m Ed White
2015-07-14  0:14 ` [PATCH v5 01/15] common/domain: Helpers to pause a domain while in context Ed White
2015-07-14  0:14 ` [PATCH v5 02/15] VMX: VMFUNC and #VE definitions and detection Ed White
2015-07-14  0:14 ` [PATCH v5 03/15] VMX: implement suppress #VE Ed White
2015-07-14 12:46   ` Jan Beulich
2015-07-14 13:47   ` George Dunlap
2015-07-14  0:14 ` [PATCH v5 04/15] x86/HVM: Hardware alternate p2m support detection Ed White
2015-07-14  0:14 ` [PATCH v5 05/15] x86/altp2m: basic data structures and support routines Ed White
2015-07-14 13:13   ` Jan Beulich
2015-07-14 14:45     ` George Dunlap
2015-07-14 14:58       ` Jan Beulich
2015-07-16  8:57     ` Sahita, Ravi
2015-07-16  9:07       ` Jan Beulich
2015-07-17 22:36         ` Sahita, Ravi
2015-07-20  6:20           ` Jan Beulich
2015-07-21  5:18             ` Sahita, Ravi
2015-07-14 15:57   ` George Dunlap
2015-07-21 17:44     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 06/15] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-07-14 13:57   ` Jan Beulich
2015-07-16  9:20     ` Sahita, Ravi
2015-07-16  9:38       ` Jan Beulich
2015-07-17 21:08         ` Sahita, Ravi
2015-07-20  6:21           ` Jan Beulich
2015-07-21  5:49             ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 07/15] VMX: add VMFUNC leaf 0 (EPTP switching) to emulator Ed White
2015-07-14 14:04   ` Jan Beulich
2015-07-14 17:56     ` Sahita, Ravi
2015-07-17 22:41     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 08/15] x86/altp2m: add control of suppress_ve Ed White
2015-07-14 17:03   ` George Dunlap
2015-07-14  0:14 ` [PATCH v5 09/15] x86/altp2m: alternate p2m memory events Ed White
2015-07-14 14:08   ` Jan Beulich
2015-07-16  9:22     ` Sahita, Ravi
2015-07-14  0:14 ` [PATCH v5 10/15] x86/altp2m: add remaining support routines Ed White
2015-07-14 14:31   ` Jan Beulich
2015-07-16  9:16     ` Sahita, Ravi
2015-07-16  9:34       ` Jan Beulich
2015-07-17 22:32         ` Sahita, Ravi
2015-07-20  6:53           ` Jan Beulich
2015-07-21  5:46             ` Sahita, Ravi
2015-07-21  6:38               ` Jan Beulich
2015-07-21 18:33                 ` Sahita, Ravi
2015-07-22  7:33                   ` Jan Beulich
2015-07-16 14:44   ` George Dunlap
2015-07-17 21:01     ` Sahita, Ravi
2015-07-14  0:14 ` Ed White [this message]
2015-07-14 14:36   ` [PATCH v5 11/15] x86/altp2m: define and implement alternate p2m HVMOP types Jan Beulich
2015-07-16  9:02     ` Sahita, Ravi
2015-07-16  9:09       ` Jan Beulich
2015-07-14  0:15 ` [PATCH v5 12/15] x86/altp2m: Add altp2mhvm HVM domain parameter Ed White
2015-07-14  0:15 ` [PATCH v5 13/15] x86/altp2m: XSM hooks for altp2m HVM ops Ed White
2015-07-14  0:15 ` [PATCH v5 14/15] tools/libxc: add support to altp2m hvmops Ed White
2015-07-14  0:15 ` [PATCH v5 15/15] tools/xen-access: altp2m testcases Ed White
2015-07-14  9:56   ` Wei Liu
2015-07-14 11:52     ` Lengyel, Tamas

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=1436832903-12639-12-git-send-email-edmund.h.white@intel.com \
    --to=edmund.h.white@intel.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=dgdegra@tycho.nsa.gov \
    --cc=george.dunlap@eu.citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=ravi.sahita@intel.com \
    --cc=tim@xen.org \
    --cc=tlengyel@novetta.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.