From: Greg Kroah-Hartman Date: Wed, 12 Jan 2022 13:12:27 +0000 (+0100) Subject: 5.15-stable patches X-Git-Tag: v5.16.1~50 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6091a17abe2ad4a68c206af27666d0b75dedcaac;p=thirdparty%2Fkernel%2Fstable-queue.git 5.15-stable patches added patches: s390-kexec-handle-r_390_plt32dbl-rela-in-arch_kexec_apply_relocations_add.patch --- diff --git a/queue-4.19/series b/queue-4.19/series new file mode 100644 index 00000000000..e69de29bb2d diff --git a/queue-5.15/s390-kexec-handle-r_390_plt32dbl-rela-in-arch_kexec_apply_relocations_add.patch b/queue-5.15/s390-kexec-handle-r_390_plt32dbl-rela-in-arch_kexec_apply_relocations_add.patch new file mode 100644 index 00000000000..d3aa469f2ed --- /dev/null +++ b/queue-5.15/s390-kexec-handle-r_390_plt32dbl-rela-in-arch_kexec_apply_relocations_add.patch @@ -0,0 +1,79 @@ +From abf0e8e4ef25478a4390115e6a953d589d1f9ffd Mon Sep 17 00:00:00 2001 +From: Alexander Egorenkov +Date: Thu, 9 Dec 2021 08:38:17 +0100 +Subject: s390/kexec: handle R_390_PLT32DBL rela in arch_kexec_apply_relocations_add() + +From: Alexander Egorenkov + +commit abf0e8e4ef25478a4390115e6a953d589d1f9ffd upstream. + +Starting with gcc 11.3, the C compiler will generate PLT-relative function +calls even if they are local and do not require it. Later on during linking, +the linker will replace all PLT-relative calls to local functions with +PC-relative ones. Unfortunately, the purgatory code of kexec/kdump is +not being linked as a regular executable or shared library would have been, +and therefore, all PLT-relative addresses remain in the generated purgatory +object code unresolved. This leads to the situation where the purgatory +code is being executed during kdump with all PLT-relative addresses +unresolved. And this results in endless loops within the purgatory code. + +Furthermore, the clang C compiler has always behaved like described above +and this commit should fix kdump for kernels built with the latter. + +Because the purgatory code is no regular executable or shared library, +contains only calls to local functions and has no PLT, all R_390_PLT32DBL +relocation entries can be resolved just like a R_390_PC32DBL one. + +* https://refspecs.linuxfoundation.org/ELF/zSeries/lzsabi0_zSeries/x1633.html#AEN1699 + +Relocation entries of purgatory code generated with gcc 11.3 +------------------------------------------------------------ + +$ readelf -r linux/arch/s390/purgatory/purgatory.o + +Relocation section '.rela.text' at offset 0x370 contains 5 entries: + Offset Info Type Sym. Value Sym. Name + Addend +00000000005c 000c00000013 R_390_PC32DBL 0000000000000000 purgatory_sha_regions + 2 +00000000007a 000d00000014 R_390_PLT32DBL 0000000000000000 sha256_update + 2 +00000000008c 000e00000014 R_390_PLT32DBL 0000000000000000 sha256_final + 2 +000000000092 000800000013 R_390_PC32DBL 0000000000000000 .LC0 + 2 +0000000000a0 000f00000014 R_390_PLT32DBL 0000000000000000 memcmp + 2 + +Relocation entries of purgatory code generated with gcc 11.2 +------------------------------------------------------------ + +$ readelf -r linux/arch/s390/purgatory/purgatory.o + +Relocation section '.rela.text' at offset 0x368 contains 5 entries: + Offset Info Type Sym. Value Sym. Name + Addend +00000000005c 000c00000013 R_390_PC32DBL 0000000000000000 purgatory_sha_regions + 2 +00000000007a 000d00000013 R_390_PC32DBL 0000000000000000 sha256_update + 2 +00000000008c 000e00000013 R_390_PC32DBL 0000000000000000 sha256_final + 2 +000000000092 000800000013 R_390_PC32DBL 0000000000000000 .LC0 + 2 +0000000000a0 000f00000013 R_390_PC32DBL 0000000000000000 memcmp + 2 + +Signed-off-by: Alexander Egorenkov +Reported-by: Tao Liu +Suggested-by: Philipp Rudo +Reviewed-by: Philipp Rudo +Cc: +Link: https://lore.kernel.org/r/20211209073817.82196-1-egorenar@linux.ibm.com +Signed-off-by: Heiko Carstens +Signed-off-by: Greg Kroah-Hartman +--- + arch/s390/kernel/machine_kexec_file.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/arch/s390/kernel/machine_kexec_file.c ++++ b/arch/s390/kernel/machine_kexec_file.c +@@ -312,6 +312,10 @@ int arch_kexec_apply_relocations_add(str + addr = section->sh_addr + relas[i].r_offset; + + r_type = ELF64_R_TYPE(relas[i].r_info); ++ ++ if (r_type == R_390_PLT32DBL) ++ r_type = R_390_PC32DBL; ++ + ret = arch_kexec_do_relocs(r_type, loc, val, addr); + if (ret) { + pr_err("Unknown rela relocation: %d\n", r_type); diff --git a/queue-5.15/series b/queue-5.15/series new file mode 100644 index 00000000000..c6a767d1d1c --- /dev/null +++ b/queue-5.15/series @@ -0,0 +1 @@ +s390-kexec-handle-r_390_plt32dbl-rela-in-arch_kexec_apply_relocations_add.patch