diff --git a/device/main/linux-postmarketos-mainline/0001-WIP-arch-powerpc-boot-Support-LLVM-1-in-wrapper-scri.patch b/device/main/linux-postmarketos-mainline/0001-WIP-arch-powerpc-boot-Support-LLVM-1-in-wrapper-scri.patch new file mode 100644 index 000000000..5146e18fd --- /dev/null +++ b/device/main/linux-postmarketos-mainline/0001-WIP-arch-powerpc-boot-Support-LLVM-1-in-wrapper-scri.patch @@ -0,0 +1,229 @@ +From 1036fc931dcd28ea093949a07873545665b0c520 Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Fri, 21 Jan 2022 11:53:52 -0700 +Subject: [PATCH 1/3] WIP: arch/powerpc/boot: Support LLVM=1 in wrapper script + +When LLVM=1 is set, pass through the make variables, as they will +generally be multi-targeted. + +Signed-off-by: Nathan Chancellor +--- + arch/powerpc/boot/Makefile | 11 +++++- + arch/powerpc/boot/wrapper | 72 +++++++++++++++++++++++++++++--------- + 2 files changed, 66 insertions(+), 17 deletions(-) + +diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile +index f1a4761ebd44..655750126ce9 100644 +--- a/arch/powerpc/boot/Makefile ++++ b/arch/powerpc/boot/Makefile +@@ -264,6 +264,15 @@ CROSSWRAP := -C "$(CROSS_COMPILE)" + endif + endif + ++ifneq ($(LLVM),) ++WRAPTOOLS := --ld $(LD) ++WRAPTOOLS += --nm $(NM) ++WRAPTOOLS += --objcopy $(OBJCOPY) ++WRAPTOOLS += --objdump $(OBJDUMP) ++# No $(STRINGS) ++WRAPTOOLS += --strings llvm-strings ++endif ++ + compressor-$(CONFIG_KERNEL_GZIP) := gz + compressor-$(CONFIG_KERNEL_XZ) := xz + compressor-$(CONFIG_KERNEL_LZMA) := lzma +@@ -272,7 +281,7 @@ compressor-$(CONFIG_KERNEL_LZO) := lzo + # args (to if_changed): 1 = (this rule), 2 = platform, 3 = dts 4=dtb 5=initrd + quiet_cmd_wrap = WRAP $@ + cmd_wrap =$(CONFIG_SHELL) $(wrapper) -Z $(compressor-y) -c -o $@ -p $2 \ +- $(CROSSWRAP) $(if $3, -s $3)$(if $4, -d $4)$(if $5, -i $5) \ ++ $(CROSSWRAP) $(WRAPTOOLS) $(if $3, -s $3)$(if $4, -d $4)$(if $5, -i $5) \ + vmlinux + + image-$(CONFIG_PPC_PSERIES) += zImage.pseries +diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper +index 1efd1206fcab..8dabcf5406b2 100755 +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -167,6 +167,31 @@ while [ "$#" -gt 0 ]; do + compression= + uboot_comp=none + ;; ++ --ld) ++ shift ++ [ "$#" -gt 0 ] || usage ++ ld="$1" ++ ;; ++ --nm) ++ shift ++ [ "$#" -gt 0 ] || usage ++ nm="$1" ++ ;; ++ --objcopy) ++ shift ++ [ "$#" -gt 0 ] || usage ++ objcopy="$1" ++ ;; ++ --objdump) ++ shift ++ [ "$#" -gt 0 ] || usage ++ objdump="$1" ++ ;; ++ --strings) ++ shift ++ [ "$#" -gt 0 ] || usage ++ strings="$1" ++ ;; + -?) + usage + ;; +@@ -178,6 +203,21 @@ while [ "$#" -gt 0 ]; do + shift + done + ++if [ -z "$ld" ]; then ++ ld=${CROSS}ld ++fi ++if [ -z "$nm" ]; then ++ nm=${CROSS}nm ++fi ++if [ -z "$objcopy" ]; then ++ objcopy=${CROSS}objcopy ++fi ++if [ -z "$objdump" ]; then ++ objdump=${CROSS}objdump ++fi ++if [ -z "$strings" ]; then ++ strings=${CROSS}strings ++fi + + if [ -n "$dts" ]; then + if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then +@@ -193,7 +233,7 @@ if [ -z "$kernel" ]; then + kernel=vmlinux + fi + +-LC_ALL=C elfformat="`${CROSS}objdump -p "$kernel" | grep 'file format' | awk '{print $4}'`" ++LC_ALL=C elfformat="`$objdump -p "$kernel" | grep 'file format' | awk '{print $4}'`" + case "$elfformat" in + elf64-powerpcle) format=elf64lppc ;; + elf64-powerpc) format=elf32ppc ;; +@@ -230,7 +270,7 @@ nodl="--no-dynamic-linker" + + # suppress some warnings in recent ld versions + nowarn="-z noexecstack" +-if "${CROSS}ld" -v --no-warn-rwx-segments >/dev/null 2>&1; then ++if $ld -v --no-warn-rwx-segments >/dev/null 2>&1; then + nowarn="$nowarn --no-warn-rwx-segments" + fi + +@@ -369,7 +409,7 @@ epapr) + link_address='0x20000000' + pie=-pie + notext='-z notext' +- rodynamic=$(if ${CROSS}ld -V 2>&1 | grep -q LLD ; then echo "-z rodynamic"; fi) ++ rodynamic=$(if $ld -V 2>&1 | grep -q LLD ; then echo "-z rodynamic"; fi) + ;; + mvme5100) + platformo="$object/fixed-head.o $object/mvme5100.o" +@@ -385,7 +425,7 @@ esac + vmz="$tmpdir/`basename \"$kernel\"`.$ext" + + # Calculate the vmlinux.strip size +-${CROSS}objcopy $objflags "$kernel" "$vmz.$$" ++$objcopy $objflags "$kernel" "$vmz.$$" + strip_size=$(${CONFIG_SHELL} "${srctree}/scripts/file-size.sh" "$vmz.$$") + + if [ -z "$cacheit" -o ! -f "$vmz$compression" -o "$vmz$compression" -ot "$kernel" ]; then +@@ -438,14 +478,14 @@ fi + + # Extract kernel version information, some platforms want to include + # it in the image header +-version=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \ ++version=`$strings "$kernel" | grep '^Linux version [-0-9.]' | \ + head -n1 | cut -d' ' -f3` + if [ -n "$version" ]; then + uboot_version="-n Linux-$version" + fi + + # physical offset of kernel image +-membase=`${CROSS}objdump -p "$kernel" | grep -m 1 LOAD | awk '{print $7}'` ++membase=`$objdump -p "$kernel" | grep -m 1 LOAD | awk '{print $7}'` + + case "$platform" in + uboot) +@@ -460,7 +500,7 @@ uboot) + esac + + addsec() { +- ${CROSS}objcopy $4 $1 \ ++ $objcopy $4 $1 \ + --add-section=$3="$2" \ + --set-section-flags=$3=contents,alloc,load,readonly,data + } +@@ -490,18 +530,18 @@ if [ "$platform" != "miboot" ]; then + text_start="-Ttext $link_address" + fi + #link everything +- ${CROSS}ld -m $format -T $lds $text_start $pie $nodl $nowarn $rodynamic $notext -o "$ofile" $map \ ++ $ld -m $format -T $lds $text_start $pie $nodl $nowarn $rodynamic $notext -o "$ofile" $map \ + $platformo $tmp $object/wrapper.a + rm $tmp + fi + + # Some platforms need the zImage's entry point and base address +-base=0x`${CROSS}nm "$ofile" | grep ' _start$' | cut -d' ' -f1` +-entry=`${CROSS}objdump -f "$ofile" | grep '^start address ' | cut -d' ' -f3` ++base=0x`$nm "$ofile" | grep ' _start$' | cut -d' ' -f1` ++entry=`$objdump -f "$ofile" | grep '^start address ' | cut -d' ' -f3` + + if [ -n "$binary" ]; then + mv "$ofile" "$ofile".elf +- ${CROSS}objcopy -O binary "$ofile".elf "$ofile" ++ $objcopy -O binary "$ofile".elf "$ofile" + fi + + # post-processing needed for some platforms +@@ -510,7 +550,7 @@ pseries|chrp) + $objbin/addnote "$ofile" + ;; + coff) +- ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile" ++ $objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile" + $objbin/hack-coff "$ofile" + ;; + cuboot*) +@@ -538,18 +578,18 @@ ps3) + # copied to offset 0x100. At runtime the bootwrapper program copies + # the data at __system_reset_kernel back to addr 0x100. + +- system_reset_overlay=0x`${CROSS}nm "$ofile" \ ++ system_reset_overlay=0x`$nm "$ofile" \ + | grep ' __system_reset_overlay$' \ + | cut -d' ' -f1` + system_reset_overlay=`printf "%d" $system_reset_overlay` +- system_reset_kernel=0x`${CROSS}nm "$ofile" \ ++ system_reset_kernel=0x`$nm "$ofile" \ + | grep ' __system_reset_kernel$' \ + | cut -d' ' -f1` + system_reset_kernel=`printf "%d" $system_reset_kernel` + overlay_dest="256" + overlay_size="512" + +- ${CROSS}objcopy -O binary "$ofile" "$ofile.bin" ++ $objcopy -O binary "$ofile" "$ofile.bin" + + run_cmd dd if="$ofile.bin" of="$ofile.bin" conv=notrunc \ + skip=$overlay_dest seek=$system_reset_kernel \ +@@ -567,7 +607,7 @@ ps3) + # reached, then enter the system reset vector of the partially decompressed + # image. No warning is issued. + rm -f "$odir"/{otheros,otheros-too-big}.bld +- size=$(${CROSS}nm --no-sort --radix=d "$ofile" | grep -E ' _end$' | cut -d' ' -f1) ++ size=$($nm --no-sort --radix=d "$ofile" | grep -E ' _end$' | cut -d' ' -f1) + bld="otheros.bld" + if [ $size -gt $((0x1000000)) ]; then + bld="otheros-too-big.bld" +-- +2.53.0 + diff --git a/device/main/linux-postmarketos-mainline/0002-WIP-arch-powerpc-boot-Use-z-notext-for-pseries-image.patch b/device/main/linux-postmarketos-mainline/0002-WIP-arch-powerpc-boot-Use-z-notext-for-pseries-image.patch new file mode 100644 index 000000000..b49ea9384 --- /dev/null +++ b/device/main/linux-postmarketos-mainline/0002-WIP-arch-powerpc-boot-Use-z-notext-for-pseries-image.patch @@ -0,0 +1,41 @@ +From b5cf37159427f2589632e30789488e993a725e0c Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Fri, 21 Jan 2022 12:39:58 -0700 +Subject: [PATCH 2/3] WIP: arch/powerpc/boot: Use '-z notext' for pseries image + +Same reason as commit 4c078c86b4a4 ("powerpc/boot/wrapper: Add "-z +notext" flag to disable diagnostic"). + + ld.lld: error: relocation R_PPC64_ADDR64 cannot be used against symbol '_start'; recompile with -fPIC + >>> referenced by crt0.o:(.text+0x8) in archive arch/powerpc/boot/wrapper.a + + ld.lld: error: relocation R_PPC64_ADDR64 cannot be used against symbol '_etext'; recompile with -fPIC + >>> referenced by crt0.o:(.text+0x10) in archive arch/powerpc/boot/wrapper.a + + ld.lld: error: relocation R_PPC64_ADDR64 cannot be used against symbol '__bss_start'; recompile with -fPIC + >>> referenced by crt0.o:(.text+0x18) in archive arch/powerpc/boot/wrapper.a + + ld.lld: error: relocation R_PPC64_ADDR64 cannot be used against symbol '_end'; recompile with -fPIC + >>> referenced by crt0.o:(.text+0x20) in archive arch/powerpc/boot/wrapper.a + make[2]: *** [arch/powerpc/boot/Makefile:400: arch/powerpc/boot/zImage.pseries] Error 1 + +Signed-off-by: Nathan Chancellor +--- + arch/powerpc/boot/wrapper | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper +index 8dabcf5406b2..2a28695d5bd6 100755 +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -302,6 +302,7 @@ pseries) + if [ "$format" != "elf32ppc" ]; then + link_address= + pie=-pie ++ notext='-z notext' + fi + make_space=n + ;; +-- +2.53.0 + diff --git a/device/main/linux-postmarketos-mainline/0003-WIP-arch-powerpc-boot-Add-z-norelro.patch b/device/main/linux-postmarketos-mainline/0003-WIP-arch-powerpc-boot-Add-z-norelro.patch new file mode 100644 index 000000000..e51c3f8e5 --- /dev/null +++ b/device/main/linux-postmarketos-mainline/0003-WIP-arch-powerpc-boot-Add-z-norelro.patch @@ -0,0 +1,38 @@ +From 445dd03e6d4c8ba8bbc0525d82f77ede2f89355e Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Fri, 21 Jan 2022 14:15:08 -0700 +Subject: [PATCH 3/3] WIP: arch/powerpc/boot: Add '-z norelro' + +ld.bfd defaults to '-z norelro', whereas ld.lld defaults to '-z relro', +which results in an error when building cuImages: + + ld.lld: error: section: .dynamic is not contiguous with other relro sections + +Commit a538d184e3f0 ("powerpc/boot: Move the .got section to after the +.dynamic section") previously worked around this in the boot wrapper by +shuffling the sections but other areas of the kernel have just disabled +the relro program header altogether (see commit 3b92fa7485eb ("arm64: +link with -z norelro regardless of CONFIG_RELOCATABLE") and +commit 0cda9bc15dfc ("ARM: 9038/1: Link with '-z norelro'")). + +Signed-off-by: Nathan Chancellor +--- + arch/powerpc/boot/wrapper | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper +index 2a28695d5bd6..1e4f4fbd3948 100755 +--- a/arch/powerpc/boot/wrapper ++++ b/arch/powerpc/boot/wrapper +@@ -531,7 +531,7 @@ if [ "$platform" != "miboot" ]; then + text_start="-Ttext $link_address" + fi + #link everything +- $ld -m $format -T $lds $text_start $pie $nodl $nowarn $rodynamic $notext -o "$ofile" $map \ ++ $ld -m $format -T $lds $text_start $pie $nodl $nowarn $rodynamic $notext -z norelro -o "$ofile" $map \ + $platformo $tmp $object/wrapper.a + rm $tmp + fi +-- +2.53.0 + diff --git a/device/main/linux-postmarketos-mainline/APKBUILD b/device/main/linux-postmarketos-mainline/APKBUILD index 852b3285f..423ebc8fc 100644 --- a/device/main/linux-postmarketos-mainline/APKBUILD +++ b/device/main/linux-postmarketos-mainline/APKBUILD @@ -49,10 +49,18 @@ makedepends=" zstd " -# Source +# powerpc boot wrapper patches: +# Necessary for compilation without cross GCC in PATH, cherry-picked from +# Nathan's fork, he does not have time to upstream them right now but would be +# happy if someone else did: +# https://lore.kernel.org/linuxppc-dev/aXs8sgAcci9FKKpx@luna/ source=" $pkgname-$pkgver.tar.gz::https://git.kernel.org/torvalds/t/linux-${pkgver/_/-}.tar.gz + 0001-WIP-arch-powerpc-boot-Support-LLVM-1-in-wrapper-scri.patch + 0002-WIP-arch-powerpc-boot-Use-z-notext-for-pseries-image.patch + 0003-WIP-arch-powerpc-boot-Add-z-norelro.patch + config-mainline.aarch64 config-mainline.armv7 config-mainline.loongarch64 @@ -109,6 +117,9 @@ package() { sha512sums=" 8f52207ee68fee8880c085db8033367c18cd2c44854add726eb4cdb90ab7502e5394d6c7ccc6896ce589f93ad081af1edc8cc011374cf7f24d37a1ade4e846e8 linux-postmarketos-mainline-7.0_rc3.tar.gz +1f11df2480e9f691573283597160b4c806e492cdca4825f3acb3afb70bde43abfab487bcde1f5553b431a702a0039479d041b0ce7859970e706b5a51d2ad8fb0 0001-WIP-arch-powerpc-boot-Support-LLVM-1-in-wrapper-scri.patch +26521a9c9ea769534095dc4e306babadc8bcbaf03d7faa523c377e41ba0f742ecd0490fa27791d895f729c3ae8845297dca59b4db2475e7f078e689c447430bc 0002-WIP-arch-powerpc-boot-Use-z-notext-for-pseries-image.patch +302c20c85559fc9b3b2420ed25be1bfbb76c87f2a470e4141c32e9542cf1f5c6b3b5a7847231a3eaa0f6bc0e5942d0c1599e807175dcf5e63469704c3d6adde3 0003-WIP-arch-powerpc-boot-Add-z-norelro.patch 395095e082da9a17f18b9d33a0ec9ae649031924aab436f4a8461295bbc926fda85b64e9eb8fc062843f9e76a3ec6536a37a8fe7bf3ecb7454624b4009f6b755 config-mainline.aarch64 39b64f3e78d87d2d5c8cc66a570c92def6ae9c8cac8eb83b8f0791444cfbb2913fd2b6a2095ee0aeaef9d249fd3a9e4c0b2e854b940141c5264b3cb8283dcf55 config-mainline.armv7 c8bb1565ce324c57baebe4f961bd3db0c98f4423ae289cb7a255f827bf3e9685184bf2e40b0134c2f4be83470f2d17df11bce01a8d44bc3c4d186244ffd4e30a config-mainline.loongarch64