@@ -1,3 +1,6 @@
+Dom0 kernel and ramdisk modules
+================================
+
Xen is passed the dom0 kernel and initrd via a reference in the /chosen
node of the device tree.
@@ -22,4 +25,27 @@ properties:
- bootargs (optional)
- Command line associated with this module
+ Command line associated with this module. This is deprecated and should
+ be replaced by the bootargs variations described below.
+
+
+Command lines
+=============
+
+Xen also checks for properties directly under /chosen to find suitable command
+lines for Xen and Dom0. The logic is the following:
+
+ - 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.
+ - 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.
+
+Most of these cases is to make booting with Xen-unaware bootloaders easier.
+For those you would hardcode the Xen commandline in the DTB under
+/chosen/xen,xen-bootargs and would let the bootloader set the Dom0 command
+line by writing bootargs (as for native Linux).
+A Xen-aware bootloader would set xen,xen-bootargs for Xen, xen,dom0-bootargs
+for Dom0 and bootargs for native Linux.
@@ -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;
}
@@ -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;