xen/arm: Add DT reserve map regions to bootinfo.reserved_mem

Currently the code is listing device tree reserve map regions
as reserved memory for Xen, but they are not added into
bootinfo.reserved_mem and they are fetched in multiple places
using the same code sequence, causing duplication. Fix this
by adding them to the bootinfo.reserved_mem at early stage.

Signed-off-by: Luca Fancellu <luca.fancellu@arm.com>
Acked-by: Julien Grall <jgrall@amazon.com>
This commit is contained in:
Luca Fancellu authored and Julien Grall committed 2024-05-16 22:09:13 +01:00
1 parent d946787a27
commit 53dc37829c
5 files changed
+53 -88

No files matched your search

+1 -28
View File
@@ -73,33 +73,6 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
}
}
/* Now check any fdt reserved areas. */
nr = fdt_num_mem_rsv(device_tree_flattened);
for ( ; i < mi->nr_mods + nr; i++ )
{
paddr_t mod_s, mod_e;
if ( fdt_get_mem_rsv_paddr(device_tree_flattened,
i - mi->nr_mods,
&mod_s, &mod_e ) < 0 )
/* If we can't read it, pretend it doesn't exist... */
continue;
/* fdt_get_mem_rsv_paddr returns length */
mod_e += mod_s;
if ( s < mod_e && mod_s < e )
{
mod_e = consider_modules(mod_e, e, size, align, i+1);
if ( mod_e )
return mod_e;
return consider_modules(s, mod_s, size, align, i+1);
}
}
/*
* i is the current bootmodule we are evaluating, across all
* possible kinds of bootmodules.
@@ -108,7 +81,7 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
* need to index the reserved_mem bank starting from 0, and only counting
* the reserved-memory modules. Hence, we need to use i - nr.
*/
nr += mi->nr_mods;
nr = mi->nr_mods;
for ( ; i - nr < reserved_mem->nr_banks; i++ )
{
paddr_t r_s = reserved_mem->bank[i - nr].start;
+31 -20
View File
@@ -475,8 +475,7 @@ static void __init early_print_info(void)
const struct membanks *mem_resv = bootinfo_get_reserved_mem();
struct bootmodules *mods = &bootinfo.modules;
struct bootcmdlines *cmds = &bootinfo.cmdlines;
unsigned int i, j;
int nr_rsvd;
unsigned int i;
for ( i = 0; i < mi->nr_banks; i++ )
printk("RAM: %"PRIpaddr" - %"PRIpaddr"\n",
@@ -490,26 +489,11 @@ static void __init early_print_info(void)
mods->module[i].start + mods->module[i].size,
boot_module_kind_as_string(mods->module[i].kind));
nr_rsvd = fdt_num_mem_rsv(device_tree_flattened);
if ( nr_rsvd < 0 )
panic("Parsing FDT memory reserve map failed (%d)\n", nr_rsvd);
for ( i = 0; i < nr_rsvd; i++ )
{
paddr_t s, e;
if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &s, &e) < 0 )
continue;
/* fdt_get_mem_rsv_paddr returns length */
e += s;
printk(" RESVD[%u]: %"PRIpaddr" - %"PRIpaddr"\n", i, s, e);
}
for ( j = 0; j < mem_resv->nr_banks; j++, i++ )
for ( i = 0; i < mem_resv->nr_banks; i++ )
{
printk(" RESVD[%u]: %"PRIpaddr" - %"PRIpaddr"\n", i,
mem_resv->bank[j].start,
mem_resv->bank[j].start + mem_resv->bank[j].size - 1);
mem_resv->bank[i].start,
mem_resv->bank[i].start + mem_resv->bank[i].size - 1);
}
early_print_info_shmem();
printk("\n");
@@ -550,7 +534,10 @@ static void __init swap_memory_node(void *_a, void *_b, size_t size)
*/
size_t __init boot_fdt_info(const void *fdt, paddr_t paddr)
{
struct membanks *reserved_mem = bootinfo_get_reserved_mem();
struct membanks *mem = bootinfo_get_mem();
unsigned int i;
int nr_rsvd;
int ret;
ret = fdt_check_header(fdt);
@@ -559,6 +546,30 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr)
add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), false);
nr_rsvd = fdt_num_mem_rsv(fdt);
if ( nr_rsvd < 0 )
panic("Parsing FDT memory reserve map failed (%d)\n", nr_rsvd);
for ( i = 0; i < nr_rsvd; i++ )
{
struct membank *bank;
paddr_t s, sz;
if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &s, &sz) < 0 )
continue;
if ( reserved_mem->nr_banks < reserved_mem->max_banks )
{
bank = &reserved_mem->bank[reserved_mem->nr_banks];
bank->start = s;
bank->size = sz;
bank->type = MEMBANK_FDT_RESVMEM;
reserved_mem->nr_banks++;
}
else
panic("Cannot allocate reserved memory bank\n");
}
ret = device_tree_for_each_node(fdt, 0, early_scan_node, NULL);
if ( ret )
panic("Early FDT parsing failed (%d)\n", ret);
+2 -1
View File
@@ -793,7 +793,8 @@ int __init make_memory_node(const struct kernel_info *kinfo, int addrcells,
u64 start = mem->bank[i].start;
u64 size = mem->bank[i].size;
if ( mem->bank[i].type == MEMBANK_STATIC_DOMAIN )
if ( (mem->bank[i].type == MEMBANK_STATIC_DOMAIN) ||
(mem->bank[i].type == MEMBANK_FDT_RESVMEM) )
continue;
nr_cells += reg_size;
+5
View File
@@ -42,6 +42,11 @@ enum membank_type {
* in reserved_mem.
*/
MEMBANK_STATIC_HEAP,
/*
* The MEMBANK_FDT_RESVMEM type is used to indicate whether the memory
* bank is from the FDT reserve map.
*/
MEMBANK_FDT_RESVMEM,
};
/* Indicates the maximum number of characters(\0 included) for shm_id */
+14 -39
View File
@@ -210,48 +210,18 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e,
const struct membanks *reserved_mem = bootinfo_get_reserved_mem();
#ifdef CONFIG_STATIC_SHM
const struct membanks *shmem = bootinfo_get_shmem();
unsigned int offset;
#endif
unsigned int i, nr;
int rc;
rc = fdt_num_mem_rsv(device_tree_flattened);
if ( rc < 0 )
panic("Unable to retrieve the number of reserved regions (rc=%d)\n",
rc);
nr = rc;
for ( i = first; i < nr ; i++ )
{
paddr_t r_s, r_e;
if ( fdt_get_mem_rsv_paddr(device_tree_flattened, i, &r_s, &r_e ) < 0 )
/* If we can't read it, pretend it doesn't exist... */
continue;
r_e += r_s; /* fdt_get_mem_rsv_paddr returns length */
if ( s < r_e && r_s < e )
{
dt_unreserved_regions(r_e, e, cb, i+1);
dt_unreserved_regions(s, r_s, cb, i+1);
return;
}
}
unsigned int i;
/*
* i is the current bootmodule we are evaluating across all possible
* kinds.
*
* When retrieving the corresponding reserved-memory addresses
* below, we need to index the reserved_mem->bank starting
* from 0, and only counting the reserved-memory modules. Hence,
* we need to use i - nr.
*/
for ( ; i - nr < reserved_mem->nr_banks; i++ )
for ( i = first; i < reserved_mem->nr_banks; i++ )
{
paddr_t r_s = reserved_mem->bank[i - nr].start;
paddr_t r_e = r_s + reserved_mem->bank[i - nr].size;
paddr_t r_s = reserved_mem->bank[i].start;
paddr_t r_e = r_s + reserved_mem->bank[i].size;
if ( s < r_e && r_s < e )
{
@@ -262,11 +232,16 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e,
}
#ifdef CONFIG_STATIC_SHM
nr += reserved_mem->nr_banks;
for ( ; i - nr < shmem->nr_banks; i++ )
/*
* When retrieving the corresponding shared memory addresses
* below, we need to index the shmem->bank starting from 0, hence
* we need to use i - reserved_mem->nr_banks.
*/
offset = reserved_mem->nr_banks;
for ( ; i - offset < shmem->nr_banks; i++ )
{
paddr_t r_s = shmem->bank[i - nr].start;
paddr_t r_e = r_s + shmem->bank[i - nr].size;
paddr_t r_s = shmem->bank[i - offset].start;
paddr_t r_e = r_s + shmem->bank[i - offset].size;
if ( s < r_e && r_s < e )
{
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.