[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen arm: add XSM hooks to arch_memory_op



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@xxxxxxx>
> > > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> > > Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
> > > ---
> > > 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,
> > 
> > 
> > 



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.