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.zig...@huawei.com> --- xen/arch/arm/gic-v2.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) Submit again after release. This patch was developed as a specific platform patch but it applies to all platforms. Previous discussions at - http://lists.xen.org/archives/html/xen-devel/2014-11/msg00406.html - http://lists.xen.org/archives/html/xen-devel/2014-11/msg00520.html diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c index 31fb81a..4d1924e 100644 --- a/xen/arch/arm/gic-v2.c +++ b/xen/arch/arm/gic-v2.c @@ -590,7 +590,7 @@ static int gicv2_make_dt_node(const struct domain *d, const struct dt_device_node *gic = dt_interrupt_controller; const void *compatible = NULL; u32 len; - __be32 *new_cells, *tmp; + const __be32 *regs; int res = 0; compatible = dt_get_property(gic, "compatible", &len); @@ -617,18 +617,18 @@ static int gicv2_make_dt_node(const struct domain *d, if ( res ) return res; + /* copy GICC and GICD regions */ + regs = dt_get_property(gic, "reg", &len); + if ( !regs ) + { + 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", regs, len); return res; } -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel