From: Philipp Rudo <prudo@redhat.com>
To: Ricardo Ribalda <ribalda@chromium.org>
Cc: Eric Biederman <ebiederm@xmission.com>,
Baoquan He <bhe@redhat.com>,
kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
Ross Zwisler <zwisler@google.com>,
Steven Rostedt <rostedt@goodmis.org>,
Simon Horman <horms@kernel.org>,
stable@vger.kernel.org
Subject: Re: [PATCH v5 1/2] kexec: Support purgatories with .text.hot sections
Date: Mon, 3 Apr 2023 16:42:13 +0200 [thread overview]
Message-ID: <20230403164213.108093ec@rotkaeppchen> (raw)
In-Reply-To: <20230321-kexec_clang16-v5-1-5563bf7c4173@chromium.org>
Hi Ricardo,
On Thu, 30 Mar 2023 11:44:47 +0200
Ricardo Ribalda <ribalda@chromium.org> wrote:
> Clang16 links the purgatory text in two sections:
>
> [ 1] .text PROGBITS 0000000000000000 00000040
> 00000000000011a1 0000000000000000 AX 0 0 16
> [ 2] .rela.text RELA 0000000000000000 00003498
> 0000000000000648 0000000000000018 I 24 1 8
> ...
> [17] .text.hot. PROGBITS 0000000000000000 00003220
> 000000000000020b 0000000000000000 AX 0 0 1
> [18] .rela.text.hot. RELA 0000000000000000 00004428
> 0000000000000078 0000000000000018 I 24 17 8
>
> And both of them have their range [sh_addr ... sh_addr+sh_size] on the
> area pointed by `e_entry`.
>
> This causes that image->start is calculated twice, once for .text and
> another time for .text.hot. The second calculation leaves image->start
> in a random location.
>
> Because of this, the system crashes immediately after:
>
> kexec_core: Starting new kernel
>
> Cc: stable@vger.kernel.org
> Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
> Reviewed-by: Ross Zwisler <zwisler@google.com>
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
> kernel/kexec_file.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index f1a0e4e3fb5c..c7a0e51a6d87 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -901,10 +901,22 @@ static int kexec_purgatory_setup_sechdrs(struct purgatory_info *pi,
> }
>
> offset = ALIGN(offset, align);
> +
> + /*
> + * Check if the segment contains the entry point, if so,
> + * calculate the value of image->start based on it.
> + * If the compiler has produced more than one .text section
> + * (Eg: .text.hot), they are generally after the main .text
> + * section, and they shall not be used to calculate
> + * image->start. So do not re-calculate image->start if it
> + * is not set to the initial value, and warn the user so they
> + * have a chance to fix their purgatory's linker script.
> + */
> if (sechdrs[i].sh_flags & SHF_EXECINSTR &&
> pi->ehdr->e_entry >= sechdrs[i].sh_addr &&
> pi->ehdr->e_entry < (sechdrs[i].sh_addr
> - + sechdrs[i].sh_size)) {
> + + sechdrs[i].sh_size) &&
> + !WARN_ON(kbuf->image->start != pi->ehdr->e_entry)) {
Looks good to me. I'm not sure if it is better to use WARN_ON_ONCE to
avoid spamming the log when there are more than two .text sections or
when you reload the kernel. But that's only a rare corner case. So no
strong opinion from my side. Either way
Reviewed-by: Philipp Rudo <prudo@redhat.com>
> kbuf->image->start -= sechdrs[i].sh_addr;
> kbuf->image->start += kbuf->mem + offset;
> }
>
WARNING: multiple messages have this Message-ID (diff)
From: Philipp Rudo <prudo@redhat.com>
To: Ricardo Ribalda <ribalda@chromium.org>
Cc: Eric Biederman <ebiederm@xmission.com>,
Baoquan He <bhe@redhat.com>,
kexec@lists.infradead.org, linux-kernel@vger.kernel.org,
Ross Zwisler <zwisler@google.com>,
Steven Rostedt <rostedt@goodmis.org>,
Simon Horman <horms@kernel.org>,
stable@vger.kernel.org
Subject: Re: [PATCH v5 1/2] kexec: Support purgatories with .text.hot sections
Date: Mon, 3 Apr 2023 16:42:13 +0200 [thread overview]
Message-ID: <20230403164213.108093ec@rotkaeppchen> (raw)
In-Reply-To: <20230321-kexec_clang16-v5-1-5563bf7c4173@chromium.org>
Hi Ricardo,
On Thu, 30 Mar 2023 11:44:47 +0200
Ricardo Ribalda <ribalda@chromium.org> wrote:
> Clang16 links the purgatory text in two sections:
>
> [ 1] .text PROGBITS 0000000000000000 00000040
> 00000000000011a1 0000000000000000 AX 0 0 16
> [ 2] .rela.text RELA 0000000000000000 00003498
> 0000000000000648 0000000000000018 I 24 1 8
> ...
> [17] .text.hot. PROGBITS 0000000000000000 00003220
> 000000000000020b 0000000000000000 AX 0 0 1
> [18] .rela.text.hot. RELA 0000000000000000 00004428
> 0000000000000078 0000000000000018 I 24 17 8
>
> And both of them have their range [sh_addr ... sh_addr+sh_size] on the
> area pointed by `e_entry`.
>
> This causes that image->start is calculated twice, once for .text and
> another time for .text.hot. The second calculation leaves image->start
> in a random location.
>
> Because of this, the system crashes immediately after:
>
> kexec_core: Starting new kernel
>
> Cc: stable@vger.kernel.org
> Fixes: 930457057abe ("kernel/kexec_file.c: split up __kexec_load_puragory")
> Reviewed-by: Ross Zwisler <zwisler@google.com>
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
> kernel/kexec_file.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index f1a0e4e3fb5c..c7a0e51a6d87 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -901,10 +901,22 @@ static int kexec_purgatory_setup_sechdrs(struct purgatory_info *pi,
> }
>
> offset = ALIGN(offset, align);
> +
> + /*
> + * Check if the segment contains the entry point, if so,
> + * calculate the value of image->start based on it.
> + * If the compiler has produced more than one .text section
> + * (Eg: .text.hot), they are generally after the main .text
> + * section, and they shall not be used to calculate
> + * image->start. So do not re-calculate image->start if it
> + * is not set to the initial value, and warn the user so they
> + * have a chance to fix their purgatory's linker script.
> + */
> if (sechdrs[i].sh_flags & SHF_EXECINSTR &&
> pi->ehdr->e_entry >= sechdrs[i].sh_addr &&
> pi->ehdr->e_entry < (sechdrs[i].sh_addr
> - + sechdrs[i].sh_size)) {
> + + sechdrs[i].sh_size) &&
> + !WARN_ON(kbuf->image->start != pi->ehdr->e_entry)) {
Looks good to me. I'm not sure if it is better to use WARN_ON_ONCE to
avoid spamming the log when there are more than two .text sections or
when you reload the kernel. But that's only a rare corner case. So no
strong opinion from my side. Either way
Reviewed-by: Philipp Rudo <prudo@redhat.com>
> kbuf->image->start -= sechdrs[i].sh_addr;
> kbuf->image->start += kbuf->mem + offset;
> }
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2023-04-03 14:43 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-30 9:44 [PATCH v5 0/2] kexec: Fix kexec_file_load for llvm16 Ricardo Ribalda
2023-03-30 9:44 ` Ricardo Ribalda
2023-03-30 9:44 ` [PATCH v5 1/2] kexec: Support purgatories with .text.hot sections Ricardo Ribalda
2023-03-30 9:44 ` Ricardo Ribalda
2023-03-30 15:03 ` Steven Rostedt
2023-03-30 15:03 ` Steven Rostedt
2023-04-03 14:42 ` Philipp Rudo [this message]
2023-04-03 14:42 ` Philipp Rudo
2023-03-30 9:44 ` [PATCH v5 2/2] x86/purgatory: Add linker script Ricardo Ribalda
2023-03-30 9:44 ` Ricardo Ribalda
2023-03-30 15:15 ` Steven Rostedt
2023-03-30 15:15 ` Steven Rostedt
2023-03-30 15:18 ` Borislav Petkov
2023-03-30 15:18 ` Borislav Petkov
2023-03-30 15:31 ` Steven Rostedt
2023-03-30 15:31 ` Steven Rostedt
2023-03-30 16:00 ` Borislav Petkov
2023-03-30 16:00 ` Borislav Petkov
2023-04-07 23:22 ` Nick Desaulniers
2023-04-07 23:22 ` Nick Desaulniers
2023-04-11 21:45 ` Ricardo Ribalda
2023-04-11 21:45 ` Ricardo Ribalda
2023-04-18 17:49 ` Nick Desaulniers
2023-04-18 17:49 ` Nick Desaulniers
2023-03-31 19:13 ` Ross Zwisler
2023-03-31 19:13 ` Ross Zwisler
2023-04-03 15:35 ` Ricardo Ribalda
2023-04-03 15:35 ` Ricardo Ribalda
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=20230403164213.108093ec@rotkaeppchen \
--to=prudo@redhat.com \
--cc=bhe@redhat.com \
--cc=ebiederm@xmission.com \
--cc=horms@kernel.org \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ribalda@chromium.org \
--cc=rostedt@goodmis.org \
--cc=stable@vger.kernel.org \
--cc=zwisler@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.