xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] xen arm: add XSM hooks to arch_memory_op
@ 2013-01-17 17:02 Ian Campbell
  2013-01-18 11:59 ` Ian Campbell
  0 siblings, 1 reply; 6+ messages in thread
From: Ian Campbell @ 2013-01-17 17:02 UTC (permalink / raw)
  To: xen-devel; +Cc: Daniel De Graaf, stefano.stabellini, Ian Campbell

Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.

Reported-by: Lars Rasmusson <Lars.Rasmusson@sics.se>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
v4:
 - Just fix FLASK_ENABLED=n here, leave build issues with
   FLASK_ENABLE=y till the next patch
v3:
 - ppropage errors from xsm_*_*_physmap.
 - refactor MSI support into arch specific functions
v2:
 - move the hooks in hooks.c and dummy.c too.
 - make XSM actually build on arm.
---
 xen/arch/arm/mm.c       |   15 +++++++++++++++
 xen/include/xsm/dummy.h |   24 ++++++++++++------------
 xen/include/xsm/xsm.h   |   12 ++++++------
 xen/xsm/dummy.c         |    5 +++--
 xen/xsm/flask/hooks.c   |   25 +++++++++++++------------
 5 files changed, 49 insertions(+), 32 deletions(-)

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 945e7ac..eb5213e 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -35,6 +35,7 @@
 #include <asm/current.h>
 #include <public/memory.h>
 #include <xen/sched.h>
+#include <xsm/xsm.h>
 
 struct domain *dom_xen, *dom_io, *dom_cow;
 
@@ -655,6 +656,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
         if ( rc != 0 )
             return rc;
 
+        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
+        if ( rc )
+        {
+            rcu_unlock_domain(d);
+            return rc;
+        }
+
         rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID,
                                        xatp.idx, xatp.gpfn);
 
@@ -675,6 +683,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
         if ( rc != 0 )
             return rc;
 
+        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
+        if ( rc )
+        {
+            rcu_unlock_domain(d);
+            return rc;
+        }
+
         rc = xenmem_add_to_physmap_range(d, &xatpr);
 
         rcu_unlock_domain(d);
diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
index 1ca82b0..870bd67 100644
--- a/xen/include/xsm/dummy.h
+++ b/xen/include/xsm/dummy.h
@@ -443,6 +443,18 @@ static XSM_INLINE int xsm_pci_config_permission(XSM_DEFAULT_ARG struct domain *d
     return xsm_default_action(action, current->domain, d);
 }
 
+static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
+{
+    XSM_ASSERT_ACTION(XSM_TARGET);
+    return xsm_default_action(action, d1, d2);
+}
+
+static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
+{
+    XSM_ASSERT_ACTION(XSM_TARGET);
+    return xsm_default_action(action, d1, d2);
+}
+
 #ifdef CONFIG_X86
 static XSM_INLINE int xsm_shadow_control(XSM_DEFAULT_ARG struct domain *d, uint32_t op)
 {
@@ -544,18 +556,6 @@ static XSM_INLINE int xsm_update_va_mapping(XSM_DEFAULT_ARG struct domain *d, st
     return xsm_default_action(action, d, f);
 }
 
-static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
-{
-    XSM_ASSERT_ACTION(XSM_TARGET);
-    return xsm_default_action(action, d1, d2);
-}
-
-static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
-{
-    XSM_ASSERT_ACTION(XSM_TARGET);
-    return xsm_default_action(action, d1, d2);
-}
-
 static XSM_INLINE int xsm_bind_pt_irq(XSM_DEFAULT_ARG struct domain *d, struct xen_domctl_bind_pt_irq *bind)
 {
     XSM_ASSERT_ACTION(XSM_HOOK);
diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
index 8947372..5048344 100644
--- a/xen/include/xsm/xsm.h
+++ b/xen/include/xsm/xsm.h
@@ -90,6 +90,7 @@ struct xsm_operations {
     int (*memory_adjust_reservation) (struct domain *d1, struct domain *d2);
     int (*memory_stat_reservation) (struct domain *d1, struct domain *d2);
     int (*memory_pin_page) (struct domain *d1, struct domain *d2, struct page_info *page);
+    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
     int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
 
     int (*console_io) (struct domain *d, int cmd);
@@ -149,7 +150,6 @@ struct xsm_operations {
                        struct domain *f, uint32_t flags);
     int (*mmuext_op) (struct domain *d, struct domain *f);
     int (*update_va_mapping) (struct domain *d, struct domain *f, l1_pgentry_t pte);
-    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
     int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
     int (*unbind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
     int (*ioport_permission) (struct domain *d, uint32_t s, uint32_t e, uint8_t allow);
@@ -335,6 +335,11 @@ static inline int xsm_memory_pin_page(xsm_default_t def, struct domain *d1, stru
     return xsm_ops->memory_pin_page(d1, d2, page);
 }
 
+static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
+{
+    return xsm_ops->add_to_physmap(d1, d2);
+}
+
 static inline int xsm_remove_from_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
 {
     return xsm_ops->remove_from_physmap(d1, d2);
@@ -558,11 +563,6 @@ static inline int xsm_update_va_mapping(xsm_default_t def, struct domain *d, str
     return xsm_ops->update_va_mapping(d, f, pte);
 }
 
-static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
-{
-    return xsm_ops->add_to_physmap(d1, d2);
-}
-
 static inline int xsm_bind_pt_irq(xsm_default_t def, struct domain *d,
                                                 struct xen_domctl_bind_pt_irq *bind)
 {
diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
index 529a724..5031e16 100644
--- a/xen/xsm/dummy.c
+++ b/xen/xsm/dummy.c
@@ -101,6 +101,9 @@ void xsm_fixup_ops (struct xsm_operations *ops)
 
     set_to_dummy_if_null(ops, do_xsm_op);
 
+    set_to_dummy_if_null(ops, add_to_physmap);
+    set_to_dummy_if_null(ops, remove_from_physmap);
+
 #ifdef CONFIG_X86
     set_to_dummy_if_null(ops, shadow_control);
     set_to_dummy_if_null(ops, hvm_param);
@@ -118,8 +121,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
     set_to_dummy_if_null(ops, mmu_update);
     set_to_dummy_if_null(ops, mmuext_op);
     set_to_dummy_if_null(ops, update_va_mapping);
-    set_to_dummy_if_null(ops, add_to_physmap);
-    set_to_dummy_if_null(ops, remove_from_physmap);
     set_to_dummy_if_null(ops, bind_pt_irq);
     set_to_dummy_if_null(ops, unbind_pt_irq);
     set_to_dummy_if_null(ops, ioport_permission);
diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
index ba67502..2a13549 100644
--- a/xen/xsm/flask/hooks.c
+++ b/xen/xsm/flask/hooks.c
@@ -1055,6 +1055,16 @@ static inline int flask_tmem_control(void)
     return domain_has_xen(current->domain, XEN__TMEM_CONTROL);
 }
 
+static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
+{
+    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
+}
+
+static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
+{
+    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
+}
+
 #ifdef CONFIG_X86
 static int flask_shadow_control(struct domain *d, uint32_t op)
 {
@@ -1325,16 +1335,6 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
     return domain_has_perm(d, f, SECCLASS_MMU, map_perms);
 }
 
-static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
-{
-    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
-}
-
-static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
-{
-    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
-}
-
 static int flask_get_device_group(uint32_t machine_bdf)
 {
     u32 rsid;
@@ -1501,6 +1501,9 @@ static struct xsm_operations flask_ops = {
 
     .do_xsm_op = do_flask_op,
 
+    .add_to_physmap = flask_add_to_physmap,
+    .remove_from_physmap = flask_remove_from_physmap,
+
 #ifdef CONFIG_X86
     .shadow_control = flask_shadow_control,
     .hvm_param = flask_hvm_param,
@@ -1518,8 +1521,6 @@ static struct xsm_operations flask_ops = {
     .mmu_update = flask_mmu_update,
     .mmuext_op = flask_mmuext_op,
     .update_va_mapping = flask_update_va_mapping,
-    .add_to_physmap = flask_add_to_physmap,
-    .remove_from_physmap = flask_remove_from_physmap,
     .get_device_group = flask_get_device_group,
     .test_assign_device = flask_test_assign_device,
     .assign_device = flask_assign_device,
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] xen arm: add XSM hooks to arch_memory_op
  2013-01-17 17:02 [PATCH] xen arm: add XSM hooks to arch_memory_op Ian Campbell
@ 2013-01-18 11:59 ` Ian Campbell
  2013-01-18 12:17   ` Stefano Stabellini
  0 siblings, 1 reply; 6+ messages in thread
From: Ian Campbell @ 2013-01-18 11:59 UTC (permalink / raw)
  To: xen-devel@lists.xen.org; +Cc: Daniel De Graaf, Stefano Stabellini

On Thu, 2013-01-17 at 17:02 +0000, Ian Campbell wrote:
> Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.

Does this patch look OK? Since it fixes a build failure on ARM I'd like
to get it in ASAP.

> 
> Reported-by: Lars Rasmusson <Lars.Rasmusson@sics.se>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
> v4:
>  - Just fix FLASK_ENABLED=n here, leave build issues with
>    FLASK_ENABLE=y till the next patch
> v3:
>  - ppropage errors from xsm_*_*_physmap.
>  - refactor MSI support into arch specific functions
> v2:
>  - move the hooks in hooks.c and dummy.c too.
>  - make XSM actually build on arm.
> ---
>  xen/arch/arm/mm.c       |   15 +++++++++++++++
>  xen/include/xsm/dummy.h |   24 ++++++++++++------------
>  xen/include/xsm/xsm.h   |   12 ++++++------
>  xen/xsm/dummy.c         |    5 +++--
>  xen/xsm/flask/hooks.c   |   25 +++++++++++++------------
>  5 files changed, 49 insertions(+), 32 deletions(-)
> 
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 945e7ac..eb5213e 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -35,6 +35,7 @@
>  #include <asm/current.h>
>  #include <public/memory.h>
>  #include <xen/sched.h>
> +#include <xsm/xsm.h>
>  
>  struct domain *dom_xen, *dom_io, *dom_cow;
>  
> @@ -655,6 +656,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
>          if ( rc != 0 )
>              return rc;
>  
> +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> +        if ( rc )
> +        {
> +            rcu_unlock_domain(d);
> +            return rc;
> +        }
> +
>          rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID,
>                                         xatp.idx, xatp.gpfn);
>  
> @@ -675,6 +683,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
>          if ( rc != 0 )
>              return rc;
>  
> +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> +        if ( rc )
> +        {
> +            rcu_unlock_domain(d);
> +            return rc;
> +        }
> +
>          rc = xenmem_add_to_physmap_range(d, &xatpr);
>  
>          rcu_unlock_domain(d);
> diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
> index 1ca82b0..870bd67 100644
> --- a/xen/include/xsm/dummy.h
> +++ b/xen/include/xsm/dummy.h
> @@ -443,6 +443,18 @@ static XSM_INLINE int xsm_pci_config_permission(XSM_DEFAULT_ARG struct domain *d
>      return xsm_default_action(action, current->domain, d);
>  }
>  
> +static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> +{
> +    XSM_ASSERT_ACTION(XSM_TARGET);
> +    return xsm_default_action(action, d1, d2);
> +}
> +
> +static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> +{
> +    XSM_ASSERT_ACTION(XSM_TARGET);
> +    return xsm_default_action(action, d1, d2);
> +}
> +
>  #ifdef CONFIG_X86
>  static XSM_INLINE int xsm_shadow_control(XSM_DEFAULT_ARG struct domain *d, uint32_t op)
>  {
> @@ -544,18 +556,6 @@ static XSM_INLINE int xsm_update_va_mapping(XSM_DEFAULT_ARG struct domain *d, st
>      return xsm_default_action(action, d, f);
>  }
>  
> -static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> -{
> -    XSM_ASSERT_ACTION(XSM_TARGET);
> -    return xsm_default_action(action, d1, d2);
> -}
> -
> -static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> -{
> -    XSM_ASSERT_ACTION(XSM_TARGET);
> -    return xsm_default_action(action, d1, d2);
> -}
> -
>  static XSM_INLINE int xsm_bind_pt_irq(XSM_DEFAULT_ARG struct domain *d, struct xen_domctl_bind_pt_irq *bind)
>  {
>      XSM_ASSERT_ACTION(XSM_HOOK);
> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> index 8947372..5048344 100644
> --- a/xen/include/xsm/xsm.h
> +++ b/xen/include/xsm/xsm.h
> @@ -90,6 +90,7 @@ struct xsm_operations {
>      int (*memory_adjust_reservation) (struct domain *d1, struct domain *d2);
>      int (*memory_stat_reservation) (struct domain *d1, struct domain *d2);
>      int (*memory_pin_page) (struct domain *d1, struct domain *d2, struct page_info *page);
> +    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
>      int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
>  
>      int (*console_io) (struct domain *d, int cmd);
> @@ -149,7 +150,6 @@ struct xsm_operations {
>                         struct domain *f, uint32_t flags);
>      int (*mmuext_op) (struct domain *d, struct domain *f);
>      int (*update_va_mapping) (struct domain *d, struct domain *f, l1_pgentry_t pte);
> -    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
>      int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
>      int (*unbind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
>      int (*ioport_permission) (struct domain *d, uint32_t s, uint32_t e, uint8_t allow);
> @@ -335,6 +335,11 @@ static inline int xsm_memory_pin_page(xsm_default_t def, struct domain *d1, stru
>      return xsm_ops->memory_pin_page(d1, d2, page);
>  }
>  
> +static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> +{
> +    return xsm_ops->add_to_physmap(d1, d2);
> +}
> +
>  static inline int xsm_remove_from_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
>  {
>      return xsm_ops->remove_from_physmap(d1, d2);
> @@ -558,11 +563,6 @@ static inline int xsm_update_va_mapping(xsm_default_t def, struct domain *d, str
>      return xsm_ops->update_va_mapping(d, f, pte);
>  }
>  
> -static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> -{
> -    return xsm_ops->add_to_physmap(d1, d2);
> -}
> -
>  static inline int xsm_bind_pt_irq(xsm_default_t def, struct domain *d,
>                                                  struct xen_domctl_bind_pt_irq *bind)
>  {
> diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
> index 529a724..5031e16 100644
> --- a/xen/xsm/dummy.c
> +++ b/xen/xsm/dummy.c
> @@ -101,6 +101,9 @@ void xsm_fixup_ops (struct xsm_operations *ops)
>  
>      set_to_dummy_if_null(ops, do_xsm_op);
>  
> +    set_to_dummy_if_null(ops, add_to_physmap);
> +    set_to_dummy_if_null(ops, remove_from_physmap);
> +
>  #ifdef CONFIG_X86
>      set_to_dummy_if_null(ops, shadow_control);
>      set_to_dummy_if_null(ops, hvm_param);
> @@ -118,8 +121,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
>      set_to_dummy_if_null(ops, mmu_update);
>      set_to_dummy_if_null(ops, mmuext_op);
>      set_to_dummy_if_null(ops, update_va_mapping);
> -    set_to_dummy_if_null(ops, add_to_physmap);
> -    set_to_dummy_if_null(ops, remove_from_physmap);
>      set_to_dummy_if_null(ops, bind_pt_irq);
>      set_to_dummy_if_null(ops, unbind_pt_irq);
>      set_to_dummy_if_null(ops, ioport_permission);
> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> index ba67502..2a13549 100644
> --- a/xen/xsm/flask/hooks.c
> +++ b/xen/xsm/flask/hooks.c
> @@ -1055,6 +1055,16 @@ static inline int flask_tmem_control(void)
>      return domain_has_xen(current->domain, XEN__TMEM_CONTROL);
>  }
>  
> +static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> +{
> +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> +}
> +
> +static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> +{
> +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> +}
> +
>  #ifdef CONFIG_X86
>  static int flask_shadow_control(struct domain *d, uint32_t op)
>  {
> @@ -1325,16 +1335,6 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
>      return domain_has_perm(d, f, SECCLASS_MMU, map_perms);
>  }
>  
> -static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> -{
> -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> -}
> -
> -static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> -{
> -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> -}
> -
>  static int flask_get_device_group(uint32_t machine_bdf)
>  {
>      u32 rsid;
> @@ -1501,6 +1501,9 @@ static struct xsm_operations flask_ops = {
>  
>      .do_xsm_op = do_flask_op,
>  
> +    .add_to_physmap = flask_add_to_physmap,
> +    .remove_from_physmap = flask_remove_from_physmap,
> +
>  #ifdef CONFIG_X86
>      .shadow_control = flask_shadow_control,
>      .hvm_param = flask_hvm_param,
> @@ -1518,8 +1521,6 @@ static struct xsm_operations flask_ops = {
>      .mmu_update = flask_mmu_update,
>      .mmuext_op = flask_mmuext_op,
>      .update_va_mapping = flask_update_va_mapping,
> -    .add_to_physmap = flask_add_to_physmap,
> -    .remove_from_physmap = flask_remove_from_physmap,
>      .get_device_group = flask_get_device_group,
>      .test_assign_device = flask_test_assign_device,
>      .assign_device = flask_assign_device,

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xen arm: add XSM hooks to arch_memory_op
  2013-01-18 11:59 ` Ian Campbell
