diff mbox

[RFC,for-4.8,4/6] xen/arm: Add helper functions to map RWX memory regions

Message ID 1463759488-11900-5-git-send-email-edgar.iglesias@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Edgar E. Iglesias May 20, 2016, 3:51 p.m. UTC
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>

Create a helper function to map regions as MEMORY with
cached attributes and read-write-execute permissions.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
---
 xen/arch/arm/p2m.c        | 26 ++++++++++++++++++++++++++
 xen/include/asm-arm/p2m.h | 10 ++++++++++
 2 files changed, 36 insertions(+)

Comments

Julien Grall May 23, 2016, 3:36 p.m. UTC | #1
Hi Edgar,

On 20/05/16 16:51, Edgar E. Iglesias wrote:
> From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
>
> Create a helper function to map regions as MEMORY with
> cached attributes and read-write-execute permissions.

Providing setting the execute bit is useful, I would try to rationalize 
the helpers by expanding map_regions_rw_cache (and maybe rename it).

> Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> ---
>   xen/arch/arm/p2m.c        | 26 ++++++++++++++++++++++++++
>   xen/include/asm-arm/p2m.h | 10 ++++++++++
>   2 files changed, 36 insertions(+)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index db21433..7e788f9 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -1219,6 +1219,32 @@ int p2m_populate_ram(struct domain *d,
>                                d->arch.p2m.default_access);
>   }
>
> +int map_regions_rwx_cache(struct domain *d,
> +                         unsigned long start_gfn,
> +                         unsigned long nr,
> +                         unsigned long mfn)
> +{
> +    return apply_p2m_changes(d, INSERT,
> +                             pfn_to_paddr(start_gfn),
> +                             pfn_to_paddr(start_gfn + nr),
> +                             pfn_to_paddr(mfn),
> +                             MATTR_MEM, 0, p2m_ram_rw,

We should not use p2m_ram_rw for other mapping than DRAM. It could be 
used by Xen to differentiate MMIO vs RAM.

> +                             p2m_access_rwx);
> +}
> +
> +int unmap_regions_rwx_cache(struct domain *d,
> +                           unsigned long start_gfn,
> +                           unsigned long nr,
> +                           unsigned long mfn)
> +{
> +    return apply_p2m_changes(d, REMOVE,
> +                             pfn_to_paddr(start_gfn),
> +                             pfn_to_paddr(start_gfn + nr),
> +                             pfn_to_paddr(mfn),
> +                             MATTR_MEM, 0, p2m_invalid,
> +                             p2m_access_rwx);
> +}
> +
>   int map_regions_rw_cache(struct domain *d,
>                            unsigned long start_gfn,
>                            unsigned long nr,
> diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
> index d240d1e..294050e 100644
> --- a/xen/include/asm-arm/p2m.h
> +++ b/xen/include/asm-arm/p2m.h
> @@ -144,6 +144,16 @@ int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn);
>   /* Setup p2m RAM mapping for domain d from start-end. */
>   int p2m_populate_ram(struct domain *d, paddr_t start, paddr_t end);
>
> +int map_regions_rwx_cache(struct domain *d,
> +                          unsigned long start_gfn,
> +                          unsigned long nr_mfns,
> +                          unsigned long mfn);
> +
> +int unmap_regions_rwx_cache(struct domain *d,
> +                            unsigned long start_gfn,
> +                            unsigned long nr_mfns,
> +                            unsigned long mfn);
> +
>   int map_regions_rw_cache(struct domain *d,
>                            unsigned long start_gfn,
>                            unsigned long nr_mfns,
>

Regards,
Edgar E. Iglesias May 24, 2016, 2:14 p.m. UTC | #2
On Mon, May 23, 2016 at 04:36:03PM +0100, Julien Grall wrote:
> Hi Edgar,
> 
> On 20/05/16 16:51, Edgar E. Iglesias wrote:
> >From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
> >
> >Create a helper function to map regions as MEMORY with
> >cached attributes and read-write-execute permissions.
> 
> Providing setting the execute bit is useful, I would try to rationalize the
> helpers by expanding map_regions_rw_cache (and maybe rename it).

Thanks, I'll have change the code around to do that.

> 
> >Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
> >---
> >  xen/arch/arm/p2m.c        | 26 ++++++++++++++++++++++++++
> >  xen/include/asm-arm/p2m.h | 10 ++++++++++
> >  2 files changed, 36 insertions(+)
> >
> >diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> >index db21433..7e788f9 100644
> >--- a/xen/arch/arm/p2m.c
> >+++ b/xen/arch/arm/p2m.c
> >@@ -1219,6 +1219,32 @@ int p2m_populate_ram(struct domain *d,
> >                               d->arch.p2m.default_access);
> >  }
> >
> >+int map_regions_rwx_cache(struct domain *d,
> >+                         unsigned long start_gfn,
> >+                         unsigned long nr,
> >+                         unsigned long mfn)
> >+{
> >+    return apply_p2m_changes(d, INSERT,
> >+                             pfn_to_paddr(start_gfn),
> >+                             pfn_to_paddr(start_gfn + nr),
> >+                             pfn_to_paddr(mfn),
> >+                             MATTR_MEM, 0, p2m_ram_rw,
> 
> We should not use p2m_ram_rw for other mapping than DRAM. It could be used
> by Xen to differentiate MMIO vs RAM.


OK, I see. I'll fix that.

Cheers,
Edgar

> 
> >+                             p2m_access_rwx);
> >+}
> >+
> >+int unmap_regions_rwx_cache(struct domain *d,
> >+                           unsigned long start_gfn,
> >+                           unsigned long nr,
> >+                           unsigned long mfn)
> >+{
> >+    return apply_p2m_changes(d, REMOVE,
> >+                             pfn_to_paddr(start_gfn),
> >+                             pfn_to_paddr(start_gfn + nr),
> >+                             pfn_to_paddr(mfn),
> >+                             MATTR_MEM, 0, p2m_invalid,
> >+                             p2m_access_rwx);
> >+}
> >+
> >  int map_regions_rw_cache(struct domain *d,
> >                           unsigned long start_gfn,
> >                           unsigned long nr,
> >diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
> >index d240d1e..294050e 100644
> >--- a/xen/include/asm-arm/p2m.h
> >+++ b/xen/include/asm-arm/p2m.h
> >@@ -144,6 +144,16 @@ int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn);
> >  /* Setup p2m RAM mapping for domain d from start-end. */
> >  int p2m_populate_ram(struct domain *d, paddr_t start, paddr_t end);
> >
> >+int map_regions_rwx_cache(struct domain *d,
> >+                          unsigned long start_gfn,
> >+                          unsigned long nr_mfns,
> >+                          unsigned long mfn);
> >+
> >+int unmap_regions_rwx_cache(struct domain *d,
> >+                            unsigned long start_gfn,
> >+                            unsigned long nr_mfns,
> >+                            unsigned long mfn);
> >+
> >  int map_regions_rw_cache(struct domain *d,
> >                           unsigned long start_gfn,
> >                           unsigned long nr_mfns,
> >
> 
> Regards,
> 
> -- 
> Julien Grall
diff mbox

Patch

diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index db21433..7e788f9 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -1219,6 +1219,32 @@  int p2m_populate_ram(struct domain *d,
                              d->arch.p2m.default_access);
 }
 
