xen-devel.lists.xenproject.org archive mirror
 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 v3 08/13] x86/altp2m: add control of suppress_ve.
Date: Wed,  1 Jul 2015 11:09:32 -0700	[thread overview]
Message-ID: <1435774177-6345-9-git-send-email-edmund.h.white@intel.com> (raw)
In-Reply-To: <1435774177-6345-1-git-send-email-edmund.h.white@intel.com>

The existing ept_set_entry() and ept_get_entry() routines are extended
to optionally set/get suppress_ve and renamed. New ept_set_entry() and
ept_get_entry() routines are provided as wrappers, where set preserves
suppress_ve for an existing entry and sets it for a new entry.

Additional function pointers are added to p2m_domain to allow direct
access to the extended routines.

Signed-off-by: Ed White <edmund.h.white@intel.com>
---
 xen/arch/x86/mm/p2m-ept.c | 40 +++++++++++++++++++++++++++++++++-------
 xen/include/asm-x86/p2m.h | 13 +++++++++++++
 2 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
index 4111795..bcb9381 100644
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -650,14 +650,15 @@ bool_t ept_handle_misconfig(uint64_t gpa)
 }
 
 /*
- * ept_set_entry() computes 'need_modify_vtd_table' for itself,
+ * _ept_set_entry() computes 'need_modify_vtd_table' for itself,
  * by observing whether any gfn->mfn translations are modified.
  *
  * Returns: 0 for success, -errno for failure
  */
 static int
-ept_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
-              unsigned int order, p2m_type_t p2mt, p2m_access_t p2ma)
+_ept_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
+               unsigned int order, p2m_type_t p2mt, p2m_access_t p2ma,
+               int sve)
 {
     ept_entry_t *table, *ept_entry = NULL;
     unsigned long gfn_remainder = gfn;
@@ -803,7 +804,11 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
         ept_p2m_type_to_flags(p2m, &new_entry, p2mt, p2ma);
     }
 
-    new_entry.suppress_ve = 1;
+    if ( sve != -1 )
+        new_entry.suppress_ve = !!sve;
+    else
+        new_entry.suppress_ve = is_epte_valid(&old_entry) ?
+                                    old_entry.suppress_ve : 1;
 
     rc = atomic_write_ept_entry(ept_entry, new_entry, target);
     if ( unlikely(rc) )
@@ -848,10 +853,18 @@ out:
     return rc;
 }
 
+static int
+ept_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn, 
+              unsigned int order, p2m_type_t p2mt, p2m_access_t p2ma)
+{
+    return _ept_set_entry(p2m, gfn, mfn, order, p2mt, p2ma, -1);
+}
+
 /* Read ept p2m entries */
