aboutsummaryrefslogtreecommitdiffstats
path: root/xen
diff options
context:
space:
mode:
authorAndre Przywara <andre.przywara@linaro.org>2013-09-13 13:49:34 +0100
committerIan Campbell <ian.campbell@citrix.com>2013-09-17 15:29:18 +0100
commita8992d62362e0755d3a1929b059769bc3343135d (patch)
tree3b5e2f425375ca4190f08b7feae0584e5a7d1ad9 /xen
parent735d865183306c85c8ef8a16f8a82c48359e9bee (diff)
downloadxen-a8992d62362e0755d3a1929b059769bc3343135d.tar.gz
xen-a8992d62362e0755d3a1929b059769bc3343135d.tar.bz2
xen-a8992d62362e0755d3a1929b059769bc3343135d.zip
ARM: parse separate DT properties for different commandlines
Currently we use the chosen/bootargs property as the Xen commandline and rely on xen,dom0-bootargs for Dom0. However this brings issues with bootloaders, which usually build bootargs by bootscripts for a Linux kernel - and not for the entirely different Xen hypervisor. Introduce a new possible device tree property "xen,xen-bootargs" explicitly for the Xen hypervisor and make the selection of which to use more fine grained: - If xen,xen-bootargs is present, it will be used for Xen. - If xen,dom0-bootargs is present, it will be used for Dom0. - If xen,xen-bootargs is _not_ present, but xen,dom0-bootargs is, bootargs will be used for Xen. Like the current situation. - If no Xen specific properties are present, bootargs is for Dom0. - If xen,xen-bootargs is present, but xen,dom0-bootargs is missing, bootargs will be used for Dom0. The aim is to allow common bootscripts to boot both Xen and native Linux with the same device tree blob. If needed, one could hard-code the Xen commandline into the DTB, leaving bootargs for Dom0 to be set by the (non Xen-aware) bootloader. I will send out a appropriate u-boot patch, which writes the content of the "xen_bootargs" environment variable into the xen,xen-bootargs dtb property. Signed-off-by: Andre Przywara <andre.przywara@linaro.org> Signed-off-by: Julien Grall <julien.grall@linaro.org> Acked-by: Ian Campbell <ian.campbell@citrix.com>
Diffstat (limited to 'xen')
-rw-r--r--xen/arch/arm/domain_build.c15
-rw-r--r--xen/common/device_tree.c7
2 files changed, 17 insertions, 5 deletions
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 82003c19fe..40af876474 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -146,6 +146,7 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo,
const char *bootargs = NULL;
const struct dt_property *pp;
int res = 0;
+ int had_dom0_bootargs = 0;
if ( early_info.modules.nr_mods >= MOD_KERNEL &&
early_info.modules.module[MOD_KERNEL].cmdline[0] )
@@ -162,15 +163,21 @@ static int write_properties(struct domain *d, struct kernel_info *kinfo,
*
* * remember xen,dom0-bootargs if we don't already have
* bootargs (from module #1, above).
- * * remove bootargs and xen,dom0-bootargs.
+ * * remove bootargs, xen,dom0-bootargs and xen,xen-bootargs.
*/
if ( dt_node_path_is_equal(np, "/chosen") )
{
- if ( dt_property_name_is_equal(pp, "bootargs") )
+ if ( dt_property_name_is_equal(pp, "xen,xen-bootargs") )
+ continue;
+ if ( dt_property_name_is_equal(pp, "xen,dom0-bootargs") )
+ {
+ had_dom0_bootargs = 1;
+ bootargs = pp->value;
continue;
- else if ( dt_property_name_is_equal(pp, "xen,dom0-bootargs") )
+ }
+ if ( dt_property_name_is_equal(pp, "bootargs") )
{
- if ( !bootargs )
+ if ( !bootargs && !had_dom0_bootargs )
bootargs = pp->value;
continue;
}
diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c
index ee58c52b2b..0ece2499ad 100644
--- a/xen/common/device_tree.c
+++ b/xen/common/device_tree.c
@@ -261,7 +261,12 @@ const char *device_tree_bootargs(const void *fdt)
if ( node < 0 )
return NULL;
- prop = fdt_get_property(fdt, node, "bootargs", NULL);
+ prop = fdt_get_property(fdt, node, "xen,xen-bootargs", NULL);
+ if ( prop == NULL )
+ {
+ if (fdt_get_property(fdt, node, "xen,dom0-bootargs", NULL))
+ prop = fdt_get_property(fdt, node, "bootargs", NULL);
+ }
if ( prop == NULL )
return NULL;