Hi Andreas,

I'm glad to see improvements to kexec-tools on arm.

For context, I recently posted "arm: use the zImage tag's real TEXT_OFFSET for kernel placement"[0] to add support for text_offset.

I hadn't seen your v1 at the time, and will happily rebase my patch after your patch is merged. (Or, feel free to add support for text_offset, instead.)

I'll leave some comments, since I have a tiny bit of state on this code.

On 9/12/26 20:35, Andreas Kemnade wrote:
@@ -663,18 +665,21 @@ int zImage_arm_load(int argc, char **argv, const char 
*buf, off_t len,
/*
         * The zImage length does not include its stack (4k) or its
-        * malloc space (64k).  Include this.
+        * malloc space (128k).  Include this.

This line no longer adds the malloc space (and nor is it necessarily 128k), so maybe remove the mention of malloc space in this comment.

         */
-       len += 0x11000;
+       len += 0x1000;
- dbgprintf("zImage requires 0x%08llx bytes\n", (unsigned long long)len); if (tag) {
                uint32_t *p = (void *)buf + 
le32_to_cpu(tag->u.krnl_size.size_ptr);
                uint32_t edata_size = le32_to_cpu(get_unaligned(p));
                uint32_t bss_size = le32_to_cpu(tag->u.krnl_size.bss_size);
+               uint32_t malloc_size = tag->hdr.size >= 6 ? 
tag->u.krnl_size.malloc_size : 65536;

There is support for big endian arm[1], so use le32_to_cpu to convert, similar to the other fields.

Also, consider replacing "65536" with "0x10000" to be consistent with the else-clause in your patch below.

                uint32_t kernel_size = edata_size + bss_size;
+ len += malloc_size;
+               dbgprintf("malloc size: 0x%lx\n", (unsigned long)malloc_size);
+
                dbgprintf("Decompressed kernel sizes:\n");
                dbgprintf(" text+data 0x%08lx bss 0x%08lx total 0x%08lx\n",
                          (unsigned long)edata_size,
@@ -699,8 +704,13 @@ int zImage_arm_load(int argc, char **argv, const char 
*buf, off_t len,
                                (unsigned long)kernel_size);
                        kexec_arm_image_size = kernel_size;
                }
+       } else {
+               /* add default malloc size */
+               len += 0x10000;

It's a bit awkward that this fallback case is far from the happy-case where the header defines a malloc size.

Consider adding a "if (tag && le32_to_cpu(tag->hdr.size) >= 6)" block before the "if (tag)" block to handle this.

This allows us to remove the two fallback cases (!tag, and tag&&tag->hdr.size >=6), in favour of just one fallback case.

Something like:

```
if (tag && le32_to_cpu(tag->hdr.size) >= 6)
        len += le32_to_cpu(tag->u.krnl_size.malloc_size);
else
        len += 0x10000;

if (tag) {
[...]
```

Regards,
Tom Fitzhenry

0. https://lists.infradead.org/pipermail/kexec/2026-August/038363.html
1. https://github.com/torvalds/linux/blob/704340f1cd0dcef829eb62f5b48ae95a2ce17bdf/arch/arm/mm/Kconfig#L780


Reply via email to