[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 8/8] xen/arm: Handle translated addresses for hardware domains
> On 11/05/2014 03:13 PM, Frediano Ziglio wrote: > > How does sound something like this (already tested, it's working). > > The idea looks good to me. Few comments below. > > Also, I'm wondering if we could create a generic function for this > purpose. The code of the GICv3 suffers of the same problem. > > > Perhaps just to be paranoid a test on len after reading reg property > would be perfect. > > The property/node has been validated in the GICv2 initialization. > Checking again here is not necessary. > > > > > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index > > 2f6bbd5..2c4d097 100644 > > --- a/xen/arch/arm/gic-v2.c > > +++ b/xen/arch/arm/gic-v2.c > > @@ -632,7 +632,7 @@ static int gicv2_make_dt_node(const struct domain > *d, > > const void *compatible = NULL; > > u32 len; > > __be32 *new_cells, *tmp; > > - int res = 0; > > + int res = 0, na, ns; > > > > compatible = dt_get_property(gic, "compatible", &len); > > if ( !compatible ) > > @@ -664,15 +664,27 @@ static int gicv2_make_dt_node(const struct > domain *d, > > if ( res ) > > return res; > > > > - len = dt_cells_to_size(dt_n_addr_cells(node) + > dt_n_size_cells(node)); > > + /* copy GICC and GICD regions */ > > + na = dt_n_addr_cells(node); > > + ns = dt_n_size_cells(node); > > + > > + if ( na != dt_n_addr_cells(gic) || ns != dt_n_size_cells(gic) ) > > + return -FDT_ERR_XEN(EINVAL); > > Not necessary, the caller of this function already check that gic (i.e > dt_interrupt_controller) == node. > > If you really to be safe, I would add ASSERT(gic == node); > > > + > > + tmp = (__be32 *) dt_get_property(gic, "reg", &len); > > The cast is not necessary. > > > + if ( !tmp ) > > + { > > + dprintk(XENLOG_ERR, "Can't find reg property for the gic > node\n"); > > + return -FDT_ERR_XEN(ENOENT); > > + } > > + > > + len = dt_cells_to_size(na + ns); > > len *= 2; /* GIC has two memory regions: Distributor + CPU > interface */ > > new_cells = xzalloc_bytes(len); > > if ( new_cells == NULL ) > > return -FDT_ERR_XEN(ENOMEM); > > > > - tmp = new_cells; > > - dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE); > > - dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2); > > + memcpy(new_cells, tmp, len); > > You don't need to copy the data in the temporary variable. You can > directly use fdt_property with the right len. Smth like: > > fdt_property(fdt, "reg", tmp, len); > > Regards, > > -- > Julien Grall This then should look much better. diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index 2f6bbd5..9b9e696 100644 --- a/xen/arch/arm/gic-v2.c +++ b/xen/arch/arm/gic-v2.c @@ -629,9 +629,8 @@ static int gicv2_make_dt_node(const struct domain *d, const struct dt_device_node *node, void *fdt) { const struct dt_device_node *gic = dt_interrupt_controller; - const void *compatible = NULL; + const void *compatible = NULL, *tmp; u32 len; - __be32 *new_cells, *tmp; int res = 0; compatible = dt_get_property(gic, "compatible", &len); @@ -664,18 +663,18 @@ static int gicv2_make_dt_node(const struct domain *d, if ( res ) return res; + /* copy GICC and GICD regions */ + tmp = dt_get_property(gic, "reg", &len); + if ( !tmp ) + { + dprintk(XENLOG_ERR, "Can't find reg property for the gic node\n"); + return -FDT_ERR_XEN(ENOENT); + } + len = dt_cells_to_size(dt_n_addr_cells(node) + dt_n_size_cells(node)); len *= 2; /* GIC has two memory regions: Distributor + CPU interface */ - new_cells = xzalloc_bytes(len); - if ( new_cells == NULL ) - return -FDT_ERR_XEN(ENOMEM); - - tmp = new_cells; - dt_set_range(&tmp, node, d->arch.vgic.dbase, PAGE_SIZE); - dt_set_range(&tmp, node, d->arch.vgic.cbase, PAGE_SIZE * 2); - res = fdt_property(fdt, "reg", new_cells, len); - xfree(new_cells); + res = fdt_property(fdt, "reg", tmp, len); return res; } -- 1.9.1 Frediano _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |