doc: replace @return by Return:
[platform/kernel/u-boot.git] / common / autoboot.c
index 832ef7c..b8861d5 100644 (file)
@@ -24,6 +24,7 @@
 #include <u-boot/sha256.h>
 #include <bootcount.h>
 #include <crypt.h>
+#include <dm/ofnode.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -63,8 +64,12 @@ static int menukey;
  * or
  *   the config value CONFIG_AUTOBOOT_STOP_STR_CRYPT
  *
+ * In case the config value CONFIG_AUTOBOOT_NEVER_TIMEOUT has been enabled
+ * this function never times out if the user presses the <Enter> key
+ * before starting to enter the password.
+ *
  * @etime: Timeout value ticks (stop when get_ticks() reachs this)
- * @return 0 if autoboot should continue, 1 if it should stop
+ * Return: 0 if autoboot should continue, 1 if it should stop
  */
 static int passwd_abort_crypt(uint64_t etime)
 {
@@ -72,6 +77,7 @@ static int passwd_abort_crypt(uint64_t etime)
        char presskey[DELAY_STOP_STR_MAX_LENGTH];
        u_int presskey_len = 0;
        int abort = 0;
+       int never_timeout = 0;
        int err;
 
        if (IS_ENABLED(CONFIG_AUTOBOOT_STOP_STR_ENABLE) && !crypt_env_str)
@@ -91,6 +97,11 @@ static int passwd_abort_crypt(uint64_t etime)
 
                        if ((presskey[presskey_len] == '\r') ||
                            (presskey[presskey_len] == '\n')) {
+                               if (IS_ENABLED(CONFIG_AUTOBOOT_NEVER_TIMEOUT) &&
+                                   !presskey_len) {
+                                       never_timeout = 1;
+                                       continue;
+                               }
                                presskey[presskey_len] = '\0';
                                err = crypt_compare(crypt_env_str, presskey,
                                                    &abort);
@@ -104,7 +115,7 @@ static int passwd_abort_crypt(uint64_t etime)
                                presskey_len++;
                        }
                }
-       } while (get_ticks() <= etime);
+       } while (never_timeout || get_ticks() <= etime);
 
        return abort;
 }
@@ -132,7 +143,7 @@ static int slow_equals(u8 *a, u8 *b, int len)
  * This checks for the user entering a SHA256 hash within a given time.
  *
  * @etime: Timeout value ticks (stop when get_ticks() reachs this)
- * @return 0 if autoboot should continue, 1 if it should stop
+ * Return: 0 if autoboot should continue, 1 if it should stop
  */
 static int passwd_abort_sha256(uint64_t etime)
 {
@@ -208,7 +219,7 @@ static int passwd_abort_sha256(uint64_t etime)
  * This checks for the user entering a string within a given time.
  *
  * @etime: Timeout value ticks (stop when get_ticks() reachs this)
- * @return 0 if autoboot should continue, 1 if it should stop
+ * Return: 0 if autoboot should continue, 1 if it should stop
  */
 static int passwd_abort_key(uint64_t etime)
 {
@@ -287,6 +298,35 @@ static int passwd_abort_key(uint64_t etime)
        return abort;
 }
 
+/**
+ * flush_stdin() - drops all pending characters from stdin
+ */
+static void flush_stdin(void)
+{
+       while (tstc())
+               (void)getchar();
+}
+
+/**
+ * fallback_to_sha256() - check whether we should fall back to sha256
+ *                        password checking
+ *
+ * This checks for the environment variable `bootstopusesha256` in case
+ * sha256-fallback has been enabled via the config setting
+ * `AUTOBOOT_SHA256_FALLBACK`.
+ *
+ * Return: `false` if we must not fall-back, `true` if plain sha256 should be tried
+ */
+static bool fallback_to_sha256(void)
+{
+       if (IS_ENABLED(CONFIG_AUTOBOOT_SHA256_FALLBACK))
+               return env_get_yesno("bootstopusesha256") == 1;
+       else if (IS_ENABLED(CONFIG_CRYPT_PW))
+               return false;
+       else
+               return true;
+}
+
 /***************************************************************************
  * Watch for 'delay' seconds for autoboot stop or autoboot delay string.
  * returns: 0 -  no key string, allow autoboot 1 - got key string, abort
@@ -296,6 +336,8 @@ static int abortboot_key_sequence(int bootdelay)
        int abort;
        uint64_t etime = endtick(bootdelay);
 
+       if (IS_ENABLED(CONFIG_AUTOBOOT_FLUSH_STDIN))
+               flush_stdin();
 #  ifdef CONFIG_AUTOBOOT_PROMPT
        /*
         * CONFIG_AUTOBOOT_PROMPT includes the %d for all boards.
@@ -305,7 +347,7 @@ static int abortboot_key_sequence(int bootdelay)
 #  endif
 
        if (IS_ENABLED(CONFIG_AUTOBOOT_ENCRYPTION)) {
-               if (IS_ENABLED(CONFIG_CRYPT_PW))
+               if (IS_ENABLED(CONFIG_CRYPT_PW) && !fallback_to_sha256())
                        abort = passwd_abort_crypt(etime);
                else
                        abort = passwd_abort_sha256(etime);
@@ -365,7 +407,7 @@ static int abortboot(int bootdelay)
        int abort = 0;
 
        if (bootdelay >= 0) {
-               if (IS_ENABLED(CONFIG_AUTOBOOT_KEYED))
+               if (autoboot_keyed())
                        abort = abortboot_key_sequence(bootdelay);
                else
                        abort = abortboot_single_key(bootdelay);
@@ -383,12 +425,12 @@ static void process_fdt_options(const void *blob)
        ulong addr;
 
        /* Add an env variable to point to a kernel payload, if available */
-       addr = fdtdec_get_config_int(gd->fdt_blob, "kernel-offset", 0);
+       addr = ofnode_conf_read_int("kernel-offset", 0);
        if (addr)
                env_set_addr("kernaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
 
        /* Add an env variable to point to a root disk, if available */
-       addr = fdtdec_get_config_int(gd->fdt_blob, "rootdisk-offset", 0);
+       addr = ofnode_conf_read_int("rootdisk-offset", 0);
        if (addr)
                env_set_addr("rootaddr", (void *)(CONFIG_SYS_TEXT_BASE + addr));
 #endif /* CONFIG_SYS_TEXT_BASE */
@@ -405,8 +447,7 @@ const char *bootdelay_process(void)
        bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
 
        if (IS_ENABLED(CONFIG_OF_CONTROL))
-               bootdelay = fdtdec_get_config_int(gd->fdt_blob, "bootdelay",
-                                                 bootdelay);
+               bootdelay = ofnode_conf_read_int("bootdelay", bootdelay);
 
        debug("### main_loop entered: bootdelay=%d\n\n", bootdelay);
 
@@ -440,7 +481,7 @@ void autoboot_command(const char *s)
                bool lock;
                int prev;
 
-               lock = IS_ENABLED(CONFIG_AUTOBOOT_KEYED) &&
+               lock = autoboot_keyed() &&
                        !IS_ENABLED(CONFIG_AUTOBOOT_KEYED_CTRLC);
                if (lock)
                        prev = disable_ctrlc(1); /* disable Ctrl-C checking */
@@ -457,4 +498,4 @@ void autoboot_command(const char *s)
                if (s)
                        run_command_list(s, -1, 0);
        }
-}
\ No newline at end of file
+}