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