-static mfn_t ept_get_entry(struct p2m_domain *p2m,
-                           unsigned long gfn, p2m_type_t *t, p2m_access_t* a,
-                           p2m_query_t q, unsigned int *page_order)
+static mfn_t _ept_get_entry(struct p2m_domain *p2m,
+                            unsigned long gfn, p2m_type_t *t, p2m_access_t* a,
+                            p2m_query_t q, unsigned int *page_order,
+                            bool_t *sve)
 {
     ept_entry_t *table = map_domain_page(pagetable_get_pfn(p2m_get_pagetable(p2m)));
     unsigned long gfn_remainder = gfn;
@@ -865,6 +878,8 @@ static mfn_t ept_get_entry(struct p2m_domain *p2m,
 
     *t = p2m_mmio_dm;
     *a = p2m_access_n;
+    if ( sve )
+        *sve = 1;
 
     /* This pfn is higher than the highest the p2m map currently holds */
     if ( gfn > p2m->max_mapped_pfn )
@@ -930,6 +945,8 @@ static mfn_t ept_get_entry(struct p2m_domain *p2m,
         else
             *t = ept_entry->sa_p2mt;
         *a = ept_entry->access;
+        if ( sve )
+            *sve = ept_entry->suppress_ve;
 
         mfn = _mfn(ept_entry->mfn);
         if ( i )
@@ -953,6 +970,13 @@ out:
     return mfn;
 }
 
+static mfn_t ept_get_entry(struct p2m_domain *p2m,
+                           unsigned long gfn, p2m_type_t *t, p2m_access_t* a,
+                           p2m_query_t q, unsigned int *page_order)
+{
+    return _ept_get_entry(p2m, gfn, t, a, q, page_order, NULL);
+}
+
 void ept_walk_table(struct domain *d, unsigned long gfn)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
@@ -1131,6 +1155,8 @@ int ept_p2m_init(struct p2m_domain *p2m)
 
     p2m->set_entry = ept_set_entry;
     p2m->get_entry = ept_get_entry;
+    p2m->set_entry_full = _ept_set_entry;
+    p2m->get_entry_full = _ept_get_entry;
     p2m->change_entry_type_global = ept_change_entry_type_global;
     p2m->change_entry_type_range = ept_change_entry_type_range;
     p2m->memory_type_changed = ept_memory_type_changed;
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 079a298..bf5e5cb 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -237,6 +237,19 @@ struct p2m_domain {
                                        p2m_access_t *p2ma,
                                        p2m_query_t q,
                                        unsigned int *page_order);
+    int                (*set_entry_full)(struct p2m_domain *p2m,
+                                         unsigned long gfn,
+                                         mfn_t mfn, unsigned int page_order,
+                                         p2m_type_t p2mt,
+                                         p2m_access_t p2ma,
+                                         int sve);
+    mfn_t              (*get_entry_full)(struct p2m_domain *p2m,
+                                         unsigned long gfn,
+                                         p2m_type_t *p2mt,
+                                         p2m_access_t *p2ma,
+                                         p2m_query_t q,
+                                         unsigned int *page_order,
+                                         bool_t *sve);
     void               (*enable_hardware_log_dirty)(struct p2m_domain *p2m);
     void               (*disable_hardware_log_dirty)(struct p2m_domain *p2m);
     void               (*flush_hardware_cached_dirty)(struct p2m_domain *p2m);
-- 
1.9.1

  parent reply	other threads:[~2015-07-01 18:09 UTC|newest]

Thread overview: 91+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-01 18:09 [PATCH v3 00/12] Alternate p2m: support multiple copies of host p2m Ed White
2015-07-01 18:09 ` [PATCH v3 01/13] common/domain: Helpers to pause a domain while in context Ed White
2015-07-01 18:09 ` [PATCH v3 02/13] VMX: VMFUNC and #VE definitions and detection Ed White
2015-07-06 17:16   ` George Dunlap
2015-07-07 18:58   ` Nakajima, Jun
2015-07-01 18:09 ` [PATCH v3 03/13] VMX: implement suppress #VE Ed White
2015-07-06 17:26   ` George Dunlap
2015-07-07 18:59   ` Nakajima, Jun
2015-07-09 13:01   ` Jan Beulich
2015-07-10 19:30     ` Sahita, Ravi
2015-07-13  7:40       ` Jan Beulich
2015-07-13 23:39         ` Sahita, Ravi
2015-07-14 11:18         ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 04/13] x86/HVM: Hardware alternate p2m support detection Ed White
2015-07-01 18:09 ` [PATCH v3 05/13] x86/altp2m: basic data structures and support routines Ed White
2015-07-03 16:22   ` Andrew Cooper
2015-07-06  9:56     ` Jan Beulich
2015-07-06 16:52       ` Ed White
2015-07-06 16:40     ` Ed White
2015-07-06 16:50       ` Ian Jackson
2015-07-07  6:48         ` Coding style (was Re: [PATCH v3 05/13] x86/altp2m: basic data structures and support routines.) Jan Beulich
2015-07-07  6:31       ` [PATCH v3 05/13] x86/altp2m: basic data structures and support routines Jan Beulich
2015-07-07 15:04   ` George Dunlap
2015-07-07 15:22     ` Tim Deegan
2015-07-07 16:19       ` Ed White
2015-07-08 13:52         ` George Dunlap
2015-07-09 17:05         ` Sahita, Ravi
2015-07-10 16:35           ` George Dunlap
2015-07-10 22:11             ` Sahita, Ravi
2015-07-09 13:29   ` Jan Beulich
2015-07-10 21:48     ` Sahita, Ravi
2015-07-13  8:01       ` Jan Beulich
2015-07-14  0:01         ` Sahita, Ravi
2015-07-14  8:53           ` Jan Beulich
2015-07-16  8:48             ` Sahita, Ravi
2015-07-16  9:02               ` Jan Beulich
2015-07-17 22:39                 ` Sahita, Ravi
2015-07-20  6:18                   ` Jan Beulich
2015-07-21  5:04                     ` Sahita, Ravi
2015-07-21  6:24                       ` Jan Beulich
2015-07-14 11:34           ` George Dunlap
2015-07-09 15:58   ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 06/13] VMX/altp2m: add code to support EPTP switching and #VE Ed White
2015-07-03 16:29   ` Andrew Cooper
2015-07-07 14:28     ` Wei Liu
2015-07-07 19:02   ` Nakajima, Jun
2015-07-01 18:09 ` [PATCH v3 07/13] VMX: add VMFUNC leaf 0 (EPTP switching) to emulator Ed White
2015-07-03 16:40   ` Andrew Cooper
2015-07-06 19:56     ` Sahita, Ravi
2015-07-07  7:31       ` Jan Beulich
2015-07-09 14:05   ` Jan Beulich
2015-07-01 18:09 ` Ed White [this message]
2015-07-03 16:43   ` [PATCH v3 08/13] x86/altp2m: add control of suppress_ve Andrew Cooper
2015-07-01 18:09 ` [PATCH v3 09/13] x86/altp2m: alternate p2m memory events Ed White
2015-07-01 18:29   ` Lengyel, Tamas
2015-07-03 16:46   ` Andrew Cooper
2015-07-07 15:18   ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 10/13] x86/altp2m: add remaining support routines Ed White
2015-07-03 16:56   ` Andrew Cooper
2015-07-09 15:07   ` George Dunlap
2015-07-01 18:09 ` [PATCH v3 11/13] x86/altp2m: define and implement alternate p2m HVMOP types Ed White
2015-07-06 10:09   ` Andrew Cooper
2015-07-06 16:49     ` Ed White
2015-07-06 17:08       ` Ian Jackson
2015-07-06 18:27         ` Ed White
2015-07-06 23:40           ` Lengyel, Tamas
2015-07-07  7:46             ` Jan Beulich
2015-07-07  7:41         ` Jan Beulich
2015-07-07  7:39       ` Jan Beulich
2015-07-07  7:33     ` Jan Beulich
2015-07-07 20:10       ` Sahita, Ravi
2015-07-07 20:25         ` Andrew Cooper
2015-07-09 14:34   ` Jan Beulich
2015-07-01 18:09 ` [PATCH v3 12/13] x86/altp2m: Add altp2mhvm HVM domain parameter Ed White
2015-07-06 10:16   ` Andrew Cooper
2015-07-06 17:49   ` Wei Liu
2015-07-06 18:01     ` Ed White
2015-07-06 18:18       ` Wei Liu
2015-07-06 22:59         ` Ed White
2015-07-01 18:09 ` [PATCH v3 13/13] x86/altp2m: XSM hooks for altp2m HVM ops Ed White
2015-07-02 19:17   ` Daniel De Graaf
2015-07-06  9:50 ` [PATCH v3 00/12] Alternate p2m: support multiple copies of host p2m Jan Beulich
2015-07-06 11:25   ` Tim Deegan
2015-07-06 11:38     ` Jan Beulich
2015-07-08 18:35 ` Sahita, Ravi
2015-07-09 11:49   ` Wei Liu
2015-07-09 14:14     ` Jan Beulich
2015-07-09 16:13     ` Sahita, Ravi
2015-07-09 16:20       ` Ian Campbell
2015-07-09 16:21       ` Wei Liu
2015-07-09 16:42     ` George Dunlap

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=1435774177-6345-9-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).