From: Martyn Welch Date: Wed, 9 Oct 2024 13:15:38 +0000 (+0100) Subject: boot: pxe_utils: Add fallback support X-Git-Url: http://git.dujemihanovic.xyz/?a=commitdiff_plain;h=d2faad3ff31f0fab0cf280c05ee333992f7a7d27;p=u-boot.git boot: pxe_utils: Add fallback support 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 Reviewed-by: Simon Glass --- diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 4e27842b08..a80119c9a3 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -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); diff --git a/doc/README.pxe b/doc/README.pxe index 172201093d..af2e64a577 100644 --- a/doc/README.pxe +++ b/doc/README.pxe @@ -120,6 +120,11 @@ Unrecognized commands are ignored. default