Drop the static qualifier from label_create(), label_destroy(), parse_label_keys() and label_boot(), and declare them in <pxe_utils.h> to make them reusable.
The intended consumer is a Boot Loader Specification bootmeth, where each on-disk file under loader/entries/ is a single entry with no 'label' header and no menu to traverse: the bootmeth derives the label name from the filename, hands the file body to parse_label_keys(), and invokes label_boot() directly. No behaviour change: the implementations are unchanged and existing in-tree callers in pxe_utils.c continue to use them as before. Signed-off-by: Alexey Charkov <[email protected]> --- boot/pxe_utils.c | 37 ++++------------------------------- include/pxe_utils.h | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 33 deletions(-) diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 420cee307baf..6dad3045f9d4 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -218,15 +218,7 @@ static int get_relfile_envaddr(struct pxe_context *ctx, const char *file_path, return get_relfile(ctx, file_path, file_addr, type, filesizep); } -/** - * label_create() - crate a new PXE label - * - * Allocates memory for and initializes a pxe_label. This uses malloc, so the - * result must be free()'d to reclaim the memory. - * - * Returns a pointer to the label, or NULL if out of memory - */ -static struct pxe_label *label_create(void) +struct pxe_label *label_create(void) { struct pxe_label *label; @@ -239,20 +231,7 @@ static struct pxe_label *label_create(void) return label; } -/** - * label_destroy() - free the memory used by a pxe_label - * - * This frees @label itself as well as memory used by its name, - * kernel, config, append, initrd, fdt, fdtdir and fdtoverlay members, if - * they're non-NULL. - * - * So - be sure to only use dynamically allocated memory for the members of - * the pxe_label struct, unless you want to clean it up first. These are - * currently only created by the pxe file parsing code. - * - * @label: Label to free - */ -static void label_destroy(struct pxe_label *label) +void label_destroy(struct pxe_label *label) { free(label->name); free(label->kernel_label); @@ -542,7 +521,7 @@ cleanup: * Returns does not return on success, otherwise returns 0 if a localboot * label was processed, or 1 on error */ -static int label_boot(struct pxe_context *ctx, struct pxe_label *label) +int label_boot(struct pxe_context *ctx, struct pxe_label *label) { char *bootm_argv[] = { "bootm", NULL, NULL, NULL, NULL }; char *zboot_argv[] = { "zboot", NULL, "0", NULL, NULL }; @@ -1287,15 +1266,7 @@ static int parse_label_kernel(char **c, struct pxe_label *label) return 1; } -/* - * Parse the body of a label: the sequence of key/value lines that follow - * the 'label NAME' header. Stops at end-of-file or at a token that doesn't - * belong inside a label (which is pushed back so the caller can handle it). - * - * Returns 1 on success, < 0 on error. - */ -static int parse_label_keys(char **c, struct pxe_menu *cfg, - struct pxe_label *label) +int parse_label_keys(char **c, struct pxe_menu *cfg, struct pxe_label *label) { struct token t; char *s; diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 0378f2889f7b..e639e59e5dc8 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -202,6 +202,62 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg); */ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, ulong menucfg); +/** + * label_create() - Allocate and zero-initialise a struct pxe_label + * + * The result must be freed with label_destroy(). + * + * Return: pointer to the new label, or NULL if out of memory + */ +struct pxe_label *label_create(void); + +/** + * label_destroy() - Free a struct pxe_label and its string members + * + * Frees @label as well as memory used by its name, kernel, config, append, + * initrd, fdt, fdtdir and fdtoverlays members, if they are non-NULL. All + * such members must therefore reference malloc()'d memory. + * + * @label: Label to free + */ +void label_destroy(struct pxe_label *label); + +/** + * parse_label_keys() - Parse the body of a label + * + * Walks the sequence of key/value lines that follow a 'label NAME' header, + * populating @label. Stops at end-of-file or at a token that does not + * belong inside a label (which is pushed back so the caller can handle it). + * + * This is exported so that callers handling formats which lack a 'label' + * header (e.g. Boot Loader Specification type #2 entry files) can populate + * a pre-created label directly from a file body. + * + * @c: Pointer to the cursor into the file being parsed; updated on return + * @cfg: Menu the label belongs to (used for 'menu default' bookkeeping) + * @label: Label to populate; must already be allocated and (when called for + * a file that has a 'label' header) attached to @cfg->labels + * Return: 1 on success, < 0 on error + */ +int parse_label_keys(char **c, struct pxe_menu *cfg, struct pxe_label *label); + +/** + * label_boot() - Boot according to the contents of a single pxe_label + * + * On success this function does not return; on failure it returns to + * let the caller try a different label or surface an error. + * + * The kernel is staged at $kernel_addr_r, an optional initrd at + * $ramdisk_addr_r, and an optional FDT at $fdt_addr_r. If the label + * has an 'append' string it overwrites $bootargs. + * + * @ctx: PXE context + * @label: Label to boot + * Return: does not return on success; 0 if a 'localboot' label was + * processed; 1 on error + */ +int label_boot(struct pxe_context *ctx, struct pxe_label *label); + /** * format_mac_pxe() - Convert a MAC address to PXE format * -- 2.53.0

