From patchwork Fri Jan 9 23:11:23 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1410 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1768000398; bh=VPLMOWLqUy90JUJw+fQZwNqDb2NQqO4EnLv2J1wrHDQ=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=TdioXeSRrGwjL2bFYlERo6cD6uMMWZptUAgHAL5PAFGRlEJKRBKr7WpErlhXWapus IpmcZqKGwyVE1DZAU70jW9a0Udpu3sPqlpnegDtMJ2bBGXdBxc7GmrjpRTHnjOOAxt 1OzqVQuBlIYublHsRxKuy4YKH7CtlyIzQOBc6RtSCv7eOsYNw6ZIROovuNsDyXW9yr BruIuAKIj1j7Z9wgefoBaw5cCgSk+o3D0GVE3cdU4hTe1QWx/tshxC/ZpQIqakDsdZ e4XQAJQ4KVmIEK1Sbcmcs6QoSBBoOmc+4qMb5hlhhh6O7+grbn9TtmVC1XVUN3q0ed 8EsajsE86uobQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 43B4C69241 for ; Fri, 9 Jan 2026 16:13:18 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id Oz6RzAkuWE6F for ; Fri, 9 Jan 2026 16:13:18 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1768000398; bh=VPLMOWLqUy90JUJw+fQZwNqDb2NQqO4EnLv2J1wrHDQ=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=TdioXeSRrGwjL2bFYlERo6cD6uMMWZptUAgHAL5PAFGRlEJKRBKr7WpErlhXWapus IpmcZqKGwyVE1DZAU70jW9a0Udpu3sPqlpnegDtMJ2bBGXdBxc7GmrjpRTHnjOOAxt 1OzqVQuBlIYublHsRxKuy4YKH7CtlyIzQOBc6RtSCv7eOsYNw6ZIROovuNsDyXW9yr BruIuAKIj1j7Z9wgefoBaw5cCgSk+o3D0GVE3cdU4hTe1QWx/tshxC/ZpQIqakDsdZ e4XQAJQ4KVmIEK1Sbcmcs6QoSBBoOmc+4qMb5hlhhh6O7+grbn9TtmVC1XVUN3q0ed 8EsajsE86uobQ== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 334B66923D for ; Fri, 9 Jan 2026 16:13:18 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1768000396; bh=J6poRs4shdRohvyQ2n2OdvJN2YoRhEcwqbZup4GJ4jA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UfFPqSTOqINHKpFUH3X8XGrJw3hy/OFeGpvEHDmOre+Gn5MFe2X8IF8fz1T/IkeXJ k0L8VHBfDU7OrEc+H6vzkGW9yITiQ4SCz7i+zY7/UMRdsZmLiSQwsdmVO/xKMEn4Hh 3HFCNmlOKdoQHRiiLz2erWBvdH1CQDhcs/y594kJwDXCLw7ORQ3YrCTO3Cd1kLLwA/ twnSiTjBaCxUmgFdjTBzsetOXqw6/3Adpd5V225idnvTorRsqaRKX7ASJb8I0HiKqO cmvW09ofrPcbjCq+orYl5CHNhUOB2PO/rxNOyXgjwjPsxcnTOKhQ94N1Nuev2qV5mm cb+jn3mSTwdVw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id BF37E69206; Fri, 9 Jan 2026 16:13:16 -0700 (MST) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id HiX5sKL-1AoU; Fri, 9 Jan 2026 16:13:16 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1768000392; bh=znAT+FQ85HsE/EnU3+u0uRmqfbaHNeQan9fiy+ND/30=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uq0aZqy0AVSfpbyrccsr6hrBu+0m14bCKAXj3j6cdrF8HmMazFf25xzQO0OFZ444r 1KNgDGUO418Cac7qxq440KGEQ876o0A3vz8NYT6k7Pmamiej336WcSodXEzRfuq1mz UEVIj29bKeiofmy023bUv7TUAkBz89MCPMH0AnQ7var1lN78mb9vjJDX0mwjZT7UGY NKiTao9u9eW/BmJH5CBAR7Ie32vo6FioBdS87WFk48HwyDQaLzcqjAwjarG2Y85rab ip1i4Jblce63ASYxa3oT5xe0+TEXcaHTFoJN4mV70dw6ftzhxuU1MkV/gtWRAZp8T3 dSRLB6WAz0oMA== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 6627369218; Fri, 9 Jan 2026 16:13:12 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Fri, 9 Jan 2026 16:11:23 -0700 Message-ID: <20260109231151.4056804-15-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260109231151.4056804-1-sjg@u-boot.org> References: <20260109231151.4056804-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: EZZYOZMOZOR6NDBIFA4BWOLBO27E323Z X-Message-ID-Hash: EZZYOZMOZOR6NDBIFA4BWOLBO27E323Z X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , "Claude Opus 4 . 5" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 14/32] boot: pxe: Extract pxe_load_files() from pxe_load_label() List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Separate the file-loading logic (kernel, initrd) from pxe_load_label() into a new pxe_load_files() function. This stores the loaded addresses and sizes directly in the pxe_context. The pxe_load_label() function now calls pxe_load_files() and handles the remaining setup: FDT processing, string formatting and storing metadata in the context. Co-developed-by: Claude Opus 4.5 Signed-off-by: Simon Glass --- boot/pxe_utils.c | 88 +++++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 42 deletions(-) diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index 410f2d1eafe..55b738e5c45 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -679,31 +679,10 @@ static int generate_localboot(struct pxe_label *label) return 0; } -int pxe_load_label(struct pxe_context *ctx, struct pxe_label *label) +static int pxe_load_files(struct pxe_context *ctx, struct pxe_label *label) { - char fit_addr[200]; - const char *conf_fdt_str; - ulong kern_addr = 0; - ulong initrd_addr = 0; - ulong initrd_size = 0; - ulong kern_size; - ulong conf_fdt = 0; - char initrd_str[28] = ""; int ret; - if (label->localboot) { - if (label->localboot_val >= 0) { - if (IS_ENABLED(CONFIG_BOOTMETH_EXTLINUX_LOCALBOOT)) { - ret = generate_localboot(label); - if (ret) - return ret; - } - } - /* negative localboot_val means skip loading */ - if (!label->kernel) - return 0; - } - if (!label->kernel) { printf("No kernel given, skipping %s\n", label->name); return -ENOENT; @@ -711,34 +690,64 @@ int pxe_load_label(struct pxe_context *ctx, struct pxe_label *label) if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r", SZ_2M, (enum bootflow_img_t)IH_TYPE_KERNEL, - &kern_addr, &kern_size) < 0) { + &ctx->kern_addr, &ctx->kern_size) < 0) { printf("Skipping %s for failure retrieving kernel\n", label->name); return -EIO; } - /* for FIT, append the configuration identifier */ - snprintf(fit_addr, sizeof(fit_addr), "%lx%s", kern_addr, - label->config ? label->config : ""); - /* For FIT, the label can be identical to kernel one */ if (label->initrd && !strcmp(label->kernel_label, label->initrd)) { - initrd_addr = kern_addr; + ctx->initrd_addr = ctx->kern_addr; } else if (label->initrd) { - ulong size; - ret = get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r", SZ_2M, (enum bootflow_img_t)IH_TYPE_RAMDISK, - &initrd_addr, &size); + &ctx->initrd_addr, &ctx->initrd_size); if (ret < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return -EIO; } - initrd_size = size; + } + + return 0; +} + +int pxe_load_label(struct pxe_context *ctx, struct pxe_label *label) +{ + char fit_addr[200]; + const char *conf_fdt_str; + ulong conf_fdt = 0; + char initrd_str[28] = ""; + int ret; + + if (label->localboot) { + if (label->localboot_val >= 0) { + if (IS_ENABLED(CONFIG_BOOTMETH_EXTLINUX_LOCALBOOT)) { + ret = generate_localboot(label); + if (ret) + return ret; + } + } + /* negative localboot_val means skip loading */ + if (!label->kernel) + return 0; + } + + ret = pxe_load_files(ctx, label); + if (ret) + return ret; + + /* for FIT, append the configuration identifier */ + snprintf(fit_addr, sizeof(fit_addr), "%lx%s", ctx->kern_addr, + label->config ? label->config : ""); + + if (ctx->initrd_addr && ctx->initrd_size) { + int size; + size = snprintf(initrd_str, sizeof(initrd_str), "%lx:%lx", - initrd_addr, size); + ctx->initrd_addr, ctx->initrd_size); if (size >= sizeof(initrd_str)) return -ENOSPC; } @@ -749,7 +758,7 @@ int pxe_load_label(struct pxe_context *ctx, struct pxe_label *label) return ret; if (!conf_fdt_str) - conf_fdt_str = pxe_get_fdt_fallback(label, kern_addr); + conf_fdt_str = pxe_get_fdt_fallback(label, ctx->kern_addr); if (conf_fdt_str) conf_fdt = hextoul(conf_fdt_str, NULL); log_debug("conf_fdt %lx\n", conf_fdt); @@ -760,25 +769,20 @@ int pxe_load_label(struct pxe_context *ctx, struct pxe_label *label) /* Save the loaded info to context */ ctx->label = label; ctx->kern_addr_str = strdup(fit_addr); - ctx->kern_addr = kern_addr; - ctx->kern_size = kern_size; - if (initrd_addr) { - ctx->initrd_addr = initrd_addr; - ctx->initrd_size = initrd_size; + if (ctx->initrd_addr) ctx->initrd_str = strdup(initrd_str); - } ctx->conf_fdt_str = strdup(conf_fdt_str); ctx->conf_fdt = conf_fdt; log_debug("Loaded label '%s':\n", label->name); log_debug("- kern_addr_str '%s' conf_fdt_str '%s' conf_fdt %lx\n", ctx->kern_addr_str, ctx->conf_fdt_str, conf_fdt); - if (initrd_addr) { + if (ctx->initrd_addr) { log_debug("- initrd addr %lx filesize %lx str '%s'\n", ctx->initrd_addr, ctx->initrd_size, ctx->initrd_str); } if (!ctx->kern_addr_str || (conf_fdt_str && !ctx->conf_fdt_str) || - (initrd_addr && !ctx->initrd_str)) { + (ctx->initrd_addr && !ctx->initrd_str)) { printf("malloc fail (saving label)\n"); return -ENOMEM; }