[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
> Hi Frediano, > > On 11/05/2014 09:41 AM, Frediano Ziglio wrote: > > Translated address could have an offset applied to them. > > Replicate same value for device node to avoid improper address > > computation in the OS. > > > > Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx> > > --- > > xen/arch/arm/gic-v2.c | 23 +++++++++++++++++++++-- > > 1 file changed, 21 insertions(+), 2 deletions(-) > > > > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index > > 2f6bbd5..271074d 100644 > > --- a/xen/arch/arm/gic-v2.c > > +++ b/xen/arch/arm/gic-v2.c > > @@ -67,8 +67,10 @@ > > /* Global state */ > > static struct { > > paddr_t dbase; /* Address of distributor registers */ > > + paddr_t dbase_raw; /* Untranslated address of distributor > registers */ > > void __iomem * map_dbase; /* IO mapped Address of distributor > registers */ > > paddr_t cbase; /* Address of CPU interface registers > */ > > + paddr_t cbase_raw; /* Untranslated address of CPU > interface registers */ > > void __iomem * map_cbase[2]; /* IO mapped Address of CPU > interface registers */ > > paddr_t hbase; /* Address of virtual interface > registers */ > > void __iomem * map_hbase; /* IO Address of virtual interface > > registers */ @@ -671,8 +673,17 @@ static int gicv2_make_dt_node(const > struct domain *d, > > 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); > > + > > + if ( is_hardware_domain(d) ) > > + { > > This check is pointless, as said on an earlier version of this series, > gicv2_make_dt_node is only used to create DOM0 (hardware domain) device > tree. > > Regards, > > -- > Julien Grall How does sound something like this (already tested, it's working). Perhaps just to be paranoid a test on len after reading reg property would be perfect. 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); + + tmp = (__be32 *) 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(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); res = fdt_property(fdt, "reg", new_cells, len); xfree(new_cells); -- 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 |