[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 21/01/2013 11:41, "Ian Campbell" <Ian.Campbell@xxxxxxxxxx> 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@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®.