|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 06/23] xen/arm: don't add duplicate boot modules, introduce domU flag
Don't add duplicate boot modules (same kind and same start address),
they are freed later, we don't want to introduce double-free errors.
Introduce a domU flag in struct bootmodule and struct bootcmdline. Set
it for kernels and ramdisks of "xen,domain" nodes to avoid getting
confused in kernel_probe, where we try to guess which is the dom0 kernel
and initrd to be compatible with older versions of the multiboot spec.
boot_module_find_by_kind and boot_cmdline_find_by_kind automatically
check for !domU entries (they are only used for non-domU modules).
Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
---
Changes in v4:
- use unsigned int
- better commit message
- introduce domU flag and usage
Changes in v2:
- new patch
---
xen/arch/arm/bootfdt.c | 14 +++++++++-----
xen/arch/arm/setup.c | 21 +++++++++++++++++----
xen/include/asm-arm/setup.h | 4 +++-
3 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 273032b..349aa9d 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -164,7 +164,8 @@ static void __init process_memory_node(const void *fdt, int
node,
}
static void __init add_boot_cmdline(const void *fdt, int node,
- const char *name, bootmodule_kind kind)
+ const char *name, bootmodule_kind kind,
+ bool domU)
{
struct bootcmdlines *cmds = &bootinfo.cmdlines;
struct bootcmdline *cmd;
@@ -184,6 +185,7 @@ static void __init add_boot_cmdline(const void *fdt, int
node,
cmd = &cmds->cmdline[cmds->nr_mods++];
cmd->kind = kind;
+ cmd->domU = domU;
ASSERT(strlen(name) <= DT_MAX_NAME);
safe_strcpy(cmd->dt_name, name);
@@ -206,6 +208,7 @@ static void __init process_multiboot_node(const void *fdt,
int node,
int len = sizeof("/chosen");
char path[8]; /* sizeof "/chosen" */
int parent_node;
+ bool domU;
parent_node = fdt_parent_offset(fdt, node);
ASSERT(parent_node >= 0);
@@ -263,8 +266,9 @@ static void __init process_multiboot_node(const void *fdt,
int node,
kind = BOOTMOD_XSM;
}
- add_boot_module(kind, start, size);
- add_boot_cmdline(fdt, node, fdt_get_name(fdt, parent_node, &len), kind);
+ domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
+ add_boot_module(kind, start, size, domU);
+ add_boot_cmdline(fdt, node, fdt_get_name(fdt, parent_node, &len), kind,
domU);
}
static void __init process_chosen_node(const void *fdt, int node,
@@ -310,7 +314,7 @@ static void __init process_chosen_node(const void *fdt, int
node,
printk("Initrd %"PRIpaddr"-%"PRIpaddr"\n", start, end);
- add_boot_module(BOOTMOD_RAMDISK, start, end-start);
+ add_boot_module(BOOTMOD_RAMDISK, start, end-start, false);
}
static int __init early_scan_node(const void *fdt,
@@ -381,7 +385,7 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr)
if ( ret < 0 )
panic("No valid device tree\n");
- add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt));
+ add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), false);
device_tree_for_each_node((void *)fdt, early_scan_node, NULL);
early_print_info();
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index bc7dd97..dbab232 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -201,10 +201,12 @@ void __init dt_unreserved_regions(paddr_t s, paddr_t e,
}
struct bootmodule __init *add_boot_module(bootmodule_kind kind,
- paddr_t start, paddr_t size)
+ paddr_t start, paddr_t size,
+ bool domU)
{
struct bootmodules *mods = &bootinfo.modules;
struct bootmodule *mod;
+ unsigned int i;
if ( mods->nr_mods == MAX_MODULES )
{
@@ -212,11 +214,22 @@ struct bootmodule __init *add_boot_module(bootmodule_kind
kind,
boot_module_kind_as_string(kind), start, start + size);
return NULL;
}
+ for ( i = 0 ; i < mods->nr_mods ; i++ )
+ {
+ mod = &mods->module[i];
+ if ( mod->kind == kind && mod->start == start )
+ {
+ if ( !domU )
+ mod->domU = false;
+ return mod;
+ }
+ }
mod = &mods->module[mods->nr_mods++];
mod->kind = kind;
mod->start = start;
mod->size = size;
+ mod->domU = domU;
return mod;
}
@@ -229,7 +242,7 @@ struct bootmodule * __init
boot_module_find_by_kind(bootmodule_kind kind)
for (i = 0 ; i < mods->nr_mods ; i++ )
{
mod = &mods->module[i];
- if ( mod->kind == kind )
+ if ( mod->kind == kind && !mod->domU )
return mod;
}
return NULL;
@@ -244,7 +257,7 @@ struct bootcmdline * __init
boot_cmdline_find_by_kind(bootmodule_kind kind)
for ( i = 0 ; i < cmds->nr_mods ; i++ )
{
cmd = &cmds->cmdline[i];
- if ( cmd->kind == kind )
+ if ( cmd->kind == kind && !cmd->domU )
return cmd;
}
return NULL;
@@ -738,7 +751,7 @@ void __init start_xen(unsigned long boot_phys_offset,
/* Register Xen's load address as a boot module. */
xen_bootmodule = add_boot_module(BOOTMOD_XEN,
(paddr_t)(uintptr_t)(_start + boot_phys_offset),
- (paddr_t)(uintptr_t)(_end - _start + 1));
+ (paddr_t)(uintptr_t)(_end - _start + 1), false);
BUG_ON(!xen_bootmodule);
xen_paddr = get_xen_paddr();
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index c2ed5cc..711b4a2 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -33,6 +33,7 @@ struct meminfo {
#define BOOTMOD_MAX_CMDLINE 1024
struct bootmodule {
bootmodule_kind kind;
+ bool domU;
paddr_t start;
paddr_t size;
};
@@ -41,6 +42,7 @@ struct bootmodule {
#define DT_MAX_NAME 41
struct bootcmdline {
bootmodule_kind kind;
+ bool domU;
char dt_name[DT_MAX_NAME];
char cmdline[BOOTMOD_MAX_CMDLINE];
};
@@ -91,7 +93,7 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t paddr);
const char __init *boot_fdt_cmdline(const void *fdt);
struct bootmodule *add_boot_module(bootmodule_kind kind,
- paddr_t start, paddr_t size);
+ paddr_t start, paddr_t size, bool domU);
struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind);
struct bootcmdline *boot_cmdline_find_by_kind(bootmodule_kind kind);
const char * __init boot_module_kind_as_string(bootmodule_kind kind);
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |