[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |