Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2195331/?format=api
{ "id": 2195331, "url": "http://patchwork.ozlabs.org/api/patches/2195331/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/patch/20260210185455.2409242-1-james.hilliard1@gmail.com/", "project": { "id": 18, "url": "http://patchwork.ozlabs.org/api/projects/18/?format=api", "name": "U-Boot", "link_name": "uboot", "list_id": "u-boot.lists.denx.de", "list_email": "u-boot@lists.denx.de", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260210185455.2409242-1-james.hilliard1@gmail.com>", "list_archive_url": null, "date": "2026-02-10T18:54:54", "name": "[v2,1/1] image: fit: Apply overlays using aligned writable FDT copies", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "0fd3dc64a271221f1acc4e5ca7347569da38ac29", "submitter": { "id": 66301, "url": "http://patchwork.ozlabs.org/api/people/66301/?format=api", "name": "James Hilliard", "email": "james.hilliard1@gmail.com" }, "delegate": { "id": 3651, "url": "http://patchwork.ozlabs.org/api/users/3651/?format=api", "username": "trini", "first_name": "Tom", "last_name": "Rini", "email": "trini@ti.com" }, "mbox": "http://patchwork.ozlabs.org/project/uboot/patch/20260210185455.2409242-1-james.hilliard1@gmail.com/mbox/", "series": [ { "id": 491730, "url": "http://patchwork.ozlabs.org/api/series/491730/?format=api", "web_url": "http://patchwork.ozlabs.org/project/uboot/list/?series=491730", "date": "2026-02-10T18:54:54", "name": "[v2,1/1] image: fit: Apply overlays using aligned writable FDT copies", "version": 2, "mbox": "http://patchwork.ozlabs.org/series/491730/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2195331/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2195331/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<u-boot-bounces@lists.denx.de>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20230601 header.b=TOM8E9wZ;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de", "phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.b=\"TOM8E9wZ\";\n\tdkim-atps=neutral", "phobos.denx.de;\n dmarc=pass (p=none dis=none) header.from=gmail.com", "phobos.denx.de;\n spf=pass smtp.mailfrom=james.hilliard1@gmail.com" ], "Received": [ "from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4f9W9M1831z1xwG\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 11 Feb 2026 06:00:38 +1100 (AEDT)", "from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 3A63A8367F;\n\tTue, 10 Feb 2026 20:00:30 +0100 (CET)", "by phobos.denx.de (Postfix, from userid 109)\n id B518D8388D; Tue, 10 Feb 2026 19:55:06 +0100 (CET)", "from mail-ot1-x32e.google.com (mail-ot1-x32e.google.com\n [IPv6:2607:f8b0:4864:20::32e])\n (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 6B6CF8366F\n for <u-boot@lists.denx.de>; Tue, 10 Feb 2026 19:55:04 +0100 (CET)", "by mail-ot1-x32e.google.com with SMTP id\n 46e09a7af769-7d1866473b0so3442292a34.1\n for <u-boot@lists.denx.de>; Tue, 10 Feb 2026 10:55:04 -0800 (PST)", "from james-x399.localdomain (71-218-105-26.hlrn.qwest.net.\n [71.218.105.26]) by smtp.gmail.com with ESMTPSA id\n 46e09a7af769-7d46479964fsm10194046a34.22.2026.02.10.10.55.02\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 10 Feb 2026 10:55:02 -0800 (PST)" ], "X-Spam-Checker-Version": "SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de", "X-Spam-Level": "", "X-Spam-Status": "No, score=-0.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_GMAIL_RCVD,\n FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_BLOCKED,\n SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20230601; t=1770749703; x=1771354503; darn=lists.denx.de;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=xXes4qrXHroI/2gAt1p+W1wSHvU9FM/IraXzq7dSC7g=;\n b=TOM8E9wZwV3xtMbk08M8Q6DwiA1uXH3GXkVyT3A+dZEuwEBJLjlpQArJ5HLtCwRG56\n WcjJdiBDoo7gayCaJfAKCOti5t3UcKcMcM7IAjtF0/MytfSSDLxxKoqdzcWpdlHdv6S5\n b3yxFJjT3Nd5TxLTJN9U/IBDz/0IiXjGIPq9O7gcFMKP9GP8oOPB1DDuj3X8cer7+s0d\n szQm53743B6jSIXnFkLQGIXn2KtHI09zVLQN5gZooNBVWteENX6halc269Ll8b69DbOe\n 7HMscQiRSspjv+39XbV3ktmunY/4wUVJ6ySt01Nz653u56UabbcfQDYibFiS7KcsQCsq\n eAHg==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1770749703; x=1771354503;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=xXes4qrXHroI/2gAt1p+W1wSHvU9FM/IraXzq7dSC7g=;\n b=LEJkjeqzsspdUqAAAL1jdZmK17EH6ewb//+44quLsuIvLSISRw6wcmBC1pdDn4EtNh\n btzU37Ai3aWBl8UUtJw2D7EGMdxQGAk/GphQGcA37nW+uQtZ7/JdxnIm+JIcTh0Fsvur\n yU4ZMq7rSZqaRSHaI4jBO37L5An5Iduw0rVRLmPVeoP2vJDmYEevHIXuI8ixL11kpTs9\n 2bu/aVC+k2ab+ty2br+L1+6ot/7VwVCnaHqpb/jtkFzzUoUNYaI9aXXk0kPR1FSR4XVQ\n OjhU0JqKRRd6HAydrVr8bhA4nLYywWHS1B0W5JY2UYvi2xpVNB/MERFyrDdKloIAg8g6\n qP0Q==", "X-Gm-Message-State": "AOJu0YyxSDh9Uv/wRPVh8wPl6+zYtN+EFVqIi7EO8zTeYSNzaU8KP9G2\n P9A8K7Gg+3DgXYbCrx3pFlwhzY6NyFH+AULoUdPyXUOw7R2EiyRbxu3gQPr8mQ==", "X-Gm-Gg": "AZuq6aL8pu+ZKIHrxOf2lTzx3zFDddilWMzGRBkrcseiaUvgZVssPm1dd1yBEyCLECa\n rg66s/hff+6KJ5CRf/itZc2/RacDiKtWkFXpOPczqzCHiOygYXvIzXtegCR0tjUvciYdpCwAeLC\n Vt46JwQ9kwOWavpGcZcdaNzeRQHK0Pch9yxJVcm/nCYfM36aZGrRuJ2ylXqjBXV0CM3yEyoZ7UU\n fcDqhixT0T+IEiR/OIte10vr8XAeScKdum8phr5OKTvmOeYXuVHCh5uzht72eH0TJEreS6tEfiI\n BI6B8Jz7b76cDWlB8tSoBTW9thEmug0U1tdablBAr5eKcOX52bcqHokX6/myWrxNpUniVUmDS57\n gV/5G4zZilxqhSRxNdN+jk+o8L2cCJFIiQLwMnXWHh1GiF0rOUV6CRugEwFxg85qt2D4Rawg9+v\n gQdIhm0SD7gK8vxS/SrCb7CfZQAbBy7ZWNQlpg9ok82hZ3gFgMdLSQlwkVxP8t5SptPJQ1zw0eU\n foMAV06VPFFezn6Txul/Fa03SS1zl4FKUOeGn81LHoRyTwoGl9ceDaTHr7awWo=", "X-Received": "by 2002:a05:6830:2b21:b0:7ce:2b15:de88 with SMTP id\n 46e09a7af769-7d4998bba07mr1586750a34.26.1770749702794;\n Tue, 10 Feb 2026 10:55:02 -0800 (PST)", "From": "James Hilliard <james.hilliard1@gmail.com>", "To": "u-boot@lists.denx.de", "Cc": "James Hilliard <james.hilliard1@gmail.com>, Tom Rini <trini@konsulko.com>,\n Marek Vasut <marek.vasut+renesas@mailbox.org>,\n Quentin Schulz <quentin.schulz@cherry.de>", "Subject": "[PATCH v2 1/1] image: fit: Apply overlays using aligned writable FDT\n copies", "Date": "Tue, 10 Feb 2026 11:54:54 -0700", "Message-ID": "<20260210185455.2409242-1-james.hilliard1@gmail.com>", "X-Mailer": "git-send-email 2.43.0", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-Mailman-Approved-At": "Tue, 10 Feb 2026 20:00:28 +0100", "X-BeenThere": "u-boot@lists.denx.de", "X-Mailman-Version": "2.1.39", "Precedence": "list", "List-Id": "U-Boot discussion <u-boot.lists.denx.de>", "List-Unsubscribe": "<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>", "List-Archive": "<https://lists.denx.de/pipermail/u-boot/>", "List-Post": "<mailto:u-boot@lists.denx.de>", "List-Help": "<mailto:u-boot-request@lists.denx.de?subject=help>", "List-Subscribe": "<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>", "Errors-To": "u-boot-bounces@lists.denx.de", "Sender": "\"U-Boot\" <u-boot-bounces@lists.denx.de>", "X-Virus-Scanned": "clamav-milter 0.103.8 at phobos.denx.de", "X-Virus-Status": "Clean" }, "content": "libfdt expects FDT/DTO blobs to be 8-byte aligned. When loading the\nbase FDT or overlays from a FIT, the mapped buffer may be unaligned,\nwhich can break fdt_open_into() on strict-alignment architectures.\n\nboot_get_fdt_fit() relocates the base FDT with boot_relocate_fdt()\nbefore applying overlays. That uses the bootm memory map and can\noverlap with the FIT buffer when the FIT is loaded into RAM,\ncorrupting data needed to load the kernel and ramdisk.\n\nAllocate writable, 8-byte aligned copies of the base FDT and overlays\nwith memalign() and fdt_open_into(). Grow the base buffer as needed,\napply overlays to it and pack the final tree. Free each temporary\noverlay copy after application and check fdt_pack() errors.\n\nFixes: 8fbcc0e0e839 (\"boot: Assure FDT is always 8-byte aligned\")\nFixes: 881f0b77dc8c (\"image: apply FDTOs on FDT image node\")\nSigned-off-by: James Hilliard <james.hilliard1@gmail.com>\n---\nChanges v1 -> v2:\n - also fix alignment issues\n---\n boot/image-fit.c | 158 +++++++++++++++++++++++++++++++++++------------\n 1 file changed, 118 insertions(+), 40 deletions(-)", "diff": "diff --git a/boot/image-fit.c b/boot/image-fit.c\nindex 41ab1f552b0..68fb75c8389 100644\n--- a/boot/image-fit.c\n+++ b/boot/image-fit.c\n@@ -2344,6 +2344,52 @@ int boot_get_setup_fit(struct bootm_headers *images, uint8_t arch,\n }\n \n #ifndef USE_HOSTCC\n+#ifdef CONFIG_OF_LIBFDT_OVERLAY\n+static int boot_get_fdt_fit_into_buffer(const void *src, ulong srclen,\n+\t\t\t\t\tulong extra, ulong min_dstlen,\n+\t\t\t\t\tvoid **fdtdstbuf, ulong *fdtdstlenp)\n+{\n+\tconst void *fdtsrcbuf;\n+\tvoid *tmp = NULL;\n+\tulong fdtdstlen;\n+\tint err;\n+\n+\t/* Make sure the source FDT/DTO is 8-byte aligned for libfdt. */\n+\tfdtsrcbuf = src;\n+\tif (!IS_ALIGNED((uintptr_t)src, 8)) {\n+\t\ttmp = memalign(8, srclen);\n+\t\tif (!tmp)\n+\t\t\treturn -ENOMEM;\n+\n+\t\tmemcpy(tmp, src, srclen);\n+\t\tfdtsrcbuf = tmp;\n+\t}\n+\n+\tfdtdstlen = ALIGN(fdt_totalsize(fdtsrcbuf) + extra, SZ_4K);\n+\tmin_dstlen = ALIGN(min_dstlen, SZ_4K);\n+\tif (fdtdstlen < min_dstlen)\n+\t\tfdtdstlen = min_dstlen;\n+\n+\t*fdtdstbuf = memalign(8, fdtdstlen);\n+\tif (!*fdtdstbuf) {\n+\t\tfree(tmp);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\terr = fdt_open_into(fdtsrcbuf, *fdtdstbuf, fdtdstlen);\n+\tfree(tmp);\n+\tif (err < 0) {\n+\t\tfree(*fdtdstbuf);\n+\t\t*fdtdstbuf = NULL;\n+\t\treturn err;\n+\t}\n+\n+\t*fdtdstlenp = fdtdstlen;\n+\n+\treturn 0;\n+}\n+#endif\n+\n int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,\n \t\t const char **fit_unamep, const char **fit_uname_configp,\n \t\t int arch, ulong *datap, ulong *lenp)\n@@ -2356,18 +2402,12 @@ int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,\n \tchar *next_config = NULL;\n \tulong load, len;\n #ifdef CONFIG_OF_LIBFDT_OVERLAY\n-\tulong ovload, ovlen, ovcopylen;\n+\tulong ovload, ovlen, ovcopylen, need;\n \tconst char *uconfig;\n \tconst char *uname;\n-\t/*\n-\t * of_flat_tree is storing the void * returned by map_sysmem, then its\n-\t * address is passed to boot_relocate_fdt which expects a char ** and it\n-\t * is then cast into a ulong. Setting its type to void * would require\n-\t * to cast its address to char ** when passing it to boot_relocate_fdt.\n-\t * Instead, let's be lazy and use void *.\n-\t */\n-\tchar *of_flat_tree;\n-\tvoid *base, *ov, *ovcopy = NULL;\n+\tvoid *ovcopy = NULL;\n+\tvoid *base_buf = NULL;\n+\tulong base_buf_size = 0;\n \tint i, err, noffset, ov_noffset;\n #endif\n \n@@ -2410,18 +2450,27 @@ int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,\n \t/* we need to apply overlays */\n \n #ifdef CONFIG_OF_LIBFDT_OVERLAY\n-\t/* Relocate FDT so resizing does not overwrite other data in FIT. */\n-\tof_flat_tree = map_sysmem(load, len);\n-\tlen = ALIGN(fdt_totalsize(load), SZ_4K);\n-\terr = boot_relocate_fdt(&of_flat_tree, &len);\n-\tif (err) {\n-\t\tprintf(\"Required FDT relocation for applying DTOs failed: %d\\n\",\n-\t\t err);\n-\t\tfdt_noffset = -EBADF;\n+\t/*\n+\t * Make a writable copy of the base FDT for applying overlays.\n+\t *\n+\t * Do not use boot_relocate_fdt() here: it allocates from the bootm map and\n+\t * may overlap with the FIT buffer (still needed to load the kernel /\n+\t * ramdisk) when the FIT is loaded into RAM.\n+\t */\n+\terr = boot_get_fdt_fit_into_buffer(map_sysmem(load, len), len,\n+\t\t\t\t\t CONFIG_SYS_FDT_PAD, 0, &base_buf,\n+\t\t\t\t\t &base_buf_size);\n+\tif (err < 0) {\n+\t\tif (err == -ENOMEM)\n+\t\t\tprintf(\"Required FDT copy for applying DTOs failed: out of memory\\n\");\n+\t\telse\n+\t\t\tprintf(\"Required FDT copy for applying DTOs failed: %s\\n\",\n+\t\t\t fdt_strerror(err));\n+\t\tfdt_noffset = err;\n \t\tgoto out;\n \t}\n \n-\tload = (ulong)of_flat_tree;\n+\tlen = fdt_off_dt_strings(base_buf) + fdt_size_dt_strings(base_buf);\n \n \t/* apply extra configs in FIT first, followed by args */\n \tfor (i = 1; ; i++) {\n@@ -2465,46 +2514,73 @@ int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,\n \t\t}\n \t\tdebug(\"%s loaded at 0x%08lx len=0x%08lx\\n\",\n \t\t\t\tuname, ovload, ovlen);\n-\t\tov = map_sysmem(ovload, ovlen);\n-\n-\t\tovcopylen = ALIGN(fdt_totalsize(ov), SZ_4K);\n-\t\tovcopy = malloc(ovcopylen);\n-\t\tif (!ovcopy) {\n-\t\t\tprintf(\"failed to duplicate DTO before application\\n\");\n-\t\t\tfdt_noffset = -ENOMEM;\n-\t\t\tgoto out;\n-\t\t}\n-\n-\t\terr = fdt_open_into(ov, ovcopy, ovcopylen);\n+\t\terr = boot_get_fdt_fit_into_buffer(map_sysmem(ovload, ovlen),\n+\t\t\t\t\t\t ovlen, 0, 0, &ovcopy,\n+\t\t\t\t\t\t &ovcopylen);\n \t\tif (err < 0) {\n-\t\t\tprintf(\"failed on fdt_open_into for DTO\\n\");\n+\t\t\tif (err == -ENOMEM)\n+\t\t\t\tprintf(\"failed to duplicate DTO before application\\n\");\n+\t\t\telse\n+\t\t\t\tprintf(\"failed on fdt_open_into for DTO: %s\\n\",\n+\t\t\t\t fdt_strerror(err));\n \t\t\tfdt_noffset = err;\n \t\t\tgoto out;\n \t\t}\n \n-\t\tbase = map_sysmem(load, len + ovlen);\n-\t\terr = fdt_open_into(base, base, len + ovlen);\n-\t\tif (err < 0) {\n-\t\t\tprintf(\"failed on fdt_open_into\\n\");\n-\t\t\tfdt_noffset = err;\n-\t\t\tgoto out;\n+\t\t/*\n+\t\t * Ensure the base FDT buffer is open and has enough room for\n+\t\t * the overlay. Grow it on demand.\n+\t\t */\n+\t\tneed = ALIGN(len + ovcopylen + CONFIG_SYS_FDT_PAD, SZ_4K);\n+\t\tif (need > base_buf_size) {\n+\t\t\tvoid *new_base;\n+\t\t\tulong new_size;\n+\n+\t\t\terr = boot_get_fdt_fit_into_buffer(base_buf, base_buf_size,\n+\t\t\t\t\t\t\t 0, need, &new_base,\n+\t\t\t\t\t\t\t &new_size);\n+\t\t\tif (err < 0) {\n+\t\t\t\tif (err == -ENOMEM)\n+\t\t\t\t\tprintf(\"failed to expand FDT for DTO application\\n\");\n+\t\t\t\telse\n+\t\t\t\t\tprintf(\"failed on fdt_open_into while expanding FDT\\n\");\n+\t\t\t\tfdt_noffset = err;\n+\t\t\t\tgoto out;\n+\t\t\t}\n+\n+\t\t\tfree(base_buf);\n+\t\t\tbase_buf = new_base;\n+\t\t\tbase_buf_size = new_size;\n \t\t}\n \n \t\t/* the verbose method prints out messages on error */\n-\t\terr = fdt_overlay_apply_verbose(base, ovcopy);\n+\t\terr = fdt_overlay_apply_verbose(base_buf, ovcopy);\n \t\tif (err < 0) {\n \t\t\tfdt_noffset = err;\n \t\t\tgoto out;\n \t\t}\n-\t\tfdt_pack(base);\n-\t\tlen = fdt_totalsize(base);\n+\t\tlen = fdt_off_dt_strings(base_buf) + fdt_size_dt_strings(base_buf);\n+\n+\t\tfree(ovcopy);\n+\t\tovcopy = NULL;\n+\t}\n+\n+\terr = fdt_pack(base_buf);\n+\tif (err < 0) {\n+\t\tfdt_noffset = err;\n+\t\tgoto out;\n \t}\n+\tlen = fdt_totalsize(base_buf);\n #else\n \tprintf(\"config with overlays but CONFIG_OF_LIBFDT_OVERLAY not set\\n\");\n \tfdt_noffset = -EBADF;\n #endif\n \n out:\n+#ifdef CONFIG_OF_LIBFDT_OVERLAY\n+\tif (fdt_noffset >= 0 && base_buf)\n+\t\tload = map_to_sysmem(base_buf);\n+#endif\n \tif (datap)\n \t\t*datap = load;\n \tif (lenp)\n@@ -2515,6 +2591,8 @@ out:\n \t\t*fit_uname_configp = fit_uname_config;\n \n #ifdef CONFIG_OF_LIBFDT_OVERLAY\n+\tif (fdt_noffset < 0)\n+\t\tfree(base_buf);\n \tfree(ovcopy);\n #endif\n \tfree(fit_uname_config_copy);\n", "prefixes": [ "v2", "1/1" ] }