of/kexec: Fix reading 32-bit "linux,initrd-{start,end}" values
Rob Herring
maintainerPATCH 1/1 of/kexec: Fix reading 32-bit "linux,initrd-{start,end}" values
"linux,initrd-start" and "linux,initrd-end" can be 32-bit values even on a 64-bit platform. Ideally, the size should be based on '#address-cells', but that has never been enforced in the kernel's FDT boot parsing code (early_init_dt_check_for_initrd()). Bootloader behavior is known to vary. For example, kexec always writes these as 64-bit.
Use of_read_number() to mirror the early_init_dt_check_for_initrd() code.
Reported-by Peter Maydell <[email protected]>
Signed-off-by Rob Herring <[email protected]>
--- drivers/of/kexec.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/of/kexec.c +5 -5
@@ -281,7 +281,7 @@ void *of_kexec_alloc_and_setup_fdt(const struct kimage *image, const char *cmdline, size_t extra_fdt_size) { void *fdt; -int ret, chosen_node; +int ret, chosen_node, len;const void *prop;size_t fdt_size;
@@ -324,19 +324,19 @@ void *of_kexec_alloc_and_setup_fdt(const struct kimage *image, goto out;/* Did we boot using an initrd? */ - prop =fdt_getprop (fdt, chosen_node,"linux,initrd-start" ,NULL ); + prop =fdt_getprop (fdt, chosen_node,"linux,initrd-start" , &len);if (prop) {u64 tmp_start, tmp_end, tmp_size; - tmp_start =fdt64_to_cpu (*((const fdt64_t *) prop)); + tmp_start =of_read_number (prop, len /4 ); - prop =fdt_getprop (fdt, chosen_node,"linux,initrd-end" ,NULL ); + prop =fdt_getprop (fdt, chosen_node,"linux,initrd-end" , &len);if (!prop) { ret = -EINVAL ; goto out; } - tmp_end =fdt64_to_cpu (*((const fdt64_t *) prop)); + tmp_end =of_read_number (prop, len /4 );/* * kexec reserves exact initrd size, while firmware may
Signature · 1 line
2.35.1