[Concept,19/26] boot: pxe: Update parse_pxefile() to take struct abuf

Message ID 20260110202906.187370-20-sjg@u-boot.org
State New
Headers
Series boot: pxe: Add three-phase API and fix memory leaks |

Commit Message

Simon Glass Jan. 10, 2026, 8:28 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Change parse_pxefile() to accept a struct abuf instead of separate
address and size parameters. This provides a cleaner interface and
allows the function to use abuf_data() directly without needing to call
map_sysmem().

Callers now create an abuf with abuf_map_sysmem() to wrap the memory
region before calling parse_pxefile().

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 boot/pxe_utils.c    | 12 +++++-------
 include/pxe_utils.h |  9 ++++-----
 test/boot/pxe.c     | 20 +++++++++++++++-----
 3 files changed, 24 insertions(+), 17 deletions(-)
  

Patch

diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c
index 3f751f25bea..d2ba0412906 100644
--- a/boot/pxe_utils.c
+++ b/boot/pxe_utils.c
@@ -1004,20 +1004,16 @@  void pxe_menu_uninit(struct pxe_menu *cfg)
 	free(cfg);
 }
 
-struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg,
-			       ulong size)
+struct pxe_menu *parse_pxefile(struct pxe_context *ctx, struct abuf *buf)
 {
 	struct pxe_menu *cfg;
-	char *buf;
 	int r;
 
 	cfg = pxe_menu_init();
 	if (!cfg)
 		return NULL;
 
-	buf = map_sysmem(menucfg, size);
-	r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1);
-	unmap_sysmem(buf);
+	r = parse_pxefile_top(ctx, abuf_data(buf), abuf_addr(buf), cfg, 1);
 
 	if (r < 0) {
 		pxe_menu_uninit(cfg);
@@ -1305,9 +1301,11 @@  static struct pxe_menu *pxe_prepare(struct pxe_context *ctx,
 				    ulong pxefile_addr_r, bool prompt)
 {
 	struct pxe_menu *cfg;
+	struct abuf buf;
 	int ret;
 
-	cfg = parse_pxefile(ctx, pxefile_addr_r, ctx->pxe_file_size);
+	abuf_init_addr(&buf, pxefile_addr_r, ctx->pxe_file_size);
+	cfg = parse_pxefile(ctx, &buf);
 	if (!cfg) {
 		printf("Error parsing config file\n");
 		return NULL;
diff --git a/include/pxe_utils.h b/include/pxe_utils.h
index e8045511c6a..9682956932b 100644
--- a/include/pxe_utils.h
+++ b/include/pxe_utils.h
@@ -3,6 +3,7 @@ 
 #ifndef __PXE_UTILS_H
 #define __PXE_UTILS_H
 
+#include <abuf.h>
 #include <alist.h>
 #include <bootflow.h>
 #include <linux/list.h>
@@ -292,19 +293,17 @@  int get_pxelinux_path(struct pxe_context *ctx, const char *file,
 void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg);
 
 /**
- * parse_pxefile() - Parse a pxe file
+ * parse_pxefile() - Parse a PXE file
  *
  * Parse the top-level file. Any includes are stored in cfg->includes and
  * should be processed by calling pxe_process_includes().
  *
  * @ctx: PXE context (provided by the caller)
- * @menucfg: Address of the PXE file in memory
- * @size: Size of file in bytes
+ * @buf: Buffer containing the PXE file
  * Return: NULL on error, otherwise a pointer to a pxe_menu struct. Use
  * pxe_menu_uninit() to free it.
  */
-struct pxe_menu *parse_pxefile(struct pxe_context *ctx, ulong menucfg,
-			       ulong size);
+struct pxe_menu *parse_pxefile(struct pxe_context *ctx, struct abuf *buf);
 
 /**
  * pxe_process_includes() - Process include files in a parsed menu
diff --git a/test/boot/pxe.c b/test/boot/pxe.c
index 1a990a8e348..56b1dfb4c49 100644
--- a/test/boot/pxe.c
+++ b/test/boot/pxe.c
@@ -139,6 +139,7 @@  static int pxe_test_parse_norun(struct unit_test_state *uts)
 	struct pxe_context ctx;
 	struct pxe_label *label;
 	struct pxe_menu *cfg;
+	struct abuf buf;
 	char name[16];
 	uint i;
 	int ret;
@@ -161,7 +162,8 @@  static int pxe_test_parse_norun(struct unit_test_state *uts)
 	ut_asserteq(1, ret);  /* get_pxe_file returns 1 on success */
 
 	/* Parse the config file */
-	cfg = parse_pxefile(&ctx, addr, ctx.pxe_file_size);
+	abuf_init_addr(&buf, addr, ctx.pxe_file_size);
+	cfg = parse_pxefile(&ctx, &buf);
 	ut_assertnonnull(cfg);
 
 	/* Process any include files */
@@ -448,6 +450,7 @@  static int pxe_test_fdtdir_norun(struct unit_test_state *uts)
 	struct pxe_label *label;
 	struct pxe_menu *cfg;
 	ulong addr = PXE_LOAD_ADDR;
+	struct abuf buf;
 	void *fdt;
 
 	ut_assertnonnull(fs_image);
@@ -465,7 +468,8 @@  static int pxe_test_fdtdir_norun(struct unit_test_state *uts)
 	/* Read and parse the config file */
 	ut_asserteq(1, get_pxe_file(&ctx, cfg_path, addr));
 
-	cfg = parse_pxefile(&ctx, addr, ctx.pxe_file_size);
+	abuf_init_addr(&buf, addr, ctx.pxe_file_size);
+	cfg = parse_pxefile(&ctx, &buf);
 	ut_assertnonnull(cfg);
 
 	/* Consume parsing output */
@@ -557,6 +561,7 @@  static int pxe_test_errors_norun(struct unit_test_state *uts)
 	struct pxe_label *label;
 	struct pxe_menu *cfg;
 	ulong addr = PXE_LOAD_ADDR;
+	struct abuf buf;
 	void *fdt;
 
 	ut_assertnonnull(fs_image);
@@ -574,7 +579,8 @@  static int pxe_test_errors_norun(struct unit_test_state *uts)
 	/* Read and parse the config file */
 	ut_asserteq(1, get_pxe_file(&ctx, cfg_path, addr));
 
-	cfg = parse_pxefile(&ctx, addr, ctx.pxe_file_size);
+	abuf_init_addr(&buf, addr, ctx.pxe_file_size);
+	cfg = parse_pxefile(&ctx, &buf);
 	ut_assertnonnull(cfg);
 
 	/* Consume parsing output */
@@ -675,6 +681,7 @@  static int pxe_test_overlay_no_addr_norun(struct unit_test_state *uts)
 	struct pxe_label *label;
 	struct pxe_menu *cfg;
 	ulong addr = PXE_LOAD_ADDR;
+	struct abuf buf;
 	void *fdt;
 
 	ut_assertnonnull(fs_image);
@@ -693,7 +700,8 @@  static int pxe_test_overlay_no_addr_norun(struct unit_test_state *uts)
 	ctx.quiet = true;
 	ut_asserteq(1, get_pxe_file(&ctx, cfg_path, addr));
 
-	cfg = parse_pxefile(&ctx, addr, ctx.pxe_file_size);
+	abuf_init_addr(&buf, addr, ctx.pxe_file_size);
+	cfg = parse_pxefile(&ctx, &buf);
 	ut_assertnonnull(cfg);
 
 	/* Process any include files */
@@ -1248,6 +1256,7 @@  static int pxe_test_fit_embedded_fdt_norun(struct unit_test_state *uts)
 	struct pxe_label *label;
 	struct pxe_menu *cfg;
 	ulong addr = PXE_LOAD_ADDR;
+	struct abuf buf;
 
 	ut_assertnonnull(fs_image);
 	ut_assertnonnull(cfg_path);
@@ -1268,7 +1277,8 @@  static int pxe_test_fit_embedded_fdt_norun(struct unit_test_state *uts)
 	/* Read and parse the config file */
 	ut_asserteq(1, get_pxe_file(&ctx, cfg_path, addr));
 
-	cfg = parse_pxefile(&ctx, addr, ctx.pxe_file_size);
+	abuf_init_addr(&buf, addr, ctx.pxe_file_size);
+	cfg = parse_pxefile(&ctx, &buf);
 	ut_assertnonnull(cfg);
 
 	/* Consume parsing output */