arm64: Fix initrd requierements
Subsystems (2)
PATCH 1/1 arm64: Fix initrd requierements
The initrd doesn't need to be aligend to 1 GB, which breaks kexec for system with RAM <= 1 GB. Instead the memory size between the kernel start rounded down to 1 GB and the end of the initrd rounded up to 1 GB can't be bigger then 32 GB.
Signed-off-by Matthias Brugger <[email protected]>
--- kexec/arch/arm64/kexec-arm64.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
kexec/arch/arm64/kexec-arm64.c +12 -11
@@ -327,6 +327,7 @@ int arm64_load_other_segments(struct kexec_info *info,unsigned long dtb_base;unsigned long hole_min;unsigned long hole_max; +unsigned long initrd_end;char *initrd_buf =NULL ;struct dtb dtb;char command_line[COMMAND_LINE_SIZE ] ="" ;
@@ -366,27 +367,27 @@ int arm64_load_other_segments(struct kexec_info *info,if (!initrd_buf)fprintf (stderr,"kexec: Empty ramdisk file.\n" );else { -/* -* Put the initrd after the kernel. As specified in -* booting.txt, align to 1 GiB. -*/ +/* Put the initrd after the kernel. */ initrd_base =add_buffer_phys_virt (info, initrd_buf, - initrd_size, initrd_size,GiB (1 ), + initrd_size, initrd_size,0 , hole_min, hole_max,1 ,0 ); -/* initrd_base is valid if we got here. */ - -dbgprintf ("initrd: base %lx, size %lxh (%ld)\n" , - initrd_base, initrd_size, initrd_size); + initrd_end = initrd_base + initrd_size; -/* Check size limit as specified in booting.txt. */ +/* Check limits as specified in booting.txt. +* The kernel may have as little as 32 GB of address space to map +* system memory and both kernel and initrd must be 1GB aligend. +*/ -if (initrd_base - image_base + initrd_size >GiB (32 )) { +if (_ALIGN_UP (initrd_end,GiB (1 )) -_ALIGN_DOWN (image_base,GiB (1 )) >GiB (32 )) {fprintf (stderr,"kexec: Error: image + initrd too big.\n" );return -EFAILED ; } +dbgprintf ("initrd: base %lx, size %lxh (%ld)\n" , + initrd_base, initrd_size, initrd_size); + result =dtb_set_initrd ((char **)&dtb.buf, &dtb.size, initrd_base, initrd_base + initrd_size);
Signature · 7 lines
2.6.6 _______________________________________________ kexec mailing list [email protected] http://lists.infradead.org/mailman/listinfo/kexec
Simon Horman
AppliedQuoted 5 lines · Matthias Brugger
The initrd doesn't need to be aligend to 1 GB, which breaks kexec for system with RAM <= 1 GB. Instead the memory size between the kernel start rounded down to 1 GB and the end of the initrd rounded up to 1 GB can't be bigger then 32 GB.
Signed-off-by Matthias Brugger <[email protected]>
Thanks, applied.
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec