From: Baoquan He <bhe@redhat.com>
To: Borislav Petkov <bp@alien8.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>,
linux-kernel@vger.kernel.org, dyoung@redhat.com,
daniel.kiper@oracle.com, noodles@fb.com, lijiang@redhat.com,
kexec@lists.infradead.org, x86@kernel.org
Subject: Re: [PATCH v3 1/2] x86/mm: rename the confusing local variable in early_memremap_is_setup_data()
Date: Wed, 13 Nov 2024 20:55:47 +0800 [thread overview]
Message-ID: <ZzSh0/i0HXDnfUof@MiWiFi-R3L-srv> (raw)
In-Reply-To: <20241106112052.GCZytRFKTESZI8_3qD@fat_crate.local>
On 11/06/24 at 12:20pm, Borislav Petkov wrote:
> On Sat, Nov 02, 2024 at 12:06:18PM +0100, Borislav Petkov wrote:
> > Ok, I'll take your 2/2 next week and you can then send the cleanup ontop.
>
> OMG what a mess this is. Please test the below before I apply it.
I finally got an available machine to test below patch, I can confirm
that without it the breakage can be reproduced stably; with below patch
applied the breakage is gone and vmcore dumping is successful.
>
> Then, when you do the cleanup, do the following:
Will post cleanup patch later. Thanks.
>
> - merge early_memremap_is_setup_data() with memremap_is_setup_data() into
> a common __memremap_is_setup_data() and then add a bool early which
> determines which memremap variant is called.
>
> - unify the @size argument by dropping it and using a function local size.
> What we have there now is the definition of bitrot. :-\
>
> - replace all sizeof(*data), sizeof(struct setup_data) with a macro definition
> above the functions to unify it properly.
>
> What an ugly mess... :-\
>
> ---
> From: Baoquan He <bhe@redhat.com>
> Date: Wed, 11 Sep 2024 16:16:15 +0800
> Subject: [PATCH] x86/mm: Fix a kdump kernel failure on SME system when
> CONFIG_IMA_KEXEC=y
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> The kdump kernel is broken on SME systems with CONFIG_IMA_KEXEC=y enabled.
> Debugging traced the issue back to
>
> b69a2afd5afc ("x86/kexec: Carry forward IMA measurement log on kexec").
>
> Testing was previously not conducted on SME systems with CONFIG_IMA_KEXEC
> enabled, which led to the oversight, with the following incarnation:
>
> ...
> ima: No TPM chip found, activating TPM-bypass!
> Loading compiled-in module X.509 certificates
> Loaded X.509 cert 'Build time autogenerated kernel key: 18ae0bc7e79b64700122bb1d6a904b070fef2656'
> ima: Allocated hash algorithm: sha256
> Oops: general protection fault, probably for non-canonical address 0xcfacfdfe6660003e: 0000 [#1] PREEMPT SMP NOPTI
> CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.11.0-rc2+ #14
> Hardware name: Dell Inc. PowerEdge R7425/02MJ3T, BIOS 1.20.0 05/03/2023
> RIP: 0010:ima_restore_measurement_list
> Call Trace:
> <TASK>
> ? show_trace_log_lvl
> ? show_trace_log_lvl
> ? ima_load_kexec_buffer
> ? __die_body.cold
> ? die_addr
> ? exc_general_protection
> ? asm_exc_general_protection
> ? ima_restore_measurement_list
> ? vprintk_emit
> ? ima_load_kexec_buffer
> ima_load_kexec_buffer
> ima_init
> ? __pfx_init_ima
> init_ima
> ? __pfx_init_ima
> do_one_initcall
> do_initcalls
> ? __pfx_kernel_init
> kernel_init_freeable
> kernel_init
> ret_from_fork
> ? __pfx_kernel_init
> ret_from_fork_asm
> </TASK>
> Modules linked in:
> ---[ end trace 0000000000000000 ]---
> ...
> Kernel panic - not syncing: Fatal exception
> Kernel Offset: disabled
> Rebooting in 10 seconds..
>
> Adding debug printks showed that the stored addr and size of ima_kexec buffer
> are not decrypted correctly like:
>
> ima: ima_load_kexec_buffer, buffer:0xcfacfdfe6660003e, size:0xe48066052d5df359
>
> Three types of setup_data info
>
> — SETUP_EFI,
> - SETUP_IMA, and
> - SETUP_RNG_SEED
>
> are passed to the kexec/kdump kernel. Only the ima_kexec buffer
> experienced incorrect decryption. Debugging identified a bug in
> early_memremap_is_setup_data(), where an incorrect range calculation
> occurred due to the len variable in struct setup_data ended up only
> representing the length of the data field, excluding the struct's size,
> and thus leading to miscalculation.
>
> Address a similar issue in memremap_is_setup_data() while at it.
>
> [ bp: Heavily massage. ]
>
> Fixes: b3c72fc9a78e ("x86/boot: Introduce setup_indirect")
> Signed-off-by: Baoquan He <bhe@redhat.com>
> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
> Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
> Cc: <stable@kernel.org>
> Link: https://lore.kernel.org/r/20240911081615.262202-3-bhe@redhat.com
> ---
> arch/x86/mm/ioremap.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
> index 70b02fc61d93..8d29163568a7 100644
> --- a/arch/x86/mm/ioremap.c
> +++ b/arch/x86/mm/ioremap.c
> @@ -656,7 +656,8 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
> paddr_next = data->next;
> len = data->len;
>
> - if ((phys_addr > paddr) && (phys_addr < (paddr + len))) {
> + if ((phys_addr > paddr) &&
> + (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
> memunmap(data);
> return true;
> }
> @@ -718,7 +719,8 @@ static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
> paddr_next = data->next;
> len = data->len;
>
> - if ((phys_addr > paddr) && (phys_addr < (paddr + len))) {
> + if ((phys_addr > paddr) &&
> + (phys_addr < (paddr + sizeof(struct setup_data) + len))) {
> early_memunmap(data, sizeof(*data));
> return true;
> }
> --
> 2.43.0
>
>
> --
> Regards/Gruss,
> Boris.
>
> https://people.kernel.org/tglx/notes-about-netiquette
>
next prev parent reply other threads:[~2024-11-13 12:55 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-11 8:16 [PATCH v3 0/2] x86/mm/sme: fix the kdump kernel breakage on SME system when CONFIG_IMA_KEXEC=y Baoquan He
2024-09-11 8:16 ` [PATCH v3 1/2] x86/mm: rename the confusing local variable in early_memremap_is_setup_data() Baoquan He
2024-10-29 18:11 ` Borislav Petkov
2024-10-30 0:53 ` Baoquan He
2024-10-30 12:49 ` Tom Lendacky
2024-10-31 3:41 ` Baoquan He
2024-11-01 16:18 ` Borislav Petkov
2024-11-02 0:23 ` Baoquan He
2024-11-02 11:06 ` Borislav Petkov
2024-11-06 11:20 ` Borislav Petkov
2024-11-07 9:30 ` Baoquan He
2024-11-13 12:55 ` Baoquan He [this message]
2024-11-13 13:10 ` Borislav Petkov
2024-09-11 8:16 ` [PATCH v3 2/2] x86/mm/sme: fix the kdump kernel breakage on SME system when CONFIG_IMA_KEXEC=y Baoquan He
2024-11-13 13:27 ` [tip: x86/urgent] x86/mm: Fix a kdump kernel failure " tip-bot2 for Baoquan He
2024-09-30 2:59 ` [PATCH v3 0/2] x86/mm/sme: fix the kdump kernel breakage " Baoquan He
2024-10-29 7:20 ` Baoquan He
2024-10-30 1:23 ` Andrew Morton
2024-10-30 2:54 ` Baoquan He
2024-10-30 11:31 ` Borislav Petkov
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=ZzSh0/i0HXDnfUof@MiWiFi-R3L-srv \
--to=bhe@redhat.com \
--cc=bp@alien8.de \
--cc=daniel.kiper@oracle.com \
--cc=dyoung@redhat.com \
--cc=kexec@lists.infradead.org \
--cc=lijiang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=noodles@fb.com \
--cc=thomas.lendacky@amd.com \
--cc=x86@kernel.org \
/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