|
[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 |