@ 2013-01-18 12:17   ` Stefano Stabellini
  2013-01-21 11:41     ` Ian Campbell
  0 siblings, 1 reply; 6+ messages in thread
From: Stefano Stabellini @ 2013-01-18 12:17 UTC (permalink / raw)
  To: Ian Campbell; +Cc: Daniel De Graaf, Stefano Stabellini, xen-devel@lists.xen.org

On Fri, 18 Jan 2013, Ian Campbell wrote:
> On Thu, 2013-01-17 at 17:02 +0000, Ian Campbell wrote:
> > Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.
> 
> Does this patch look OK? Since it fixes a build failure on ARM I'd like
> to get it in ASAP.

It looks OK to me.

> > 
> > Reported-by: Lars Rasmusson <Lars.Rasmusson@sics.se>
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> > Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> > ---
> > v4:
> >  - Just fix FLASK_ENABLED=n here, leave build issues with
> >    FLASK_ENABLE=y till the next patch
> > v3:
> >  - ppropage errors from xsm_*_*_physmap.
> >  - refactor MSI support into arch specific functions
> > v2:
> >  - move the hooks in hooks.c and dummy.c too.
> >  - make XSM actually build on arm.
> > ---
> >  xen/arch/arm/mm.c       |   15 +++++++++++++++
> >  xen/include/xsm/dummy.h |   24 ++++++++++++------------
> >  xen/include/xsm/xsm.h   |   12 ++++++------
> >  xen/xsm/dummy.c         |    5 +++--
> >  xen/xsm/flask/hooks.c   |   25 +++++++++++++------------
> >  5 files changed, 49 insertions(+), 32 deletions(-)
> > 
> > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> > index 945e7ac..eb5213e 100644
> > --- a/xen/arch/arm/mm.c
> > +++ b/xen/arch/arm/mm.c
> > @@ -35,6 +35,7 @@
> >  #include <asm/current.h>
> >  #include <public/memory.h>
> >  #include <xen/sched.h>
> > +#include <xsm/xsm.h>
> >  
> >  struct domain *dom_xen, *dom_io, *dom_cow;
> >  
> > @@ -655,6 +656,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
> >          if ( rc != 0 )
> >              return rc;
> >  
> > +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> > +        if ( rc )
> > +        {
> > +            rcu_unlock_domain(d);
> > +            return rc;
> > +        }
> > +
> >          rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID,
> >                                         xatp.idx, xatp.gpfn);
> >  
> > @@ -675,6 +683,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
> >          if ( rc != 0 )
> >              return rc;
> >  
> > +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> > +        if ( rc )
> > +        {
> > +            rcu_unlock_domain(d);
> > +            return rc;
> > +        }
> > +
> >          rc = xenmem_add_to_physmap_range(d, &xatpr);
> >  
> >          rcu_unlock_domain(d);
> > diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
> > index 1ca82b0..870bd67 100644
> > --- a/xen/include/xsm/dummy.h
> > +++ b/xen/include/xsm/dummy.h
> > @@ -443,6 +443,18 @@ static XSM_INLINE int xsm_pci_config_permission(XSM_DEFAULT_ARG struct domain *d
> >      return xsm_default_action(action, current->domain, d);
> >  }
> >  
> > +static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > +{
> > +    XSM_ASSERT_ACTION(XSM_TARGET);
> > +    return xsm_default_action(action, d1, d2);
> > +}
> > +
> > +static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > +{
> > +    XSM_ASSERT_ACTION(XSM_TARGET);
> > +    return xsm_default_action(action, d1, d2);
> > +}
> > +
> >  #ifdef CONFIG_X86
> >  static XSM_INLINE int xsm_shadow_control(XSM_DEFAULT_ARG struct domain *d, uint32_t op)
> >  {
> > @@ -544,18 +556,6 @@ static XSM_INLINE int xsm_update_va_mapping(XSM_DEFAULT_ARG struct domain *d, st
> >      return xsm_default_action(action, d, f);
> >  }
> >  
> > -static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > -{
> > -    XSM_ASSERT_ACTION(XSM_TARGET);
> > -    return xsm_default_action(action, d1, d2);
> > -}
> > -
> > -static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > -{
> > -    XSM_ASSERT_ACTION(XSM_TARGET);
> > -    return xsm_default_action(action, d1, d2);
> > -}
> > -
> >  static XSM_INLINE int xsm_bind_pt_irq(XSM_DEFAULT_ARG struct domain *d, struct xen_domctl_bind_pt_irq *bind)
> >  {
> >      XSM_ASSERT_ACTION(XSM_HOOK);
> > diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> > index 8947372..5048344 100644
> > --- a/xen/include/xsm/xsm.h
> > +++ b/xen/include/xsm/xsm.h
> > @@ -90,6 +90,7 @@ struct xsm_operations {
> >      int (*memory_adjust_reservation) (struct domain *d1, struct domain *d2);
> >      int (*memory_stat_reservation) (struct domain *d1, struct domain *d2);
> >      int (*memory_pin_page) (struct domain *d1, struct domain *d2, struct page_info *page);
> > +    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
> >      int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
> >  
> >      int (*console_io) (struct domain *d, int cmd);
> > @@ -149,7 +150,6 @@ struct xsm_operations {
> >                         struct domain *f, uint32_t flags);
> >      int (*mmuext_op) (struct domain *d, struct domain *f);
> >      int (*update_va_mapping) (struct domain *d, struct domain *f, l1_pgentry_t pte);
> > -    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
> >      int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
> >      int (*unbind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
> >      int (*ioport_permission) (struct domain *d, uint32_t s, uint32_t e, uint8_t allow);
> > @@ -335,6 +335,11 @@ static inline int xsm_memory_pin_page(xsm_default_t def, struct domain *d1, stru
> >      return xsm_ops->memory_pin_page(d1, d2, page);
> >  }
> >  
> > +static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> > +{
> > +    return xsm_ops->add_to_physmap(d1, d2);
> > +}
> > +
> >  static inline int xsm_remove_from_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> >  {
> >      return xsm_ops->remove_from_physmap(d1, d2);
> > @@ -558,11 +563,6 @@ static inline int xsm_update_va_mapping(xsm_default_t def, struct domain *d, str
> >      return xsm_ops->update_va_mapping(d, f, pte);
> >  }
> >  
> > -static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> > -{
> > -    return xsm_ops->add_to_physmap(d1, d2);
> > -}
> > -
> >  static inline int xsm_bind_pt_irq(xsm_default_t def, struct domain *d,
> >                                                  struct xen_domctl_bind_pt_irq *bind)
> >  {
> > diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
> > index 529a724..5031e16 100644
> > --- a/xen/xsm/dummy.c
> > +++ b/xen/xsm/dummy.c
> > @@ -101,6 +101,9 @@ void xsm_fixup_ops (struct xsm_operations *ops)
> >  
> >      set_to_dummy_if_null(ops, do_xsm_op);
> >  
> > +    set_to_dummy_if_null(ops, add_to_physmap);
> > +    set_to_dummy_if_null(ops, remove_from_physmap);
> > +
> >  #ifdef CONFIG_X86
> >      set_to_dummy_if_null(ops, shadow_control);
> >      set_to_dummy_if_null(ops, hvm_param);
> > @@ -118,8 +121,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
> >      set_to_dummy_if_null(ops, mmu_update);
> >      set_to_dummy_if_null(ops, mmuext_op);
> >      set_to_dummy_if_null(ops, update_va_mapping);
> > -    set_to_dummy_if_null(ops, add_to_physmap);
> > -    set_to_dummy_if_null(ops, remove_from_physmap);
> >      set_to_dummy_if_null(ops, bind_pt_irq);
> >      set_to_dummy_if_null(ops, unbind_pt_irq);
> >      set_to_dummy_if_null(ops, ioport_permission);
> > diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> > index ba67502..2a13549 100644
> > --- a/xen/xsm/flask/hooks.c
> > +++ b/xen/xsm/flask/hooks.c
> > @@ -1055,6 +1055,16 @@ static inline int flask_tmem_control(void)
> >      return domain_has_xen(current->domain, XEN__TMEM_CONTROL);
> >  }
> >  
> > +static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> > +{
> > +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > +}
> > +
> > +static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> > +{
> > +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > +}
> > +
> >  #ifdef CONFIG_X86
> >  static int flask_shadow_control(struct domain *d, uint32_t op)
> >  {
> > @@ -1325,16 +1335,6 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
> >      return domain_has_perm(d, f, SECCLASS_MMU, map_perms);
> >  }
> >  
> > -static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> > -{
> > -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > -}
> > -
> > -static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> > -{
> > -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > -}
> > -
> >  static int flask_get_device_group(uint32_t machine_bdf)
> >  {
> >      u32 rsid;
> > @@ -1501,6 +1501,9 @@ static struct xsm_operations flask_ops = {
> >  
> >      .do_xsm_op = do_flask_op,
> >  
> > +    .add_to_physmap = flask_add_to_physmap,
> > +    .remove_from_physmap = flask_remove_from_physmap,
> > +
> >  #ifdef CONFIG_X86
> >      .shadow_control = flask_shadow_control,
> >      .hvm_param = flask_hvm_param,
> > @@ -1518,8 +1521,6 @@ static struct xsm_operations flask_ops = {
> >      .mmu_update = flask_mmu_update,
> >      .mmuext_op = flask_mmuext_op,
> >      .update_va_mapping = flask_update_va_mapping,
> > -    .add_to_physmap = flask_add_to_physmap,
> > -    .remove_from_physmap = flask_remove_from_physmap,
> >      .get_device_group = flask_get_device_group,
> >      .test_assign_device = flask_test_assign_device,
> >      .assign_device = flask_assign_device,
> 
> 
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xen arm: add XSM hooks to arch_memory_op
  2013-01-18 12:17   ` Stefano Stabellini
@ 2013-01-21 11:41     ` Ian Campbell
  2013-01-21 16:28       ` Keir Fraser
  0 siblings, 1 reply; 6+ messages in thread
From: Ian Campbell @ 2013-01-21 11:41 UTC (permalink / raw)
  To: Stefano Stabellini; +Cc: Daniel De Graaf, Keir Fraser, xen-devel@lists.xen.org

On Fri, 2013-01-18 at 12:17 +0000, Stefano Stabellini wrote:
> On Fri, 18 Jan 2013, Ian Campbell wrote:
> > On Thu, 2013-01-17 at 17:02 +0000, Ian Campbell wrote:
> > > Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.
> > 
> > Does this patch look OK? Since it fixes a build failure on ARM I'd like
> > to get it in ASAP.
> 
> It looks OK to me.

Thanks

Keir/Daniel, any objections to this? Keir acked the earlier fix from
Lars but this one is substantially different enough for me not to want
to carry it over.

This is an ARM build fix arising from the recent XSM changes.

Ian.

> 
> > > 
> > > Reported-by: Lars Rasmusson <Lars.Rasmusson@sics.se>
> > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> > > Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> > > ---
> > > v4:
> > >  - Just fix FLASK_ENABLED=n here, leave build issues with
> > >    FLASK_ENABLE=y till the next patch
> > > v3:
> > >  - ppropage errors from xsm_*_*_physmap.
> > >  - refactor MSI support into arch specific functions
> > > v2:
> > >  - move the hooks in hooks.c and dummy.c too.
> > >  - make XSM actually build on arm.
> > > ---
> > >  xen/arch/arm/mm.c       |   15 +++++++++++++++
> > >  xen/include/xsm/dummy.h |   24 ++++++++++++------------
> > >  xen/include/xsm/xsm.h   |   12 ++++++------
> > >  xen/xsm/dummy.c         |    5 +++--
> > >  xen/xsm/flask/hooks.c   |   25 +++++++++++++------------
> > >  5 files changed, 49 insertions(+), 32 deletions(-)
> > > 
> > > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> > > index 945e7ac..eb5213e 100644
> > > --- a/xen/arch/arm/mm.c
> > > +++ b/xen/arch/arm/mm.c
> > > @@ -35,6 +35,7 @@
> > >  #include <asm/current.h>
> > >  #include <public/memory.h>
> > >  #include <xen/sched.h>
> > > +#include <xsm/xsm.h>
> > >  
> > >  struct domain *dom_xen, *dom_io, *dom_cow;
> > >  
> > > @@ -655,6 +656,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
> > >          if ( rc != 0 )
> > >              return rc;
> > >  
> > > +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> > > +        if ( rc )
> > > +        {
> > > +            rcu_unlock_domain(d);
> > > +            return rc;
> > > +        }
> > > +
> > >          rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID,
> > >                                         xatp.idx, xatp.gpfn);
> > >  
> > > @@ -675,6 +683,13 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg)
> > >          if ( rc != 0 )
> > >              return rc;
> > >  
> > > +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
> > > +        if ( rc )
> > > +        {
> > > +            rcu_unlock_domain(d);
> > > +            return rc;
> > > +        }
> > > +
> > >          rc = xenmem_add_to_physmap_range(d, &xatpr);
> > >  
> > >          rcu_unlock_domain(d);
> > > diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
> > > index 1ca82b0..870bd67 100644
> > > --- a/xen/include/xsm/dummy.h
> > > +++ b/xen/include/xsm/dummy.h
> > > @@ -443,6 +443,18 @@ static XSM_INLINE int xsm_pci_config_permission(XSM_DEFAULT_ARG struct domain *d
> > >      return xsm_default_action(action, current->domain, d);
> > >  }
> > >  
> > > +static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > > +{
> > > +    XSM_ASSERT_ACTION(XSM_TARGET);
> > > +    return xsm_default_action(action, d1, d2);
> > > +}
> > > +
> > > +static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > > +{
> > > +    XSM_ASSERT_ACTION(XSM_TARGET);
> > > +    return xsm_default_action(action, d1, d2);
> > > +}
> > > +
> > >  #ifdef CONFIG_X86
> > >  static XSM_INLINE int xsm_shadow_control(XSM_DEFAULT_ARG struct domain *d, uint32_t op)
> > >  {
> > > @@ -544,18 +556,6 @@ static XSM_INLINE int xsm_update_va_mapping(XSM_DEFAULT_ARG struct domain *d, st
> > >      return xsm_default_action(action, d, f);
> > >  }
> > >  
> > > -static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > > -{
> > > -    XSM_ASSERT_ACTION(XSM_TARGET);
> > > -    return xsm_default_action(action, d1, d2);
> > > -}
> > > -
> > > -static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct domain *d1, struct domain *d2)
> > > -{
> > > -    XSM_ASSERT_ACTION(XSM_TARGET);
> > > -    return xsm_default_action(action, d1, d2);
> > > -}
> > > -
> > >  static XSM_INLINE int xsm_bind_pt_irq(XSM_DEFAULT_ARG struct domain *d, struct xen_domctl_bind_pt_irq *bind)
> > >  {
> > >      XSM_ASSERT_ACTION(XSM_HOOK);
> > > diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> > > index 8947372..5048344 100644
> > > --- a/xen/include/xsm/xsm.h
> > > +++ b/xen/include/xsm/xsm.h
> > > @@ -90,6 +90,7 @@ struct xsm_operations {
> > >      int (*memory_adjust_reservation) (struct domain *d1, struct domain *d2);
> > >      int (*memory_stat_reservation) (struct domain *d1, struct domain *d2);
> > >      int (*memory_pin_page) (struct domain *d1, struct domain *d2, struct page_info *page);
> > > +    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
> > >      int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
> > >  
> > >      int (*console_io) (struct domain *d, int cmd);
> > > @@ -149,7 +150,6 @@ struct xsm_operations {
> > >                         struct domain *f, uint32_t flags);
> > >      int (*mmuext_op) (struct domain *d, struct domain *f);
> > >      int (*update_va_mapping) (struct domain *d, struct domain *f, l1_pgentry_t pte);
> > > -    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
> > >      int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
> > >      int (*unbind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind);
> > >      int (*ioport_permission) (struct domain *d, uint32_t s, uint32_t e, uint8_t allow);
> > > @@ -335,6 +335,11 @@ static inline int xsm_memory_pin_page(xsm_default_t def, struct domain *d1, stru
> > >      return xsm_ops->memory_pin_page(d1, d2, page);
> > >  }
> > >  
> > > +static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> > > +{
> > > +    return xsm_ops->add_to_physmap(d1, d2);
> > > +}
> > > +
> > >  static inline int xsm_remove_from_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> > >  {
> > >      return xsm_ops->remove_from_physmap(d1, d2);
> > > @@ -558,11 +563,6 @@ static inline int xsm_update_va_mapping(xsm_default_t def, struct domain *d, str
> > >      return xsm_ops->update_va_mapping(d, f, pte);
> > >  }
> > >  
> > > -static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1, struct domain *d2)
> > > -{
> > > -    return xsm_ops->add_to_physmap(d1, d2);
> > > -}
> > > -
> > >  static inline int xsm_bind_pt_irq(xsm_default_t def, struct domain *d,
> > >                                                  struct xen_domctl_bind_pt_irq *bind)
> > >  {
> > > diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
> > > index 529a724..5031e16 100644
> > > --- a/xen/xsm/dummy.c
> > > +++ b/xen/xsm/dummy.c
> > > @@ -101,6 +101,9 @@ void xsm_fixup_ops (struct xsm_operations *ops)
> > >  
> > >      set_to_dummy_if_null(ops, do_xsm_op);
> > >  
> > > +    set_to_dummy_if_null(ops, add_to_physmap);
> > > +    set_to_dummy_if_null(ops, remove_from_physmap);
> > > +
> > >  #ifdef CONFIG_X86
> > >      set_to_dummy_if_null(ops, shadow_control);
> > >      set_to_dummy_if_null(ops, hvm_param);
> > > @@ -118,8 +121,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
> > >      set_to_dummy_if_null(ops, mmu_update);
> > >      set_to_dummy_if_null(ops, mmuext_op);
> > >      set_to_dummy_if_null(ops, update_va_mapping);
> > > -    set_to_dummy_if_null(ops, add_to_physmap);
> > > -    set_to_dummy_if_null(ops, remove_from_physmap);
> > >      set_to_dummy_if_null(ops, bind_pt_irq);
> > >      set_to_dummy_if_null(ops, unbind_pt_irq);
> > >      set_to_dummy_if_null(ops, ioport_permission);
> > > diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
> > > index ba67502..2a13549 100644
> > > --- a/xen/xsm/flask/hooks.c
> > > +++ b/xen/xsm/flask/hooks.c
> > > @@ -1055,6 +1055,16 @@ static inline int flask_tmem_control(void)
> > >      return domain_has_xen(current->domain, XEN__TMEM_CONTROL);
> > >  }
> > >  
> > > +static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> > > +{
> > > +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > > +}
> > > +
> > > +static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> > > +{
> > > +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > > +}
> > > +
> > >  #ifdef CONFIG_X86
> > >  static int flask_shadow_control(struct domain *d, uint32_t op)
> > >  {
> > > @@ -1325,16 +1335,6 @@ static int flask_update_va_mapping(struct domain *d, struct domain *f,
> > >      return domain_has_perm(d, f, SECCLASS_MMU, map_perms);
> > >  }
> > >  
> > > -static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
> > > -{
> > > -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > > -}
> > > -
> > > -static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
> > > -{
> > > -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
> > > -}
> > > -
> > >  static int flask_get_device_group(uint32_t machine_bdf)
> > >  {
> > >      u32 rsid;
> > > @@ -1501,6 +1501,9 @@ static struct xsm_operations flask_ops = {
> > >  
> > >      .do_xsm_op = do_flask_op,
> > >  
> > > +    .add_to_physmap = flask_add_to_physmap,
> > > +    .remove_from_physmap = flask_remove_from_physmap,
> > > +
> > >  #ifdef CONFIG_X86
> > >      .shadow_control = flask_shadow_control,
> > >      .hvm_param = flask_hvm_param,
> > > @@ -1518,8 +1521,6 @@ static struct xsm_operations flask_ops = {
> > >      .mmu_update = flask_mmu_update,
> > >      .mmuext_op = flask_mmuext_op,
> > >      .update_va_mapping = flask_update_va_mapping,
> > > -    .add_to_physmap = flask_add_to_physmap,
> > > -    .remove_from_physmap = flask_remove_from_physmap,
> > >      .get_device_group = flask_get_device_group,
> > >      .test_assign_device = flask_test_assign_device,
> > >      .assign_device = flask_assign_device,
> > 
> > 
> > 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xen arm: add XSM hooks to arch_memory_op
  2013-01-21 11:41     ` Ian Campbell
@ 2013-01-21 16:28       ` Keir Fraser
  2013-01-21 17:03         ` Ian Campbell
  0 siblings, 1 reply; 6+ messages in thread
From: Keir Fraser @ 2013-01-21 16:28 UTC (permalink / raw)
  To: Ian Campbell, Stefano Stabellini; +Cc: Daniel De Graaf, xen-devel@lists.xen.org

On 21/01/2013 11:41, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:

> On Fri, 2013-01-18 at 12:17 +0000, Stefano Stabellini wrote:
>> On Fri, 18 Jan 2013, Ian Campbell wrote:
>>> On Thu, 2013-01-17 at 17:02 +0000, Ian Campbell wrote:
>>>> Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.
>>> 
>>> Does this patch look OK? Since it fixes a build failure on ARM I'd like
>>> to get it in ASAP.
>> 
>> It looks OK to me.
> 
> Thanks
> 
> Keir/Daniel, any objections to this? Keir acked the earlier fix from
> Lars but this one is substantially different enough for me not to want
> to carry it over.

Fine by me, you can keep my Ack.

> This is an ARM build fix arising from the recent XSM changes.
> 
> Ian.
> 
>> 
>>>> 
>>>> Reported-by: Lars Rasmusson <Lars.Rasmusson@sics.se>
>>>> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>>>> Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>>>> ---
>>>> v4:
>>>>  - Just fix FLASK_ENABLED=n here, leave build issues with
>>>>    FLASK_ENABLE=y till the next patch
>>>> v3:
>>>>  - ppropage errors from xsm_*_*_physmap.
>>>>  - refactor MSI support into arch specific functions
>>>> v2:
>>>>  - move the hooks in hooks.c and dummy.c too.
>>>>  - make XSM actually build on arm.
>>>> ---
>>>>  xen/arch/arm/mm.c       |   15 +++++++++++++++
>>>>  xen/include/xsm/dummy.h |   24 ++++++++++++------------
>>>>  xen/include/xsm/xsm.h   |   12 ++++++------
>>>>  xen/xsm/dummy.c         |    5 +++--
>>>>  xen/xsm/flask/hooks.c   |   25 +++++++++++++------------
>>>>  5 files changed, 49 insertions(+), 32 deletions(-)
>>>> 
>>>> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
>>>> index 945e7ac..eb5213e 100644
>>>> --- a/xen/arch/arm/mm.c
>>>> +++ b/xen/arch/arm/mm.c
>>>> @@ -35,6 +35,7 @@
>>>>  #include <asm/current.h>
>>>>  #include <public/memory.h>
>>>>  #include <xen/sched.h>
>>>> +#include <xsm/xsm.h>
>>>>  
>>>>  struct domain *dom_xen, *dom_io, *dom_cow;
>>>>  
>>>> @@ -655,6 +656,13 @@ long arch_memory_op(int op,
>>>> XEN_GUEST_HANDLE_PARAM(void) arg)
>>>>          if ( rc != 0 )
>>>>              return rc;
>>>>  
>>>> +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
>>>> +        if ( rc )
>>>> +        {
>>>> +            rcu_unlock_domain(d);
>>>> +            return rc;
>>>> +        }
>>>> +
>>>>          rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID,
>>>>                                         xatp.idx, xatp.gpfn);
>>>>  
>>>> @@ -675,6 +683,13 @@ long arch_memory_op(int op,
>>>> XEN_GUEST_HANDLE_PARAM(void) arg)
>>>>          if ( rc != 0 )
>>>>              return rc;
>>>>  
>>>> +        rc = xsm_add_to_physmap(XSM_TARGET, current->domain, d);
>>>> +        if ( rc )
>>>> +        {
>>>> +            rcu_unlock_domain(d);
>>>> +            return rc;
>>>> +        }
>>>> +
>>>>          rc = xenmem_add_to_physmap_range(d, &xatpr);
>>>>  
>>>>          rcu_unlock_domain(d);
>>>> diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h
>>>> index 1ca82b0..870bd67 100644
>>>> --- a/xen/include/xsm/dummy.h
>>>> +++ b/xen/include/xsm/dummy.h
>>>> @@ -443,6 +443,18 @@ static XSM_INLINE int
>>>> xsm_pci_config_permission(XSM_DEFAULT_ARG struct domain *d
>>>>      return xsm_default_action(action, current->domain, d);
>>>>  }
>>>>  
>>>> +static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain
>>>> *d1, struct domain *d2)
>>>> +{
>>>> +    XSM_ASSERT_ACTION(XSM_TARGET);
>>>> +    return xsm_default_action(action, d1, d2);
>>>> +}
>>>> +
>>>> +static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct
>>>> domain *d1, struct domain *d2)
>>>> +{
>>>> +    XSM_ASSERT_ACTION(XSM_TARGET);
>>>> +    return xsm_default_action(action, d1, d2);
>>>> +}
>>>> +
>>>>  #ifdef CONFIG_X86
>>>>  static XSM_INLINE int xsm_shadow_control(XSM_DEFAULT_ARG struct domain *d,
>>>> uint32_t op)
>>>>  {
>>>> @@ -544,18 +556,6 @@ static XSM_INLINE int
>>>> xsm_update_va_mapping(XSM_DEFAULT_ARG struct domain *d, st
>>>>      return xsm_default_action(action, d, f);
>>>>  }
>>>>  
>>>> -static XSM_INLINE int xsm_add_to_physmap(XSM_DEFAULT_ARG struct domain
>>>> *d1, struct domain *d2)
>>>> -{
>>>> -    XSM_ASSERT_ACTION(XSM_TARGET);
>>>> -    return xsm_default_action(action, d1, d2);
>>>> -}
>>>> -
>>>> -static XSM_INLINE int xsm_remove_from_physmap(XSM_DEFAULT_ARG struct
>>>> domain *d1, struct domain *d2)
>>>> -{
>>>> -    XSM_ASSERT_ACTION(XSM_TARGET);
>>>> -    return xsm_default_action(action, d1, d2);
>>>> -}
>>>> -
>>>>  static XSM_INLINE int xsm_bind_pt_irq(XSM_DEFAULT_ARG struct domain *d,
>>>> struct xen_domctl_bind_pt_irq *bind)
>>>>  {
>>>>      XSM_ASSERT_ACTION(XSM_HOOK);
>>>> diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
>>>> index 8947372..5048344 100644
>>>> --- a/xen/include/xsm/xsm.h
>>>> +++ b/xen/include/xsm/xsm.h
>>>> @@ -90,6 +90,7 @@ struct xsm_operations {
>>>>      int (*memory_adjust_reservation) (struct domain *d1, struct domain
>>>> *d2);
>>>>      int (*memory_stat_reservation) (struct domain *d1, struct domain *d2);
>>>>      int (*memory_pin_page) (struct domain *d1, struct domain *d2, struct
>>>> page_info *page);
>>>> +    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
>>>>      int (*remove_from_physmap) (struct domain *d1, struct domain *d2);
>>>>  
>>>>      int (*console_io) (struct domain *d, int cmd);
>>>> @@ -149,7 +150,6 @@ struct xsm_operations {
>>>>                         struct domain *f, uint32_t flags);
>>>>      int (*mmuext_op) (struct domain *d, struct domain *f);
>>>>      int (*update_va_mapping) (struct domain *d, struct domain *f,
>>>> l1_pgentry_t pte);
>>>> -    int (*add_to_physmap) (struct domain *d1, struct domain *d2);
>>>>      int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq
>>>> *bind);
>>>>      int (*unbind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq
>>>> *bind);
>>>>      int (*ioport_permission) (struct domain *d, uint32_t s, uint32_t e,
>>>> uint8_t allow);
>>>> @@ -335,6 +335,11 @@ static inline int xsm_memory_pin_page(xsm_default_t
>>>> def, struct domain *d1, stru
>>>>      return xsm_ops->memory_pin_page(d1, d2, page);
>>>>  }
>>>>  
>>>> +static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1,
>>>> struct domain *d2)
>>>> +{
>>>> +    return xsm_ops->add_to_physmap(d1, d2);
>>>> +}
>>>> +
>>>>  static inline int xsm_remove_from_physmap(xsm_default_t def, struct domain
>>>> *d1, struct domain *d2)
>>>>  {
>>>>      return xsm_ops->remove_from_physmap(d1, d2);
>>>> @@ -558,11 +563,6 @@ static inline int xsm_update_va_mapping(xsm_default_t
>>>> def, struct domain *d, str
>>>>      return xsm_ops->update_va_mapping(d, f, pte);
>>>>  }
>>>>  
>>>> -static inline int xsm_add_to_physmap(xsm_default_t def, struct domain *d1,
>>>> struct domain *d2)
>>>> -{
>>>> -    return xsm_ops->add_to_physmap(d1, d2);
>>>> -}
>>>> -
>>>>  static inline int xsm_bind_pt_irq(xsm_default_t def, struct domain *d,
>>>>                                                  struct
>>>> xen_domctl_bind_pt_irq *bind)
>>>>  {
>>>> diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c
>>>> index 529a724..5031e16 100644
>>>> --- a/xen/xsm/dummy.c
>>>> +++ b/xen/xsm/dummy.c
>>>> @@ -101,6 +101,9 @@ void xsm_fixup_ops (struct xsm_operations *ops)
>>>>  
>>>>      set_to_dummy_if_null(ops, do_xsm_op);
>>>>  
>>>> +    set_to_dummy_if_null(ops, add_to_physmap);
>>>> +    set_to_dummy_if_null(ops, remove_from_physmap);
>>>> +
>>>>  #ifdef CONFIG_X86
>>>>      set_to_dummy_if_null(ops, shadow_control);
>>>>      set_to_dummy_if_null(ops, hvm_param);
>>>> @@ -118,8 +121,6 @@ void xsm_fixup_ops (struct xsm_operations *ops)
>>>>      set_to_dummy_if_null(ops, mmu_update);
>>>>      set_to_dummy_if_null(ops, mmuext_op);
>>>>      set_to_dummy_if_null(ops, update_va_mapping);
>>>> -    set_to_dummy_if_null(ops, add_to_physmap);
>>>> -    set_to_dummy_if_null(ops, remove_from_physmap);
>>>>      set_to_dummy_if_null(ops, bind_pt_irq);
>>>>      set_to_dummy_if_null(ops, unbind_pt_irq);
>>>>      set_to_dummy_if_null(ops, ioport_permission);
>>>> diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c
>>>> index ba67502..2a13549 100644
>>>> --- a/xen/xsm/flask/hooks.c
>>>> +++ b/xen/xsm/flask/hooks.c
>>>> @@ -1055,6 +1055,16 @@ static inline int flask_tmem_control(void)
>>>>      return domain_has_xen(current->domain, XEN__TMEM_CONTROL);
>>>>  }
>>>>  
>>>> +static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
>>>> +{
>>>> +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>>>> +}
>>>> +
>>>> +static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
>>>> +{
>>>> +    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>>>> +}
>>>> +
>>>>  #ifdef CONFIG_X86
>>>>  static int flask_shadow_control(struct domain *d, uint32_t op)
>>>>  {
>>>> @@ -1325,16 +1335,6 @@ static int flask_update_va_mapping(struct domain *d,
>>>> struct domain *f,
>>>>      return domain_has_perm(d, f, SECCLASS_MMU, map_perms);
>>>>  }
>>>>  
>>>> -static int flask_add_to_physmap(struct domain *d1, struct domain *d2)
>>>> -{
>>>> -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>>>> -}
>>>> -
>>>> -static int flask_remove_from_physmap(struct domain *d1, struct domain *d2)
>>>> -{
>>>> -    return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP);
>>>> -}
>>>> -
>>>>  static int flask_get_device_group(uint32_t machine_bdf)
>>>>  {
>>>>      u32 rsid;
>>>> @@ -1501,6 +1501,9 @@ static struct xsm_operations flask_ops = {
>>>>  
>>>>      .do_xsm_op = do_flask_op,
>>>>  
>>>> +    .add_to_physmap = flask_add_to_physmap,
>>>> +    .remove_from_physmap = flask_remove_from_physmap,
>>>> +
>>>>  #ifdef CONFIG_X86
>>>>      .shadow_control = flask_shadow_control,
>>>>      .hvm_param = flask_hvm_param,
>>>> @@ -1518,8 +1521,6 @@ static struct xsm_operations flask_ops = {
>>>>      .mmu_update = flask_mmu_update,
>>>>      .mmuext_op = flask_mmuext_op,
>>>>      .update_va_mapping = flask_update_va_mapping,
>>>> -    .add_to_physmap = flask_add_to_physmap,
>>>> -    .remove_from_physmap = flask_remove_from_physmap,
>>>>      .get_device_group = flask_get_device_group,
>>>>      .test_assign_device = flask_test_assign_device,
>>>>      .assign_device = flask_assign_device,
>>> 
>>> 
>>> 
> 
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] xen arm: add XSM hooks to arch_memory_op
  2013-01-21 16:28       ` Keir Fraser
@ 2013-01-21 17:03         ` Ian Campbell
  0 siblings, 0 replies; 6+ messages in thread
From: Ian Campbell @ 2013-01-21 17:03 UTC (permalink / raw)
  To: Keir Fraser; +Cc: Daniel De Graaf, xen-devel@lists.xen.org, Stefano Stabellini

On Mon, 2013-01-21 at 16:28 +0000, Keir Fraser wrote:
> On 21/01/2013 11:41, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:
> 
> > On Fri, 2013-01-18 at 12:17 +0000, Stefano Stabellini wrote:
> >> On Fri, 18 Jan 2013, Ian Campbell wrote:
> >>> On Thu, 2013-01-17 at 17:02 +0000, Ian Campbell wrote:
> >>>> Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap.
> >>> 
> >>> Does this patch look OK? Since it fixes a build failure on ARM I'd like
> >>> to get it in ASAP.
> >> 
> >> It looks OK to me.
> > 
> > Thanks
> > 
> > Keir/Daniel, any objections to this? Keir acked the earlier fix from
> > Lars but this one is substantially different enough for me not to want
> > to carry it over.
> 
> Fine by me, you can keep my Ack.

Thanks, applied.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-01-21 17:03 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-17 17:02 [PATCH] xen arm: add XSM hooks to arch_memory_op Ian Campbell
2013-01-18 11:59 ` Ian Campbell
2013-01-18 12:17   ` Stefano Stabellini
2013-01-21 11:41     ` Ian Campbell
2013-01-21 16:28       ` Keir Fraser
2013-01-21 17:03         ` Ian Campbell

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).