diff --git a/build-llvm.py b/build-llvm.py index be6fba60..ec133268 100755 --- a/build-llvm.py +++ b/build-llvm.py @@ -17,7 +17,7 @@ GOOD_REVISION = 'a828cda9c80282a77b579f8fc9dc17a310173af4' # The version of the Linux kernel that the script downloads if necessary -DEFAULT_KERNEL_FOR_PGO = (6, 7, 0) +DEFAULT_KERNEL_FOR_PGO = (6, 8, 0) parser = ArgumentParser(formatter_class=RawTextHelpFormatter) clone_options = parser.add_mutually_exclusive_group() diff --git a/src/35f20786c481d5ced9283ff42de5c69b65e5ed13.patch b/src/35f20786c481d5ced9283ff42de5c69b65e5ed13.patch new file mode 100644 index 00000000..389ee9aa --- /dev/null +++ b/src/35f20786c481d5ced9283ff42de5c69b65e5ed13.patch @@ -0,0 +1,45 @@ +From 35f20786c481d5ced9283ff42de5c69b65e5ed13 Mon Sep 17 00:00:00 2001 +From: Nathan Chancellor +Date: Sat, 27 Jan 2024 11:07:43 -0700 +Subject: powerpc: xor_vmx: Add '-mhard-float' to CFLAGS + +arch/powerpc/lib/xor_vmx.o is built with '-msoft-float' (from the main +powerpc Makefile) and '-maltivec' (from its CFLAGS), which causes an +error when building with clang after a recent change in main: + + error: option '-msoft-float' cannot be specified with '-maltivec' + make[6]: *** [scripts/Makefile.build:243: arch/powerpc/lib/xor_vmx.o] Error 1 + +Explicitly add '-mhard-float' before '-maltivec' in xor_vmx.o's CFLAGS +to override the previous inclusion of '-msoft-float' (as the last option +wins), which matches how other areas of the kernel use '-maltivec', such +as AMDGPU. + +Cc: stable@vger.kernel.org +Closes: https://github.com/ClangBuiltLinux/linux/issues/1986 +Link: https://github.com/llvm/llvm-project/commit/4792f912b232141ecba4cbae538873be3c28556c +Signed-off-by: Nathan Chancellor +Signed-off-by: Michael Ellerman +Link: https://msgid.link/20240127-ppc-xor_vmx-drop-msoft-float-v1-1-f24140e81376@kernel.org +--- +Link: https://git.kernel.org/powerpc/c/35f20786c481d5ced9283ff42de5c69b65e5ed13 +--- + arch/powerpc/lib/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile +index 6eac63e79a8995..0ab65eeb93ee3a 100644 +--- a/arch/powerpc/lib/Makefile ++++ b/arch/powerpc/lib/Makefile +@@ -76,7 +76,7 @@ obj-$(CONFIG_PPC_LIB_RHEAP) += rheap.o + obj-$(CONFIG_FTR_FIXUP_SELFTEST) += feature-fixups-test.o + + obj-$(CONFIG_ALTIVEC) += xor_vmx.o xor_vmx_glue.o +-CFLAGS_xor_vmx.o += -maltivec $(call cc-option,-mabi=altivec) ++CFLAGS_xor_vmx.o += -mhard-float -maltivec $(call cc-option,-mabi=altivec) + # Enable + CFLAGS_xor_vmx.o += -isystem $(shell $(CC) -print-file-name=include) + +-- +cgit 1.2.3-korg + diff --git a/src/s390-llvm-1.patch b/src/s390-llvm-1.patch new file mode 100644 index 00000000..3fb161ab --- /dev/null +++ b/src/s390-llvm-1.patch @@ -0,0 +1,256 @@ +diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig +index fe565f3a3a91..771235aee6bf 100644 +--- a/arch/s390/Kconfig ++++ b/arch/s390/Kconfig +@@ -127,6 +127,7 @@ config S390 + select ARCH_WANT_DEFAULT_BPF_JIT + select ARCH_WANT_IPC_PARSE_VERSION + select ARCH_WANT_KERNEL_PMD_MKWRITE ++ select ARCH_WANT_LD_ORPHAN_WARN + select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP + select BUILDTIME_TABLE_SORT + select CLONE_BACKWARDS2 +diff --git a/arch/s390/Makefile b/arch/s390/Makefile +index 73873e451686..994f9b3d575f 100644 +--- a/arch/s390/Makefile ++++ b/arch/s390/Makefile +@@ -15,7 +15,7 @@ KBUILD_CFLAGS_MODULE += -fPIC + KBUILD_AFLAGS += -m64 + KBUILD_CFLAGS += -m64 + KBUILD_CFLAGS += -fPIE +-LDFLAGS_vmlinux := -pie ++LDFLAGS_vmlinux := -pie -z notext + aflags_dwarf := -Wa,-gdwarf-2 + KBUILD_AFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) -m64 -D__ASSEMBLY__ + ifndef CONFIG_AS_IS_LLVM +diff --git a/arch/s390/boot/Makefile b/arch/s390/boot/Makefile +index c7c81e5f9218..5886b237dae6 100644 +--- a/arch/s390/boot/Makefile ++++ b/arch/s390/boot/Makefile +@@ -56,9 +56,9 @@ clean-files += vmlinux.map + + quiet_cmd_section_cmp = SECTCMP $* + define cmd_section_cmp +- s1=`$(OBJDUMP) -t -j "$*" "$<" | sort | \ ++ s1=`$(OBJDUMP) -t "$<" | grep "\s$*\s\+" | sort | \ + sed -n "/0000000000000000/! s/.*\s$*\s\+//p" | sha256sum`; \ +- s2=`$(OBJDUMP) -t -j "$*" "$(word 2,$^)" | sort | \ ++ s2=`$(OBJDUMP) -t "$(word 2,$^)" | grep "\s$*\s\+" | sort | \ + sed -n "/0000000000000000/! s/.*\s$*\s\+//p" | sha256sum`; \ + if [ "$$s1" != "$$s2" ]; then \ + echo "error: section $* differs between $< and $(word 2,$^)" >&2; \ +@@ -73,11 +73,12 @@ $(obj)/bzImage: $(obj)/vmlinux $(obj)/section_cmp.boot.data $(obj)/section_cmp.b + $(obj)/section_cmp%: vmlinux $(obj)/vmlinux FORCE + $(call if_changed,section_cmp) + +-LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup $(if $(CONFIG_VMLINUX_MAP),-Map=$(obj)/vmlinux.map) --build-id=sha1 -T ++LDFLAGS_vmlinux-$(CONFIG_LD_ORPHAN_WARN) := --orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL) ++LDFLAGS_vmlinux := $(LDFLAGS_vmlinux-y) --oformat $(LD_BFD) -e startup $(if $(CONFIG_VMLINUX_MAP),-Map=$(obj)/vmlinux.map) --build-id=sha1 -T + $(obj)/vmlinux: $(obj)/vmlinux.lds $(OBJECTS_ALL) FORCE + $(call if_changed,ld) + +-LDFLAGS_vmlinux.syms := --oformat $(LD_BFD) -e startup -T ++LDFLAGS_vmlinux.syms := $(LDFLAGS_vmlinux-y) --oformat $(LD_BFD) -e startup -T + $(obj)/vmlinux.syms: $(obj)/vmlinux.lds $(OBJECTS) FORCE + $(call if_changed,ld) + +diff --git a/arch/s390/boot/vmlinux.lds.S b/arch/s390/boot/vmlinux.lds.S +index 389df0e0d9e5..38577203aed6 100644 +--- a/arch/s390/boot/vmlinux.lds.S ++++ b/arch/s390/boot/vmlinux.lds.S +@@ -31,6 +31,7 @@ SECTIONS + _text = .; /* Text */ + *(.text) + *(.text.*) ++ INIT_TEXT + _etext = . ; + } + .rodata : { +@@ -39,6 +40,9 @@ SECTIONS + *(.rodata.*) + _erodata = . ; + } ++ .got : { ++ *(.got) ++ } + NOTES + .data : { + _data = . ; +@@ -118,8 +122,34 @@ SECTIONS + } + _end = .; + ++ DWARF_DEBUG ++ ELF_DETAILS ++ ++ /* ++ * Make sure that the .got.plt is either completely empty or it ++ * contains only the three reserved double words. ++ */ ++ .got.plt : { ++ *(.got.plt) ++ } ++ ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") ++ ++ /* ++ * Sections that should stay zero sized, which is safer to ++ * explicitly check instead of blindly discarding. ++ */ ++ .plt : { ++ *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) ++ } ++ ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!") ++ .rela.dyn : { ++ *(.rela.*) *(.rela_*) ++ } ++ ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!") ++ + /* Sections to be discarded */ + /DISCARD/ : { ++ COMMON_DISCARDS + *(.eh_frame) + *(__ex_table) + *(*__ksymtab*) +diff --git a/arch/s390/include/asm/bug.h b/arch/s390/include/asm/bug.h +index aebe1e22c7be..c500d45fb465 100644 +--- a/arch/s390/include/asm/bug.h ++++ b/arch/s390/include/asm/bug.h +@@ -14,7 +14,7 @@ + ".section .rodata.str,\"aMS\",@progbits,1\n" \ + "1: .asciz \""__FILE__"\"\n" \ + ".previous\n" \ +- ".section __bug_table,\"awM\",@progbits,%2\n" \ ++ ".section __bug_table,\"aw\"\n" \ + "2: .long 0b-.\n" \ + " .long 1b-.\n" \ + " .short %0,%1\n" \ +@@ -30,7 +30,7 @@ + #define __EMIT_BUG(x) do { \ + asm_inline volatile( \ + "0: mc 0,0\n" \ +- ".section __bug_table,\"awM\",@progbits,%1\n" \ ++ ".section __bug_table,\"aw\"\n" \ + "1: .long 0b-.\n" \ + " .short %0\n" \ + " .org 1b+%1\n" \ +diff --git a/arch/s390/kernel/vdso32/Makefile b/arch/s390/kernel/vdso32/Makefile +index caec7db6f966..b12a274cbb47 100644 +--- a/arch/s390/kernel/vdso32/Makefile ++++ b/arch/s390/kernel/vdso32/Makefile +@@ -22,7 +22,7 @@ KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS)) + KBUILD_CFLAGS_32 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_32)) + KBUILD_CFLAGS_32 += -m31 -fPIC -shared -fno-common -fno-builtin + +-LDFLAGS_vdso32.so.dbg += -fPIC -shared -soname=linux-vdso32.so.1 \ ++LDFLAGS_vdso32.so.dbg += -shared -soname=linux-vdso32.so.1 \ + --hash-style=both --build-id=sha1 -melf_s390 -T + + $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_32) +diff --git a/arch/s390/kernel/vdso32/vdso32.lds.S b/arch/s390/kernel/vdso32/vdso32.lds.S +index edf5ff1debe1..65b9513a5a0e 100644 +--- a/arch/s390/kernel/vdso32/vdso32.lds.S ++++ b/arch/s390/kernel/vdso32/vdso32.lds.S +@@ -9,7 +9,6 @@ + + OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390") + OUTPUT_ARCH(s390:31-bit) +-ENTRY(_start) + + SECTIONS + { +diff --git a/arch/s390/kernel/vdso64/Makefile b/arch/s390/kernel/vdso64/Makefile +index e3c9085f8fa7..caa4ebff8a19 100644 +--- a/arch/s390/kernel/vdso64/Makefile ++++ b/arch/s390/kernel/vdso64/Makefile +@@ -26,7 +26,7 @@ KBUILD_AFLAGS_64 += -m64 + KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS)) + KBUILD_CFLAGS_64 := $(filter-out -mno-pic-data-is-text-relative,$(KBUILD_CFLAGS_64)) + KBUILD_CFLAGS_64 += -m64 -fPIC -fno-common -fno-builtin +-ldflags-y := -fPIC -shared -soname=linux-vdso64.so.1 \ ++ldflags-y := -shared -soname=linux-vdso64.so.1 \ + --hash-style=both --build-id=sha1 -T + + $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_64) +diff --git a/arch/s390/kernel/vdso64/vdso64.lds.S b/arch/s390/kernel/vdso64/vdso64.lds.S +index 4461ea151e49..37e2a505e81d 100644 +--- a/arch/s390/kernel/vdso64/vdso64.lds.S ++++ b/arch/s390/kernel/vdso64/vdso64.lds.S +@@ -9,7 +9,6 @@ + + OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") + OUTPUT_ARCH(s390:64-bit) +-ENTRY(_start) + + SECTIONS + { +diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S +index e32ef446f451..2e07c1504542 100644 +--- a/arch/s390/kernel/vmlinux.lds.S ++++ b/arch/s390/kernel/vmlinux.lds.S +@@ -59,6 +59,12 @@ SECTIONS + } :text = 0x0700 + + RO_DATA(PAGE_SIZE) ++ .data.rel.ro : { ++ *(.data.rel.ro .data.rel.ro.*) ++ } ++ .got : { ++ *(.got) ++ } + + . = ALIGN(PAGE_SIZE); + _sdata = .; /* Start of data section */ +@@ -73,6 +79,9 @@ SECTIONS + __end_ro_after_init = .; + + RW_DATA(0x100, PAGE_SIZE, THREAD_SIZE) ++ .data.rel : { ++ *(.data.rel*) ++ } + BOOT_DATA_PRESERVED + + . = ALIGN(8); +@@ -191,6 +200,18 @@ SECTIONS + *(.rela*) + __rela_dyn_end = .; + } ++ .dynamic ALIGN(8) : { ++ *(.dynamic) ++ } ++ .dynstr ALIGN(8) : { ++ *(.dynstr) ++ } ++ .hash ALIGN(8) : { ++ *(.hash) ++ } ++ .gnu.hash ALIGN(8) : { ++ *(.gnu.hash) ++ } + + . = ALIGN(PAGE_SIZE); + __init_end = .; /* freed after init ends here */ +@@ -235,6 +256,24 @@ SECTIONS + DWARF_DEBUG + ELF_DETAILS + ++ /* ++ * Make sure that the .got.plt is either completely empty or it ++ * contains only the three reserved double words. ++ */ ++ .got.plt : { ++ *(.got.plt) ++ } ++ ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!") ++ ++ /* ++ * Sections that should stay zero sized, which is safer to ++ * explicitly check instead of blindly discarding. ++ */ ++ .plt : { ++ *(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt) ++ } ++ ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!") ++ + /* Sections to be discarded */ + DISCARDS + /DISCARD/ : { diff --git a/tc_build/kernel.py b/tc_build/kernel.py index 8dc11836..94eed3f7 100644 --- a/tc_build/kernel.py +++ b/tc_build/kernel.py @@ -258,12 +258,6 @@ def __init__(self): self.cross_compile = 's390x-linux-gnu-' - # LD: https://github.com/ClangBuiltLinux/linux/issues/1524 - # OBJCOPY: https://github.com/ClangBuiltLinux/linux/issues/1530 - # OBJDUMP: https://github.com/ClangBuiltLinux/linux/issues/859 - for key in ['LD', 'OBJCOPY', 'OBJDUMP']: - self.make_variables[key] = self.cross_compile + key.lower() - def build(self): self.toolchain_version = self.get_toolchain_version() if self.toolchain_version <= (15, 0, 0): @@ -272,6 +266,45 @@ def build(self): 's390 does not build with LLVM < 15.0.0, skipping build...') return + # LD: https://github.com/ClangBuiltLinux/linux/issues/1524 + # OBJCOPY: https://github.com/ClangBuiltLinux/linux/issues/1530 + # OBJDUMP: https://github.com/ClangBuiltLinux/linux/issues/859 + gnu_vars = [] + + # https://github.com/llvm/llvm-project/pull/75643 + lld_res = subprocess.run([Path(self.toolchain_prefix, 'bin/ld.lld'), '-m', 'elf64_s390'], + capture_output=True, + check=False, + text=True) + no_s390_support_in_lld = 'error: unknown emulation:' in lld_res.stderr + # https://lore.kernel.org/20240207-s390-lld-and-orphan-warn-v1-11-8a665b3346ab@kernel.org/ + s390_makefile_txt = Path(self.folders.source, + 'arch/s390/Makefile').read_text(encoding='utf-8') + no_s390_kernel_support_for_lld = '-z notext' not in s390_makefile_txt + if no_s390_support_in_lld or no_s390_kernel_support_for_lld: + gnu_vars.append('LD') + + # https://github.com/llvm/llvm-project/pull/81841 + objcopy_res = subprocess.run( + [Path(self.toolchain_prefix, 'bin/llvm-objcopy'), '-I', 'binary', '-O', 'elf64-s390', '-', '/dev/null'], + capture_output=True, + check=False, + input='', + text=True) + no_s390_support_in_llvm_objcopy = 'error: invalid output format:' in objcopy_res.stderr + if no_s390_support_in_llvm_objcopy: + gnu_vars.append('OBJCOPY') + + # https://github.com/ClangBuiltLinux/linux/issues/859 + s390_boot_makefile_txt = Path(self.folders.source, + 'arch/s390/boot/Makefile').read_text(encoding='utf-8') + have_objdump_t_j_wa = r' | grep "\s$*\s\+" | ' in s390_boot_makefile_txt + if not have_objdump_t_j_wa: + gnu_vars.append('OBJDUMP') + + for key in gnu_vars: + self.make_variables[key] = self.cross_compile + key.lower() + super().build() def can_use_ias(self):