Skip to content

Commit

Permalink
xen/arm: don't assign domU static-mem to dom0 as reserved-memory
Browse files Browse the repository at this point in the history
DomUs static-mem ranges are added to the reserved_mem array for
accounting, but they shouldn't be assigned to dom0 as the other regular
reserved-memory ranges in device tree.

In make_memory_nodes, fix the error by skipping banks with xen_domain
set to true in the reserved-memory array. Also make sure to use the
first valid (!xen_domain) start address for the memory node name.

Fixes: 41c031f ("xen/arm: introduce domain on Static Allocation")
Signed-off-by: Stefano Stabellini <stefano.stabellini@xilinx.com>
Reviewed-by: Penny Zheng <penny.zheng@arm.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Release-Acked-by: Ian Jackson <iwj@xenproject.org>
  • Loading branch information
Stefano Stabellini committed Nov 11, 2021
1 parent 9d9cd0c commit 9aaf437
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions xen/arch/arm/domain_build.c
Original file line number Diff line number Diff line change
Expand Up @@ -862,21 +862,25 @@ static int __init make_memory_node(const struct domain *d,
{
int res, i;
int reg_size = addrcells + sizecells;
int nr_cells = reg_size * mem->nr_banks;
int nr_cells = 0;
/* Placeholder for memory@ + a 64-bit number + \0 */
char buf[24];
__be32 reg[NR_MEM_BANKS * 4 /* Worst case addrcells + sizecells */];
__be32 *cells;

BUG_ON(nr_cells >= ARRAY_SIZE(reg));
if ( mem->nr_banks == 0 )
return -ENOENT;

dt_dprintk("Create memory node (reg size %d, nr cells %d)\n",
reg_size, nr_cells);
/* find first memory range not bound to a Xen domain */
for ( i = 0; i < mem->nr_banks && mem->bank[i].xen_domain; i++ )
;
if ( i == mem->nr_banks )
return 0;

dt_dprintk("Create memory node\n");

/* ePAPR 3.4 */
snprintf(buf, sizeof(buf), "memory@%"PRIx64, mem->bank[0].start);
snprintf(buf, sizeof(buf), "memory@%"PRIx64, mem->bank[i].start);
res = fdt_begin_node(fdt, buf);
if ( res )
return res;
Expand All @@ -886,17 +890,24 @@ static int __init make_memory_node(const struct domain *d,
return res;

cells = &reg[0];
for ( i = 0 ; i < mem->nr_banks; i++ )
for ( ; i < mem->nr_banks; i++ )
{
u64 start = mem->bank[i].start;
u64 size = mem->bank[i].size;

if ( mem->bank[i].xen_domain )
continue;

dt_dprintk(" Bank %d: %#"PRIx64"->%#"PRIx64"\n",
i, start, start + size);

nr_cells += reg_size;
BUG_ON(nr_cells >= ARRAY_SIZE(reg));
dt_child_set_range(&cells, addrcells, sizecells, start, size);
}

dt_dprintk("(reg size %d, nr cells %d)\n", reg_size, nr_cells);

res = fdt_property(fdt, "reg", reg, nr_cells * sizeof(*reg));
if ( res )
return res;
Expand Down

0 comments on commit 9aaf437

Please sign in to comment.