From 42a4f1c69dab20e93f48fa4f3db1810af00f684e Mon Sep 17 00:00:00 2001 From: kszaq Date: Thu, 2 May 2019 10:44:57 +0200 Subject: [PATCH 1/4] 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 bfabdce7d5..81c286c9d7 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 \ From 33e4a6a6df8f5a83e4aea389d6716744aa332cbe Mon Sep 17 00:00:00 2001 From: kszaq Date: Fri, 3 May 2019 20:54:28 +0200 Subject: [PATCH 2/4] linux: abort building arm64 uImage if KERNEL_UIMAGE_LOADADDR or KERNEL_UIMAGE_ENTRYADDR is not set If either of these values is not set, resulting uImage will not load properly. Abort if these are not set. --- packages/linux/package.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 81c286c9d7..b2acf2d3c3 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -212,6 +212,9 @@ make_target() { # arm64 target does not support creating uImage. # Build Image first, then wrap it using u-boot's mkimage. if [[ "$TARGET_KERNEL_ARCH" == "arm64" && "$KERNEL_TARGET" == uImage* ]]; then + if [ -z "$KERNEL_UIMAGE_LOADADDR" -o -z "$KERNEL_UIMAGE_ENTRYADDR" ]; then + die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" + fi KERNEL_UIMAGE_TARGET="$KERNEL_TARGET" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi From a87ec6817b4375ab22b08615f644a98700ef405b Mon Sep 17 00:00:00 2001 From: kszaq Date: Fri, 3 May 2019 23:51:27 +0200 Subject: [PATCH 3/4] linux: use PKG_UIMAGE_*ADDR for the used address If a package is sources multiple times, the destination address may be recalculated and overwritten a few times. Prevent this by using PKG-prefixed variables for results. Thanks to MilhouseVH for suggesting this. --- packages/linux/package.mk | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index b2acf2d3c3..065324499f 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -255,16 +255,19 @@ make_target() { 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 ))") + PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_LOADADDR + $COMPRESSED_SIZE ))") + PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$(( $KERNEL_UIMAGE_ENTRYADDR + $COMPRESSED_SIZE ))") + else + PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} + PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A $TARGET_KERNEL_ARCH \ -O linux \ -T kernel \ -C $KERNEL_UIMAGE_COMP \ - -a $KERNEL_UIMAGE_LOADADDR \ - -e $KERNEL_UIMAGE_ENTRYADDR \ + -a $PKG_KERNEL_UIMAGE_LOADADDR \ + -e $PKG_KERNEL_UIMAGE_ENTRYADDR \ -d arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET \ arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_UIMAGE_TARGET fi From 502e4de5b5291e90ae6f8cc09ce41133c4c443d3 Mon Sep 17 00:00:00 2001 From: kszaq Date: Sat, 4 May 2019 01:45:52 +0200 Subject: [PATCH 4/4] linux: restore original KERNEL_TARGET after creating uImage --- packages/linux/package.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index 065324499f..f2fef3ba2f 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -270,6 +270,8 @@ make_target() { -e $PKG_KERNEL_UIMAGE_ENTRYADDR \ -d arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET \ arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_UIMAGE_TARGET + + KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi }