From 69f3db483e80169f038704f5bf1ff7b0d622747d Mon Sep 17 00:00:00 2001 From: kszaq Date: Thu, 2 May 2019 10:44:57 +0200 Subject: [PATCH] linux: amend uimage load address for proper decompression When kernel image is compressed, it is first loaded to RAM at load address specified in command line, then unpacks to loadaddr provided by uImage. For decompressed image not to overwrite compressed data, uncompressed image load address needs to be shifted by compressed image size + 1 MiB alignment. --- packages/linux/package.mk | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 9d225b78c4..18db63534e 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -243,8 +243,19 @@ make_target() { fi if [ -n "$KERNEL_UIMAGE_TARGET" ] ; then + # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_COMP:-none} + + # calculate new load address to make kernel Image unpack to memory area after compressed image + if [ "$KERNEL_UIMAGE_COMP" != "none" ] ; then + COMPRESSED_SIZE=$(stat -t "arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET" | awk '{print $2}') + # align to 1 MiB + COMPRESSED_SIZE=$(( (($COMPRESSED_SIZE - 1 >> 20) + 1) << 20 )) + KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_LOADADDR + $COMPRESSED_SIZE ))") + KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_ENTRYADDR + $COMPRESSED_SIZE ))") + fi + mkimage -A $TARGET_KERNEL_ARCH \ -O linux \ -T kernel \