]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
boot: pxe_utils: Add fallback support
authorMartyn Welch <martyn.welch@collabora.com>
Wed, 9 Oct 2024 13:15:38 +0000 (14:15 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 15 Oct 2024 16:24:27 +0000 (10:24 -0600)
When configured correctly, we can detect when boot fails after the boot
process has been handed over to the kernel through the use of U-Boot's
bootcount support. In some instances, such as when we are performing
atomic updates via a system such as OSTree, it is desirable to provide a
fallback option so that we can return to a previous (hopefully working)
state.

Add a "fallback" option to the supported extlinux configuration options
that points to a label like "default" so that we can utilise this in
later commits.

Signed-off-by: Martyn Welch <martyn.welch@collabora.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
boot/pxe_utils.c
doc/README.pxe
include/pxe_utils.h

index 4e27842b088dca5de83d84a1ea2df4a0e7e75291..a80119c9a3bd01a1e6c330ce8ff445e2e38fde07 100644 (file)
@@ -781,6 +781,7 @@ enum token_type {
        T_IPAPPEND,
        T_BACKGROUND,
        T_KASLRSEED,
+       T_FALLBACK,
        T_INVALID
 };
 
@@ -814,6 +815,7 @@ static const struct token keywords[] = {
        {"ipappend", T_IPAPPEND,},
        {"background", T_BACKGROUND,},
        {"kaslrseed", T_KASLRSEED,},
+       {"fallback", T_FALLBACK,},
        {NULL, T_INVALID}
 };
 
@@ -1356,6 +1358,18 @@ static int parse_pxefile_top(struct pxe_context *ctx, char *p, unsigned long bas
 
                        break;
 
+               case T_FALLBACK:
+                       err = parse_sliteral(&p, &label_name);
+
+                       if (label_name) {
+                               if (cfg->fallback_label)
+                                       free(cfg->fallback_label);
+
+                               cfg->fallback_label = label_name;
+                       }
+
+                       break;
+
                case T_INCLUDE:
                        err = handle_include(ctx, &p,
                                             base + ALIGN(strlen(b), 4), cfg,
@@ -1395,6 +1409,7 @@ void destroy_pxe_menu(struct pxe_menu *cfg)
 
        free(cfg->title);
        free(cfg->default_label);
+       free(cfg->fallback_label);
 
        list_for_each_safe(pos, n, &cfg->labels) {
                label = list_entry(pos, struct pxe_label, list);
index 172201093d0260325483e67f7a4e759d317ba7ad..af2e64a5776bb3a1bf1f6d7d38d03d87a983910c 100644 (file)
@@ -120,6 +120,11 @@ Unrecognized commands are ignored.
 default <label>            - the label named here is treated as the default and is
                      the first label 'pxe boot' attempts to boot.
 
+fallback <label>    - the label named here is treated as a fallback option that
+                     may be attempted should it be detected that booting of
+                     the default has failed to complete, for example via
+                     U-Boot's boot count limit functionality.
+
 menu title <string> - sets a title for the menu of labels being displayed.
 
 menu include <path> - use tftp to retrieve the pxe file at <path>, which
index 9f195930487fb67978f9ff8f34980a5c3e1bb4e2..a408fb7f13c130b92ac8407cf9d14b1b3167c00d 100644 (file)
@@ -62,6 +62,7 @@ struct pxe_label {
  *
  * title - the name of the menu as given by a 'menu title' line.
  * default_label - the name of the default label, if any.
+ * fallback_label - the name of the fallback label, if any.
  * bmp - the bmp file name which is displayed in background
  * timeout - time in tenths of a second to wait for a user key-press before
  *           booting the default label.
@@ -73,6 +74,7 @@ struct pxe_label {
 struct pxe_menu {
        char *title;
        char *default_label;
+       char *fallback_label;
        char *bmp;
        int timeout;
        int prompt;