
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 --- boot/pxe_utils.c | 15 +++++++++++++++ doc/README.pxe | 5 +++++ include/pxe_utils.h | 2 ++ 3 files changed, 22 insertions(+)
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 <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 diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 9f19593048..a408fb7f13 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -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;