+int map_regions_rwx_cache(struct domain *d,
+                         unsigned long start_gfn,
+                         unsigned long nr,
+                         unsigned long mfn)
+{
+    return apply_p2m_changes(d, INSERT,
+                             pfn_to_paddr(start_gfn),
+                             pfn_to_paddr(start_gfn + nr),
+                             pfn_to_paddr(mfn),
+                             MATTR_MEM, 0, p2m_ram_rw,
+                             p2m_access_rwx);
+}
+
+int unmap_regions_rwx_cache(struct domain *d,
+                           unsigned long start_gfn,
+                           unsigned long nr,
+                           unsigned long mfn)
+{
+    return apply_p2m_changes(d, REMOVE,
+                             pfn_to_paddr(start_gfn),
+                             pfn_to_paddr(start_gfn + nr),
+                             pfn_to_paddr(mfn),
+                             MATTR_MEM, 0, p2m_invalid,
+                             p2m_access_rwx);
+}
+
 int map_regions_rw_cache(struct domain *d,
                          unsigned long start_gfn,
                          unsigned long nr,
diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
index d240d1e..294050e 100644
--- a/xen/include/asm-arm/p2m.h
+++ b/xen/include/asm-arm/p2m.h
@@ -144,6 +144,16 @@  int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn);
 /* Setup p2m RAM mapping for domain d from start-end. */
 int p2m_populate_ram(struct domain *d, paddr_t start, paddr_t end);
 
+int map_regions_rwx_cache(struct domain *d,
+                          unsigned long start_gfn,
+                          unsigned long nr_mfns,
+                          unsigned long mfn);
+
+int unmap_regions_rwx_cache(struct domain *d,
+                            unsigned long start_gfn,
+                            unsigned long nr_mfns,
+                            unsigned long mfn);
+
 int map_regions_rw_cache(struct domain *d,
                          unsigned long start_gfn,
                          unsigned long nr_mfns,