diff mbox series

[Xen-devel,for-4.12,v3,3/8] xen/arm: Add support for read-only foreign mappings

Message ID 20181221162650.11515-4-julien.grall@arm.com
State New
Headers show
Series xen/arm: Add xentrace support | expand

Commit Message

Julien Grall Dec. 21, 2018, 4:26 p.m. UTC
Currently, foreign mappings can only be read-write. A follow-up patch will
extend foreign mapping for Xen backend memory (via XEN_DOMID), some of
that memory should only be read accessible for the mapping domain.

Introduce a new p2m_type to cater read-only foreign mappings. For now,
the decision between the two foreign mapping type is based on the type
of the guest page mapped.

Signed-off-by: Julien Grall <julien.grall@arm.com>

---

Cc: Andrii Anisov <andrii_anisov@epam.com>

    Changes in v3:
        - Remove Andrii's reviewed-by
        - Move out the XEN_DOMID code in a separate patch
        - Make the new addition future-proof

    Changes in v2:
        - Add Andrii's reviewed-by
---
 xen/arch/arm/mm.c         | 5 +++--
 xen/arch/arm/p2m.c        | 1 +
 xen/include/asm-arm/p2m.h | 9 +++++++--
 3 files changed, 11 insertions(+), 4 deletions(-)

Comments

Andrii Anisov Dec. 21, 2018, 5:27 p.m. UTC | #1
On 21.12.18 18:26, Julien Grall wrote:
> Currently, foreign mappings can only be read-write. A follow-up patch will
> extend foreign mapping for Xen backend memory (via XEN_DOMID), some of
> that memory should only be read accessible for the mapping domain.
> 
> Introduce a new p2m_type to cater read-only foreign mappings. For now,
> the decision between the two foreign mapping type is based on the type
> of the guest page mapped.
> 
> Signed-off-by: Julien Grall <julien.grall@arm.com>

Andrii Anisov <andrii_anisov@epam.com>
Julien Grall Dec. 21, 2018, 5:27 p.m. UTC | #2
Hi Andrii,

On 21/12/2018 17:27, Andrii Anisov wrote:
> 
> 
> On 21.12.18 18:26, Julien Grall wrote:
>> Currently, foreign mappings can only be read-write. A follow-up patch will
>> extend foreign mapping for Xen backend memory (via XEN_DOMID), some of
>> that memory should only be read accessible for the mapping domain.
>>
>> Introduce a new p2m_type to cater read-only foreign mappings. For now,
>> the decision between the two foreign mapping type is based on the type
>> of the guest page mapped.
>>
>> Signed-off-by: Julien Grall <julien.grall@arm.com>
> 
> Andrii Anisov <andrii_anisov@epam.com>

Another wildcard tag? :)

Cheers,
Andrii Anisov Dec. 21, 2018, 5:29 p.m. UTC | #3
Reviewed-by: Andrii Anisov <andrii_anisov@epam.com>
diff mbox series

Patch

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 7193d83b44..3bf11eec4f 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -1259,7 +1259,9 @@  int xenmem_add_to_physmap_one(
             return -EINVAL;
         }
 
-        if ( !p2m_is_ram(p2mt) )
+        if ( p2m_is_ram(p2mt) )
+            t = (p2mt == p2m_ram_rw) ? p2m_map_foreign_rw : p2m_map_foreign_ro;
+        else
         {
             put_page(page);
             rcu_unlock_domain(od);
@@ -1267,7 +1269,6 @@  int xenmem_add_to_physmap_one(
         }
 
         mfn = page_to_mfn(page);
-        t = p2m_map_foreign_rw;
 
         rcu_unlock_domain(od);
         break;
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index 89279fb590..1e7c91e39a 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -478,6 +478,7 @@  static void p2m_set_permission(lpae_t *e, p2m_type_t t, p2m_access_t a)
         break;
 
     case p2m_iommu_map_ro:
+    case p2m_map_foreign_ro:
     case p2m_grant_map_ro:
     case p2m_invalid:
         e->p2m.xn = 1;
diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
index a1aef7b793..a03a033a05 100644
--- a/xen/include/asm-arm/p2m.h
+++ b/xen/include/asm-arm/p2m.h
@@ -116,6 +116,7 @@  typedef enum {
     p2m_mmio_direct_nc, /* Read/write mapping of genuine MMIO area non-cacheable */
     p2m_mmio_direct_c,  /* Read/write mapping of genuine MMIO area cacheable */
     p2m_map_foreign_rw, /* Read/write RAM pages from foreign domain */
+    p2m_map_foreign_ro, /* Read-only RAM pages from foreign domain */
     p2m_grant_map_rw,   /* Read/write grant mapping */
     p2m_grant_map_ro,   /* Read-only grant mapping */
     /* The types below are only used to decide the page attribute in the P2M */
@@ -135,12 +136,16 @@  typedef enum {
 #define P2M_GRANT_TYPES (p2m_to_mask(p2m_grant_map_rw) |  \
                          p2m_to_mask(p2m_grant_map_ro))
 
+/* Foreign mappings types */
+#define P2M_FOREIGN_TYPES (p2m_to_mask(p2m_map_foreign_rw) | \
+                           p2m_to_mask(p2m_map_foreign_ro))
+
 /* Useful predicates */
 #define p2m_is_ram(_t) (p2m_to_mask(_t) & P2M_RAM_TYPES)
-#define p2m_is_foreign(_t) (p2m_to_mask(_t) & p2m_to_mask(p2m_map_foreign_rw))
+#define p2m_is_foreign(_t) (p2m_to_mask(_t) & P2M_FOREIGN_TYPES)
 #define p2m_is_any_ram(_t) (p2m_to_mask(_t) &                   \
                             (P2M_RAM_TYPES | P2M_GRANT_TYPES |  \
-                             p2m_to_mask(p2m_map_foreign_rw)))
+                             P2M_FOREIGN_TYPES))
 
 /* All common type definitions should live ahead of this inclusion. */
 #ifdef _XEN_P2M_COMMON_H