[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xsm_remove_from_physmap is (so far) only defined for X86 architecture, not for ARM
On 01/15/2013 06:18 AM, Ian Campbell wrote: > On Fri, 2013-01-11 at 17:37 +0000, Daniel De Graaf wrote: >> On 01/11/2013 11:46 AM, Ian Campbell wrote: >>> On Fri, 2013-01-11 at 16:36 +0000, Keir Fraser wrote: >>>> On 11/01/2013 16:24, "Lars Rasmusson" <lra@xxxxxxx> wrote: >>>> >>>>>> On 11/01/2013 13:32, "lra@xxxxxxx" <lra@xxxxxxx> wrote: >>>>>> >>>>>>> From: Lars Rasmusson <Lars.Rasmusson@xxxxxxx> >>>>>>> >>>>>>> Signed-off-by: Lars Rasmusson <Lars.Rasmusson@xxxxxxx> >>>>>> >>>>>> If this is a build fix after my checkins this morning then: >>>>>> Acked-by: Keir Fraser <keir@xxxxxxx> >>>>> >>>>> Yes, the XEN_TARGET_ARCH=arm32 make breaks when compiling memory.c >>>>> >>>>> In xen/include/xsm/dummy.h where many of the functions are used, some are >>>>> declared only for X86, so I picked the same #ifdef CONFIG_X86 >>>>> as the header file uses. >>>>> >>>>> As Ian said, it's not pretty, but since ARM doesn't have xsm (yet?) I >>>>> think >>>>> adding a dummy xsm_remove_from_physmap for arm also is ugly. >>>>> >>>>> Is there some other way to write memory.c so that it doesn't need >>>>> xsm_remove...? (I mean, it does't need xsm_add....) >>>> >>>> The XSM infrastructure is not architecture dependent. It's probably a >>>> mistake that xsm_remove_from_physmap() is ifdef CONFIG_X86. >>> >>> Agreed. >>> >>> 8<--------------------- >>> >>> >From fb57be285e956cadea51dc48a28fba77d752044d Mon Sep 17 00:00:00 2001 >>> From: Ian Campbell <ian.campbell@xxxxxxxxxx> >>> Date: Fri, 11 Jan 2013 16:44:14 +0000 >>> Subject: [PATCH] xen arm: add XSM hooks to arch_memory_op >>> >>> Treat XENMEM_add_to_physmap_range the same as >>> XENMEM_add_to_physmap. >>> >>> Reported-by: Lars Rasmusson <Lars.Rasmusson@xxxxxxx> >>> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> >>> Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> >>> --- >>> xen/arch/arm/mm.c | 13 +++++++++++++ >>> xen/include/xsm/dummy.h | 24 ++++++++++++------------ >>> 2 files changed, 25 insertions(+), 12 deletions(-) >> >> I agree with the movement (neither of these hooks are x86-specific), but >> this patch also needs to move the hooks in xen/include/xsm/xsm.h and >> xen/xsm/flask/hooks.c out of the same #ifdefs. > > Thanks, and dummy.c. > > Turns out this is far from the only barrier to enabling FLASK on ARM, > flask_op.c has a few x86isms not included in #ifdef, e.g. MSIs > I also needed a few extra #includes on ARM for things which are picked > up indirectly on x86. > > The patch is below, its a bit ugly and totally untested. I could pick > out the bits to do the rigth thing on ARM without FLASK on if that would > be preferred. > >> On a mostly unrelated note, Ian: do you think it would be useful to add >> build tests with XSM enabled to catch these types of issues during the >> automated testing? It just requires "echo XSM_ENABLE=y > .config" >> before the build, and is apparently best done for both x86 and arm. > > In general I think build tests with a variety of different compile time > options, xsm being one of them, would be very nice to have. e.g. I'd > also like to get at least a build test of ARM into the system prior to > suitable hardware arriving later in the year. > > Perhaps a flight of build tests could be added? > > Ian. > > 8<---------------- > >>From 469d20054b96b8bc749891c366659532b67d6031 Mon Sep 17 00:00:00 2001 > From: Ian Campbell <ian.campbell@xxxxxxxxxx> > Date: Fri, 11 Jan 2013 16:44:14 +0000 > Subject: [PATCH] xen arm: add XSM hooks to arch_memory_op > > Treat XENMEM_add_to_physmap_range the same as XENMEM_add_to_physmap. > > Also conditionalise more x86-isms and add required headers such that > it compiles on ARM. Totally untested. > > Reported-by: Lars Rasmusson <Lars.Rasmusson@xxxxxxx> > Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> > Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> > --- > xen/arch/arm/mm.c | 13 +++++++++++++ > xen/include/xsm/dummy.h | 25 +++++++++++++------------ > xen/include/xsm/xsm.h | 12 ++++++------ > xen/xsm/dummy.c | 5 +++-- > xen/xsm/flask/avc.c | 1 + > xen/xsm/flask/flask_op.c | 4 +++- > xen/xsm/flask/hooks.c | 44 ++++++++++++++++++++++++++++++-------------- > xen/xsm/xsm_policy.c | 1 + > 8 files changed, 70 insertions(+), 35 deletions(-) > > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c > index d97b3ea..311ec97 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; > > @@ -651,6 +652,12 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) > arg) > if ( rc != 0 ) > return rc; > > + if ( xsm_add_to_physmap(XSM_TARGET, current->domain, d) ) > + { > + rcu_unlock_domain(d); > + return -EPERM; > + } > + Using the return value of the xsm hook instead of -EPERM is preferred; this turns an -ENOMEM inside FLASK into an -EPERM (and same below). > rc = xenmem_add_to_physmap_one(d, xatp.space, DOMID_INVALID, > xatp.idx, xatp.gpfn); > > @@ -671,6 +678,12 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) > arg) > if ( rc != 0 ) > return rc; > > + if ( xsm_add_to_physmap(XSM_TARGET, current->domain, d) ) > + { > + rcu_unlock_domain(d); > + return -EPERM; > + } > + > 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..f40b196 100644 > --- a/xen/include/xsm/dummy.h > +++ b/xen/include/xsm/dummy.h > @@ -16,6 +16,7 @@ > */ > > #include <xen/sched.h> > +#include <xen/errno.h> > #include <xsm/xsm.h> > > /* Cannot use BUILD_BUG_ON here because the expressions we check are not > @@ -443,6 +444,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 +557,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/avc.c b/xen/xsm/flask/avc.c > index 7fede00..f994fd9 100644 > --- a/xen/xsm/flask/avc.c > +++ b/xen/xsm/flask/avc.c > @@ -28,6 +28,7 @@ > #include <xen/rcupdate.h> > #include <asm/atomic.h> > #include <asm/current.h> > +#include <public/event_channel.h> > #include <public/xsm/flask_op.h> > > #include "avc.h" > diff --git a/xen/xsm/flask/flask_op.c b/xen/xsm/flask/flask_op.c > index 4426ab9..f9b16f2 100644 > --- a/xen/xsm/flask/flask_op.c > +++ b/xen/xsm/flask/flask_op.c > @@ -10,9 +10,11 @@ > > #include <xen/errno.h> > #include <xen/event.h> > +#include <xen/init.h> > #include <xsm/xsm.h> > #include <xen/guest_access.h> > > +#include <public/event_channel.h> > #include <public/xsm/flask_op.h> > > #include <avc.h> > @@ -71,7 +73,7 @@ static int domain_has_security(struct domain *d, u32 perms) > perms, NULL); > } > > -static int flask_copyin_string(XEN_GUEST_HANDLE_PARAM(char) u_buf, char > **buf, uint32_t size) > +static int flask_copyin_string(XEN_GUEST_HANDLE(char) u_buf, char **buf, > uint32_t size) > { > char *tmp = xmalloc_bytes(size + 1); > if ( !tmp ) > diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c > index ba67502..c39f129 100644 > --- a/xen/xsm/flask/hooks.c > +++ b/xen/xsm/flask/hooks.c > @@ -19,11 +19,15 @@ > #include <xen/errno.h> > #include <xen/guest_access.h> > #include <xen/xenoprof.h> > +#ifdef CONFIG_X86 > #include <asm/msi.h> > +#endif > +#include <asm/irq.h> > #include <public/xen.h> > #include <public/physdev.h> > #include <public/platform.h> > > +#include <public/event_channel.h> > #include <public/xsm/flask_op.h> > > #include <avc.h> > @@ -100,7 +104,9 @@ static int domain_has_xen(struct domain *d, u32 perms) > > static int get_irq_sid(int irq, u32 *sid, struct avc_audit_data *ad) > { > +#ifdef CONFIG_X86 > struct irq_desc *desc = irq_to_desc(irq); > +#endif > if ( irq >= nr_irqs || irq < 0 ) > return -EINVAL; > if ( irq < nr_static_irqs ) { > @@ -110,6 +116,7 @@ static int get_irq_sid(int irq, u32 *sid, struct > avc_audit_data *ad) > } > return security_irq_sid(irq, sid); > } > +#ifdef CONFIG_X86 > if ( desc->msi_desc ) { > struct pci_dev *dev = desc->msi_desc->dev; > u32 sbdf = (dev->seg << 16) | (dev->bus << 8) | dev->devfn; > @@ -119,6 +126,7 @@ static int get_irq_sid(int irq, u32 *sid, struct > avc_audit_data *ad) > } > return security_device_sid(sbdf, sid); > } > +#endif > if (ad) { > AVC_AUDIT_DATA_INIT(ad, IRQ); > ad->irq = irq; > @@ -822,7 +830,9 @@ static int flask_map_domain_pirq (struct domain *d, int > irq, void *data) > { > u32 sid, dsid; > int rc = -EPERM; > +#ifdef CONFIG_X86 > struct msi_info *msi = data; > +#endif > struct avc_audit_data ad; > > rc = current_has_perm(d, SECCLASS_RESOURCE, RESOURCE__ADD); > @@ -830,12 +840,17 @@ static int flask_map_domain_pirq (struct domain *d, int > irq, void *data) > if ( rc ) > return rc; > > - if ( irq >= nr_static_irqs && msi ) { > +#ifdef CONFIG_X86 > + if ( irq >= nr_static_irqs && msi ) > + { > u32 machine_bdf = (msi->seg << 16) | (msi->bus << 8) | msi->devfn; > AVC_AUDIT_DATA_INIT(&ad, DEV); > ad.device = machine_bdf; > rc = security_device_sid(machine_bdf, &sid); > - } else { > + } > + else > +#endif > + { > rc = get_irq_sid(irq, &sid, &ad); > } > if ( rc ) > @@ -1055,6 +1070,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 +1350,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 +1516,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 +1536,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, > diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c > index a419cf4..c1a3fc9 100644 > --- a/xen/xsm/xsm_policy.c > +++ b/xen/xsm/xsm_policy.c > @@ -20,6 +20,7 @@ > > #include <xsm/xsm.h> > #include <xen/multiboot.h> > +#include <xen/init.h> > #include <asm/bitops.h> > > char *__initdata policy_buffer = NULL; > The rest of the changes look correct. The #ifdefs are a bit ugly, but refactoring the MSI code into an arch-specific function should fix that. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |