linux_bootargs_get() falls back to the legacy bootargs environment variable whenever the concatenation of all global.linux.bootargs.* variables comes out empty. That contradicts the documentation, which describes bootargs as the CONFIG_FLEXIBLE_BOOTARGS=n way of passing a command line, and it only worked until the first boot entry had run: bootscript_boot() registers global.linux.bootargs.dyn.ip and .dyn.root, and the separator between the two empty variables made the result non-empty, so the kernel got a command line consisting of spaces instead.
Drop the fallback and return NULL when there is nothing to pass. All callers already handle a NULL command line, as the fallback could return NULL as well. Assisted-by: Claude:opus-5 Signed-off-by: Ahmad Fatoum <[email protected]> --- .../migration-guides/migration-master.rst | 16 ++++++++++++++++ Documentation/user/booting-linux.rst | 6 ++++-- common/bootargs.c | 14 ++++++-------- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Documentation/migration-guides/migration-master.rst b/Documentation/migration-guides/migration-master.rst index d5601ac838c5..c67ea2157f47 100644 --- a/Documentation/migration-guides/migration-master.rst +++ b/Documentation/migration-guides/migration-master.rst @@ -12,3 +12,19 @@ OP-TEE loading is now only supported For i.MX6 boards, this can be enabled by enabling ``CONFIG_FIRMWARE_IMX6_OPTEE``. + +Legacy bootargs variable ignored with CONFIG_FLEXIBLE_BOOTARGS +-------------------------------------------------------------- + +With ``CONFIG_FLEXIBLE_BOOTARGS`` enabled, the kernel command line used to +fall back to the legacy ``bootargs`` environment variable whenever the +concatenation of all ``global.linux.bootargs.*`` variables came out empty. +This fallback is gone, only the global variables are used now. + +The fallback was already mostly unreachable: once a boot entry had run, +``global.linux.bootargs.dyn.ip`` and ``global.linux.bootargs.dyn.root`` were +registered and the separator between the two empty variables made the +concatenation non-empty. + +Set ``global.linux.bootargs.base`` instead of ``bootargs``, or disable +``CONFIG_FLEXIBLE_BOOTARGS`` to keep using the legacy variable. diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst index 0f1225681360..95834786b67a 100644 --- a/Documentation/user/booting-linux.rst +++ b/Documentation/user/booting-linux.rst @@ -84,8 +84,10 @@ The simple method to pass bootargs to the kernel is with takes the bootargs from the :ref:`bootargs <magicvar_bootargs>` environment variable. With ``CONFIG_FLEXIBLE_BOOTARGS`` enabled, the bootargs are composed -from different :ref:`global device<global_device>` variables. All variables beginning -with ``global.linux.bootargs.`` will be concatenated to the bootargs: +from different :ref:`global device<global_device>` variables and the +:ref:`bootargs <magicvar_bootargs>` environment variable is ignored. +All variables beginning with ``global.linux.bootargs.`` will be concatenated +to the bootargs: .. code-block:: sh diff --git a/common/bootargs.c b/common/bootargs.c index 36528b8b5827..710f74de9629 100644 --- a/common/bootargs.c +++ b/common/bootargs.c @@ -17,12 +17,10 @@ static int linux_bootargs_overwritten; /* * This returns the Linux bootargs * - * There are two ways to handle bootargs. The old legacy way is to use the - * 'bootargs' environment variable. The new and more flexible way is to use - * global variables beginning with "global.linux.bootargs." and - * "global.linux.mtdparts.". These variables will be concatenated together to - * the resulting bootargs. If there are no "global.linux.bootargs." variables - * we fall back to "bootargs" + * The bootargs are concatenated from the global variables beginning with + * "global.linux.bootargs.", "global.linux.mtdparts." and + * "global.linux.blkdevparts.". The legacy 'bootargs' environment variable + * is only used by the CONFIG_FLEXIBLE_BOOTARGS=n stub in <bootargs.h>. */ const char *linux_bootargs_get(void) { @@ -34,9 +32,9 @@ const char *linux_bootargs_get(void) free(linux_bootargs); bootargs = globalvar_get_match("linux.bootargs.", " "); - if (!strlen(bootargs)) { + if (!*bootargs) { free(bootargs); - return getenv("bootargs"); + return NULL; } linux_bootargs = bootargs; -- 2.47.3
