From: Tamas K Lengyel <tklengyel@sec.in.tum.de>
To: xen-devel@lists.xen.org
Cc: ian.campbell@citrix.com, tim@xen.org, julien.grall@linaro.org,
ian.jackson@eu.citrix.com, stefano.stabellini@citrix.com,
andres@lagarcavilla.org, jbeulich@suse.com,
dgdegra@tycho.nsa.gov, Tamas K Lengyel <tklengyel@sec.in.tum.de>
Subject: [PATCH for-4.5 v7 16/21] xen/arm: Add p2m_set_permission and p2m_shatter_page helpers.
Date: Wed, 17 Sep 2014 22:51:19 +0200 [thread overview]
Message-ID: <1410987084-11899-17-git-send-email-tklengyel@sec.in.tum.de> (raw)
In-Reply-To: <1410987084-11899-1-git-send-email-tklengyel@sec.in.tum.de>
Signed-off-by: Tamas K Lengyel <tklengyel@sec.in.tum.de>
---
xen/arch/arm/p2m.c | 138 ++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 95 insertions(+), 43 deletions(-)
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index 92c3bd6..b8efeae 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -230,6 +230,76 @@ int p2m_pod_decrease_reservation(struct domain *d,
return -ENOSYS;
}
+static void p2m_set_permission(lpae_t *e, p2m_type_t t, p2m_access_t a)
+{
+ /* First apply type permissions */
+ switch ( t )
+ {
+ case p2m_ram_rw:
+ e->p2m.xn = 0;
+ e->p2m.write = 1;
+ break;
+
+ case p2m_ram_ro:
+ e->p2m.xn = 0;
+ e->p2m.write = 0;
+ break;
+
+ case p2m_iommu_map_rw:
+ case p2m_map_foreign:
+ case p2m_grant_map_rw:
+ case p2m_mmio_direct:
+ e->p2m.xn = 1;
+ e->p2m.write = 1;
+ break;
+
+ case p2m_iommu_map_ro:
+ case p2m_grant_map_ro:
+ case p2m_invalid:
+ e->p2m.xn = 1;
+ e->p2m.write = 0;
+ break;
+
+ case p2m_max_real_type:
+ BUG();
+ break;
+ }
+
+ /* Then restrict with access permissions */
+ switch ( a )
+ {
+ case p2m_access_rwx:
+ break;
+ case p2m_access_wx:
+ e->p2m.read = 0;
+ break;
+ case p2m_access_rw:
+ e->p2m.xn = 1;
+ break;
+ case p2m_access_w:
+ e->p2m.read = 0;
+ e->p2m.xn = 1;
+ break;
+ case p2m_access_rx:
+ case p2m_access_rx2rw:
+ e->p2m.write = 0;
+ break;
+ case p2m_access_x:
+ e->p2m.write = 0;
+ e->p2m.read = 0;
+ break;
+ case p2m_access_r:
+ e->p2m.write = 0;
+ e->p2m.xn = 1;
+ break;
+ case p2m_access_n:
+ case p2m_access_n2rwx:
+ e->p2m.read = e->p2m.write = 0;
+ e->p2m.xn = 1;
+ break;
+ }
+}
+
static lpae_t mfn_to_p2m_entry(unsigned long mfn, unsigned int mattr,
p2m_type_t t, p2m_access_t a)
{
@@ -261,37 +331,7 @@ static lpae_t mfn_to_p2m_entry(unsigned long mfn, unsigned int mattr,
break;
}
- switch (t)
- {
- case p2m_ram_rw:
- e.p2m.xn = 0;
- e.p2m.write = 1;
- break;
-
- case p2m_ram_ro:
- e.p2m.xn = 0;
- e.p2m.write = 0;
- break;
-
- case p2m_iommu_map_rw:
- case p2m_map_foreign:
- case p2m_grant_map_rw:
- case p2m_mmio_direct:
- e.p2m.xn = 1;
- e.p2m.write = 1;
- break;
-
- case p2m_iommu_map_ro:
- case p2m_grant_map_ro:
- case p2m_invalid:
- e.p2m.xn = 1;
- e.p2m.write = 0;
- break;
-
- case p2m_max_real_type:
- BUG();
- break;
- }
+ p2m_set_permission(&e, t, a);
ASSERT(!(pa & ~PAGE_MASK));
ASSERT(!(pa & ~PADDR_MASK));
@@ -443,6 +483,26 @@ static bool_t is_mapping_aligned(const paddr_t start_gpaddr,
return true;
}
+static int p2m_shatter_page(struct domain *d,
+ lpae_t *entry,
+ unsigned int level,
+ paddr_t level_shift,
+ bool_t flush_cache)
+{
+ int rc = p2m_create_table(d, entry,
+ level_shift - PAGE_SHIFT, flush_cache);
+
+ if ( !rc )
+ {
+ struct p2m_domain *p2m = &d->arch.p2m;
+ p2m->stats.shattered[level]++;
+ p2m->stats.mappings[level]--;
+ p2m->stats.mappings[level+1] += LPAE_ENTRIES;
+ }
+
+ return rc;
+}
+
#define P2M_ONE_DESCEND 0
#define P2M_ONE_PROGRESS_NOP 0x1
#define P2M_ONE_PROGRESS 0x10
@@ -587,14 +647,10 @@ static int apply_one_level(struct domain *d,
if ( p2m_mapping(orig_pte) )
{
*flush = true;
- rc = p2m_create_table(d, entry,
- level_shift - PAGE_SHIFT, flush_cache);
+ rc = p2m_shatter_page(d, entry, level, level_shift,
+ flush_cache);
if ( rc < 0 )
return rc;
-
- p2m->stats.shattered[level]++;
- p2m->stats.mappings[level]--;
- p2m->stats.mappings[level+1] += LPAE_ENTRIES;
} /* else: an existing table mapping -> descend */
BUG_ON(!p2m_table(*entry));
@@ -629,15 +685,11 @@ static int apply_one_level(struct domain *d,
* and descend.
*/
*flush = true;
- rc = p2m_create_table(d, entry,
- level_shift - PAGE_SHIFT, flush_cache);
+ rc = p2m_shatter_page(d, entry, level, level_shift,
+ flush_cache);
if ( rc < 0 )
return rc;
- p2m->stats.shattered[level]++;
- p2m->stats.mappings[level]--;
- p2m->stats.mappings[level+1] += LPAE_ENTRIES;
-
return P2M_ONE_DESCEND;
}
}
--
2.1.0
next prev parent reply other threads:[~2014-09-17 20:51 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-17 20:51 [PATCH for-4.5 v7 00/21] Mem_event and mem_access for ARM Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 01/21] xen: Relocate mem_access and mem_event into common Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 02/21] xen: Relocate struct npfec definition " Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 03/21] xen: Relocate mem_event_op domctl and access_op memop " Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 04/21] xen: Relocate set_access_required domctl " Tamas K Lengyel
2014-09-18 9:18 ` Jan Beulich
2014-09-18 10:36 ` Tamas K Lengyel
2014-09-18 10:37 ` Tamas K Lengyel
2014-09-18 11:17 ` Tim Deegan
2014-09-18 11:21 ` Tamas K Lengyel
2014-09-18 12:34 ` Jan Beulich
2014-09-18 13:02 ` Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 05/21] xen: Relocate p2m_access_t into common and swap the order Tamas K Lengyel
2014-09-18 9:22 ` Jan Beulich
2014-09-18 10:52 ` Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 06/21] xen: Relocate p2m_mem_access_resume to mem_access common Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 07/21] xen: Relocate p2m_mem_access_check into common and refactor it Tamas K Lengyel
2014-09-18 9:28 ` Jan Beulich
2014-09-18 10:39 ` Tim Deegan
2014-09-18 10:47 ` Tamas K Lengyel
2014-09-18 11:13 ` Tim Deegan
2014-09-22 12:08 ` Ian Campbell
2014-09-17 20:51 ` [PATCH for-4.5 v7 08/21] x86/p2m: Typo fix for spelling ambiguous Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 09/21] x86/p2m: Fix conversion macro of p2m_access to XENMEM_access Tamas K Lengyel
2014-09-18 9:35 ` Jan Beulich
2014-09-18 9:41 ` Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 10/21] xen/mem_event: Clean out superfluous white-spaces Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 11/21] xen/mem_event: Relax error condition on debug builds Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 12/21] xen/mem_event: Abstract architecture specific sanity checks Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 13/21] xen/mem_access: Abstract architecture specific sanity check Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 14/21] xen/arm: p2m changes for mem_access support Tamas K Lengyel
2014-09-22 12:20 ` Ian Campbell
2014-09-22 17:16 ` Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 15/21] xen/arm: Implement domain_get_maximum_gpfn Tamas K Lengyel
2014-09-17 20:51 ` Tamas K Lengyel [this message]
2014-09-22 12:24 ` [PATCH for-4.5 v7 16/21] xen/arm: Add p2m_set_permission and p2m_shatter_page helpers Ian Campbell
2014-09-22 18:24 ` Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 17/21] xen/arm: Data abort exception (R/W) mem_events Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 18/21] xen/arm: Instruction prefetch abort (X) mem_event handling Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 19/21] xen/arm: Enable the compilation of mem_access and mem_event on ARM Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 20/21] tools/libxc: Allocate magic page for mem access " Tamas K Lengyel
2014-09-17 20:51 ` [PATCH for-4.5 v7 21/21] tools/tests: Enable xen-access " Tamas K Lengyel
2014-09-22 12:29 ` Ian Campbell
2014-09-22 17:11 ` Tamas K Lengyel
2014-09-23 8:37 ` Ian Campbell
2014-09-18 9:21 ` [PATCH for-4.5 v7 00/21] Mem_event and mem_access for ARM Tim Deegan
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=1410987084-11899-17-git-send-email-tklengyel@sec.in.tum.de \
--to=tklengyel@sec.in.tum.de \
--cc=andres@lagarcavilla.org \
--cc=dgdegra@tycho.nsa.gov \
--cc=ian.campbell@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=jbeulich@suse.com \
--cc=julien.grall@linaro.org \
--cc=stefano.stabellini@citrix.com \
--cc=tim@xen.org \
--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).