From: Philipp Rudo <prudo@redhat.com>
To: Alexander Egorenkov <egorenar@linux.ibm.com>
Cc: ltao@redhat.com, hca@linux.ibm.com, linux-s390@vger.kernel.org
Subject: Re: [PATCH v2 1/1] s390/kexec: handle R_390_PLT32DBL rela in arch_kexec_apply_relocations_add()
Date: Thu, 9 Dec 2021 12:01:42 +0100 [thread overview]
Message-ID: <20211209120142.60642497@rhtmp> (raw)
In-Reply-To: <20211209073817.82196-1-egorenar@linux.ibm.com>
On Thu, 9 Dec 2021 08:38:17 +0100
Alexander Egorenkov <egorenar@linux.ibm.com> wrote:
> 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 <egorenar@linux.ibm.com>
> Reported-by: Tao Liu <ltao@redhat.com>
> Suggested-by: Philipp Rudo <prudo@redhat.com>
Thanks!
Reviewed-by: Philipp Rudo <prudo@redhat.com>
> ---
> Changes since v1:
> =================
> * Alternative version of the fix but this time in arch_kexec_apply_relocations_add()
> in order not to force every user of arch_kexec_do_relocs() to handle R_390_PC32DBL
> and avoid breaking other users with unexpected bhavior
>
> arch/s390/kernel/machine_kexec_file.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/arch/s390/kernel/machine_kexec_file.c b/arch/s390/kernel/machine_kexec_file.c
> index 876cdd3c994e..8f43575a4dd3 100644
> --- a/arch/s390/kernel/machine_kexec_file.c
> +++ b/arch/s390/kernel/machine_kexec_file.c
> @@ -348,6 +348,10 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
> 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);
next prev parent reply other threads:[~2021-12-09 11:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-09 7:38 [PATCH v2 1/1] s390/kexec: handle R_390_PLT32DBL rela in arch_kexec_apply_relocations_add() Alexander Egorenkov
2021-12-09 11:01 ` Philipp Rudo [this message]
2021-12-09 11:15 ` Heiko Carstens
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211209120142.60642497@rhtmp \
--to=prudo@redhat.com \
--cc=egorenar@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=linux-s390@vger.kernel.org \
--cc=ltao@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox