From: Stefano Stabellini <sstabellini@kernel.org>
To: julien.grall@arm.com
Cc: Stefano Stabellini <stefanos@xilinx.com>,
Achin.Gupta@arm.com, sstabellini@kernel.org,
andrii_anisov@epam.com, xen-devel@lists.xen.org
Subject: [PATCH v6 07/26] xen/arm: don't add duplicate boot modules, introduce domU flag
Date: Fri, 2 Nov 2018 16:44:59 -0700 [thread overview]
Message-ID: <1541202318-9840-7-git-send-email-sstabellini@kernel.org> (raw)
In-Reply-To: <alpine.DEB.2.10.1811021527250.18518@sstabellini-ThinkPad-X260>
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 all 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@xilinx.com>
---
Changes in v6:
- update comments
Changes in v5:
- improve commit message
- add in-code comments
Changes in v4:
- use unsigned int
- better commit message
- introduce domU flag and usage
Changes in v2:
- new patch
---
xen/arch/arm/bootfdt.c | 11 +++++++----
xen/arch/arm/setup.c | 34 +++++++++++++++++++++++++++++-----
xen/include/asm-arm/setup.h | 12 ++++++++++--
3 files changed, 46 insertions(+), 11 deletions(-)
diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
index 07a9037..8d9ba47 100644
--- a/xen/arch/arm/bootfdt.c
+++ b/xen/arch/arm/bootfdt.c
@@ -175,6 +175,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
int len = 8; /* sizeof "/chosen" */
char path[8];
int parent_node, ret;
+ bool domU;
parent_node = fdt_parent_offset(fdt, node);
ASSERT(parent_node >= 0);
@@ -230,12 +231,14 @@ static void __init process_multiboot_node(const void *fdt, int node,
kind = BOOTMOD_XSM;
}
- add_boot_module(kind, start, size);
+ domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
+ add_boot_module(kind, start, size, domU);
prop = fdt_get_property(fdt, node, "bootargs", &len);
if ( !prop )
return;
- add_boot_cmdline(fdt_get_name(fdt, parent_node, &len), prop->data, kind);
+ add_boot_cmdline(fdt_get_name(fdt, parent_node, &len), prop->data,
+ kind, domU);
}
static void __init process_chosen_node(const void *fdt, int node,
@@ -281,7 +284,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,
@@ -352,7 +355,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 2098591..c69e872 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,15 +214,31 @@ 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;
}
+/*
+ * boot_module_find_by_kind can only be used to return Xen modules (e.g
+ * XSM, DTB) or Dom0 modules. This is not suitable for looking up guest
+ * modules.
+ */
struct bootmodule * __init boot_module_find_by_kind(bootmodule_kind kind)
{
struct bootmodules *mods = &bootinfo.modules;
@@ -229,14 +247,14 @@ 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;
}
void __init add_boot_cmdline(const char *name, const char *cmdline,
- bootmodule_kind kind)
+ bootmodule_kind kind, bool domU)
{
struct bootcmdlines *cmds = &bootinfo.cmdlines;
struct bootcmdline *cmd;
@@ -249,6 +267,7 @@ void __init add_boot_cmdline(const char *name, const char *cmdline,
cmd = &cmds->cmdline[cmds->nr_mods++];
cmd->kind = kind;
+ cmd->domU = domU;
ASSERT(strlen(name) <= DT_MAX_NAME);
safe_strcpy(cmd->dt_name, name);
@@ -258,6 +277,11 @@ void __init add_boot_cmdline(const char *name, const char *cmdline,
safe_strcpy(cmd->cmdline, cmdline);
}
+/*
+ * boot_cmdline_find_by_kind can only be used to return Xen modules (e.g
+ * XSM, DTB) or Dom0 modules. This is not suitable for looking up guest
+ * modules.
+ */
struct bootcmdline * __init boot_cmdline_find_by_kind(bootmodule_kind kind)
{
struct bootcmdlines *cmds = &bootinfo.cmdlines;
@@ -267,7 +291,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;
@@ -761,7 +785,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 7580007..3a30329 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -30,9 +30,16 @@ struct meminfo {
struct membank bank[NR_MEM_BANKS];
};
+/*
+ * The domU flag is set for kernels and ramdisks of "xen,domain" nodes.
+ * The purpose of the domU flag is to avoid getting confused in
+ * kernel_probe, where we try to guess which is the dom0 kernel and
+ * initrd to be compatible with all versions of the multiboot spec.
+ */
#define BOOTMOD_MAX_CMDLINE 1024
struct bootmodule {
bootmodule_kind kind;
+ bool domU;
paddr_t start;
paddr_t size;
};
@@ -41,6 +48,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,10 +99,10 @@ 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);
void add_boot_cmdline(const char *name, const char *cmdline,
- bootmodule_kind kind);
+ bootmodule_kind kind, bool domU);
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@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-11-02 23:44 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-02 23:45 [PATCH v6 00/25] dom0less step1: boot multiple domains from device tree Stefano Stabellini
2018-11-02 23:44 ` [PATCH v6 01/26] xen: allow console_io hypercalls from certain DomUs Stefano Stabellini
2018-11-02 23:44 ` [PATCH v6 02/26] xen/arm: extend device tree based multiboot protocol Stefano Stabellini
2018-11-02 23:44 ` [PATCH v6 03/26] xen/arm: document dom0less Stefano Stabellini
2018-11-02 23:44 ` [PATCH v6 04/26] xen/arm: increase MAX_MODULES Stefano Stabellini
2018-11-02 23:44 ` [PATCH v6 05/26] xen/arm: check for multiboot nodes only under /chosen Stefano Stabellini
2018-11-09 14:01 ` Julien Grall
2018-11-09 21:38 ` Stefano Stabellini
2018-11-09 22:35 ` Julien Grall
2018-11-12 21:13 ` Stefano Stabellini
2018-11-12 21:37 ` Julien Grall
2018-11-02 23:44 ` [PATCH v6 06/26] xen/arm: introduce bootcmdlines Stefano Stabellini
2018-11-02 23:44 ` Stefano Stabellini [this message]
2018-11-09 14:06 ` [PATCH v6 07/26] xen/arm: don't add duplicate boot modules, introduce domU flag Julien Grall
2018-11-02 23:45 ` [PATCH v6 08/26] xen/arm: probe domU kernels and initrds Stefano Stabellini
2018-11-09 14:09 ` Julien Grall
2018-11-02 23:45 ` [PATCH v6 09/26] xen/arm: add start to struct bootcmdline Stefano Stabellini
2018-11-09 14:10 ` Julien Grall
2018-11-02 23:45 ` [PATCH v6 10/26] xen/arm: rename get_11_allocation_size to get_allocation_size Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 11/26] xen/arm: rename allocate_memory to allocate_memory_11 Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 12/26] xen/arm: introduce allocate_memory Stefano Stabellini
2018-11-09 14:19 ` Julien Grall
2018-11-09 21:33 ` Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 13/26] xen/arm: refactor construct_dom0 Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 14/26] xen/arm: move unregister_init_virtual_region to init_done Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 15/26] xen/arm: introduce create_domUs Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 16/26] xen/arm: implement construct_domU Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 17/26] xen/arm: generate a simple device tree for domUs Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 18/26] xen/arm: make set_interrupt_ppi able to handle non-PPI Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 19/26] xen/arm: generate vpl011 node on device tree for domU Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 20/26] xen/arm: introduce a union in vpl011 Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 21/26] xen/arm: refactor vpl011_data_avail Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 22/26] xen: support console_switching between Dom0 and DomUs on ARM Stefano Stabellini
2018-11-05 9:15 ` Jan Beulich
2018-11-02 23:45 ` [PATCH v6 23/26] xen/arm: Allow vpl011 to be used by DomU Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 24/26] xen/vpl011: buffer out chars when the backend is xen Stefano Stabellini
2018-11-09 14:32 ` Julien Grall
2018-11-09 21:13 ` Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 25/26] xen/arm: move kernel.h to asm-arm/ Stefano Stabellini
2018-11-02 23:45 ` [PATCH v6 26/26] xen/arm: split domain_build.c Stefano Stabellini
2018-11-09 14:35 ` Julien Grall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1541202318-9840-7-git-send-email-sstabellini@kernel.org \
--to=sstabellini@kernel.org \
--cc=Achin.Gupta@arm.com \
--cc=andrii_anisov@epam.com \
--cc=julien.grall@arm.com \
--cc=stefanos@xilinx.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).