bootm: Update fixup_silent_linux() to return an error
authorSimon Glass <sjg@chromium.org>
Thu, 5 Nov 2020 17:33:39 +0000 (10:33 -0700)
committerTom Rini <trini@konsulko.com>
Fri, 4 Dec 2020 21:09:26 +0000 (16:09 -0500)
At present this function fails silently on error. Update it to produce
an error code. Report this error to the user and abort the boot, since it
likely will prevent a successful start.

No tests are added at this stage, since additional refactoring is taking
place in subsequent patches.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/bootm.c
include/bootm.h
test/bootm.c

index 0d36c57..950ff7c 100644 (file)
@@ -468,7 +468,7 @@ ulong bootm_disable_interrupts(void)
 #define CONSOLE_ARG     "console="
 #define CONSOLE_ARG_LEN (sizeof(CONSOLE_ARG) - 1)
 
-void fixup_silent_linux(void)
+int fixup_silent_linux(void)
 {
        char *buf;
        const char *env_val;
@@ -477,7 +477,7 @@ void fixup_silent_linux(void)
 
        if (!IS_ENABLED(CONFIG_SILENT_CONSOLE) &&
            !IS_ENABLED(CONFIG_SILENT_U_BOOT_ONLY))
-               return;
+               return 0;
        cmdline = env_get("bootargs");
 
        /*
@@ -489,9 +489,9 @@ void fixup_silent_linux(void)
         */
        want_silent = env_get_yesno("silent_linux");
        if (want_silent == 0)
-               return;
+               return 0;
        else if (want_silent == -1 && !(gd->flags & GD_FLG_SILENT))
-               return;
+               return 0;
 
        debug("before silent fix-up: %s\n", cmdline);
        if (cmdline && (cmdline[0] != '\0')) {
@@ -501,7 +501,7 @@ void fixup_silent_linux(void)
                buf = malloc(strlen(cmdline) + 1 + CONSOLE_ARG_LEN + 1);
                if (!buf) {
                        debug("%s: out of memory\n", __func__);
-                       return;
+                       return -ENOSPC;
                }
 
                if (start) {
@@ -525,6 +525,8 @@ void fixup_silent_linux(void)
        env_set("bootargs", env_val);
        debug("after silent fix-up: %s\n", env_val);
        free(buf);
+
+       return 0;
 }
 
 /**
@@ -629,8 +631,14 @@ int do_bootm_states(struct cmd_tbl *cmdtp, int flag, int argc,
        if (!ret && (states & BOOTM_STATE_OS_BD_T))
                ret = boot_fn(BOOTM_STATE_OS_BD_T, argc, argv, images);
        if (!ret && (states & BOOTM_STATE_OS_PREP)) {
-               if (images->os.os == IH_OS_LINUX)
-                       fixup_silent_linux();
+               if (images->os.os == IH_OS_LINUX) {
+                       ret = fixup_silent_linux();
+                       if (ret) {
+                               printf("Cmdline setup failed (err=%d)\n", ret);
+                               ret = CMD_RET_FAILURE;
+                               goto err;
+                       }
+               }
                ret = boot_fn(BOOTM_STATE_OS_PREP, argc, argv, images);
        }
 
index 6d675e6..438829a 100644 (file)
@@ -85,7 +85,14 @@ void arch_preboot_os(void);
  */
 void board_preboot_os(void);
 
-/* Adjust the 'bootargs' to ensure that Linux boots silently, if required */
-void fixup_silent_linux(void);
+/*
+ * fixup_silent_linux() - Process fix-ups for the command line
+ *
+ * Updates the 'bootargs' envvar as required. This handles making Linux boot
+ * silently if requested ('silent_linux' envvar)
+ *
+ * @return 0 if OK, -ENOMEM if out of memory
+ */
+int fixup_silent_linux(void);
 
 #endif
index 59d16cb..ab17116 100644 (file)
@@ -23,26 +23,26 @@ static int bootm_test_silent_var(struct unit_test_state *uts)
        /* 'silent_linux' not set should do nothing */
        env_set("silent_linux", NULL);
        env_set("bootargs", CONSOLE_STR);
-       fixup_silent_linux();
+       ut_assertok(fixup_silent_linux());
        ut_asserteq_str(CONSOLE_STR, env_get("bootargs"));
 
        env_set("bootargs", NULL);
-       fixup_silent_linux();
+       ut_assertok(fixup_silent_linux());
        ut_assertnull(env_get("bootargs"));
 
        ut_assertok(env_set("silent_linux", "no"));
        env_set("bootargs", CONSOLE_STR);
-       fixup_silent_linux();
+       ut_assertok(fixup_silent_linux());
        ut_asserteq_str(CONSOLE_STR, env_get("bootargs"));
 
        ut_assertok(env_set("silent_linux", "yes"));
        env_set("bootargs", CONSOLE_STR);
-       fixup_silent_linux();
+       ut_assertok(fixup_silent_linux());
        ut_asserteq_str("console=", env_get("bootargs"));
 
        /* Empty buffer should still add the string */
        env_set("bootargs", NULL);
-       fixup_silent_linux();
+       ut_assertok(fixup_silent_linux());
        ut_asserteq_str("console=", env_get("bootargs"));
 
        return 0;