From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail05.groups.io (mail05.groups.io [45.79.224.7]) by spool.mail.gandi.net (Postfix) with ESMTPS id 35BECD8030C for ; Thu, 9 Jan 2025 16:15:26 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=isy4vesMePAi84HP6Q47VmeUuTUcnOJHypz7emOwf0U=; c=relaxed/simple; d=groups.io; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject:To:Cc:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type; s=20240830; t=1736439326; v=1; x=1736698525; b=FKBmkp2fD+/36yZ/aRvyL1nF8eSqGzzhyn/YYwCNTHrNNCTNiZyPu3KtW82rWbXUmMIaF26X efSfEfuVgEgk/8fdj9sauFXuyJt2WbUcqHHltiMv2j7jjnTHXaKV4H2sX85FgceGNiwaB4fW7LX KSVPfyOFKBNyJ/R5moZOaNQO3wpMOo6M5LbXH+IzRWcx2HExU6J/TVy14fifCO5CgIMcEp0kcE5 +qoipJoMHjroej1t10+WQeBLe97q7LlKLEbNyOMyg1F+nnzGw8gk/k4jh4UM29o41k77vAxGUbe t0hW+/glsiYZcuIjVoNqLIP3BBabwUCepzHtzn0iB6O4Q== X-Received: by 127.0.0.2 with SMTP id xSHjYY7687511xFzZL861fZq; Thu, 09 Jan 2025 08:15:25 -0800 X-Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mx.groups.io with SMTP id smtpd.web11.461.1736439324551401821 for ; Thu, 09 Jan 2025 08:15:24 -0800 X-Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id C44C25C5C76 for ; Thu, 9 Jan 2025 16:14:42 +0000 (UTC) X-Received: by smtp.kernel.org (Postfix) with ESMTPSA id 996D6C4CEE1 for ; Thu, 9 Jan 2025 16:15:23 +0000 (UTC) X-Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-53e384e3481so1032298e87.2 for ; Thu, 09 Jan 2025 08:15:23 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCXgcPzO+FSwPaJsT1Yra4RGrj4hjZEQY7yQO/z5QOi2Vi806+Elav778rjfiNHPG4JYIoRHiQ==@edk2.groups.io X-Gm-Message-State: ApPQTaYxp5C44AqPn1C8SFYux7686176AA= X-Google-Smtp-Source: AGHT+IEgDc3Ath4/1uyTCs9JWOOHZZDwY9mK/b9amglFhjwS7HHJIIvUsHf0MoF/tIeatS4zttGxIxrfylS/16CHrcE= X-Received: by 2002:a05:6512:304f:b0:540:2339:3761 with SMTP id 2adb3069b0e04-542845d61e4mr2632246e87.31.1736439321978; Thu, 09 Jan 2025 08:15:21 -0800 (PST) MIME-Version: 1.0 References: <20250108215957.3437660-1-usamaarif642@gmail.com> <20250108215957.3437660-3-usamaarif642@gmail.com> In-Reply-To: <20250108215957.3437660-3-usamaarif642@gmail.com> From: "Ard Biesheuvel via groups.io" Date: Thu, 9 Jan 2025 17:15:10 +0100 X-Gmail-Original-Message-ID: X-Gm-Features: AbW1kvYuGkq4yLIfsQUdM5PMmU94RQMf4rX_EMMrLutlK12hhu_mxZhaeTrMs-4 Message-ID: Subject: Re: [edk2-devel] [RFC 2/2] efi/memattr: add efi_mem_attr_table as a reserved region in 820_table_firmware To: Usama Arif Cc: linux-efi@vger.kernel.org, devel@edk2.groups.io, kexec@lists.infradead.org, hannes@cmpxchg.org, dyoung@redhat.com, x86@kernel.org, linux-kernel@vger.kernel.org, leitao@debian.org, gourry@gourry.net, kernel-team@meta.com Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Thu, 09 Jan 2025 08:15:24 -0800 Resent-From: ardb@kernel.org Reply-To: devel@edk2.groups.io,ardb@kernel.org List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Type: text/plain; charset="UTF-8" X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240830 header.b=FKBmkp2f; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.224.7 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=pass (policy=none) header.from=groups.io On Wed, 8 Jan 2025 at 23:00, Usama Arif wrote: > > When this area is not reserved, it comes up as usable in > /sys/firmware/memmap. This means that kexec, which uses that memmap > to find usable memory regions, can select the region where > efi_mem_attr_table is and overwrite it and relocate_kernel. > > Since the patch in [1] was merged, all boots after kexec > are producing the warning that it introduced. > > Having a fix in firmware can be difficult to get through. I don't follow. I don't think there is anything wrong with the firmware here. Could you elaborate? > The next ideal place would be in libstub. However, it looks like > InstallMemoryAttributesTable [2] is not available as a boot service > call option [3], [4], and install_configuration_table does not > seem to work as a valid substitute. > To do what, exactly? > As a last option for a fix, this patch marks that region as reserved in > e820_table_firmware if it is currently E820_TYPE_RAM so that kexec doesn't > use it for kernel segments. > > [1] https://lore.kernel.org/all/20241031175822.2952471-2-ardb+git@google.com/ > [2] https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c#L100 > [3] https://github.com/tianocore/edk2/blob/42a141800c0c26a09d2344e84a89ce4097a263ae/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c#L41 > [4] https://elixir.bootlin.com/linux/v6.12.6/source/drivers/firmware/efi/libstub/efistub.h#L327 > > Reported-by: Breno Leitao > Signed-off-by: Usama Arif > --- > arch/x86/include/asm/e820/api.h | 2 ++ > arch/x86/kernel/e820.c | 6 ++++++ > arch/x86/platform/efi/efi.c | 9 +++++++++ > drivers/firmware/efi/memattr.c | 1 + > include/linux/efi.h | 7 +++++++ > 5 files changed, 25 insertions(+) > > diff --git a/arch/x86/include/asm/e820/api.h b/arch/x86/include/asm/e820/api.h > index 2e74a7f0e935..4e9aa24f03bd 100644 > --- a/arch/x86/include/asm/e820/api.h > +++ b/arch/x86/include/asm/e820/api.h > @@ -16,6 +16,8 @@ extern bool e820__mapped_all(u64 start, u64 end, enum e820_type type); > > extern void e820__range_add (u64 start, u64 size, enum e820_type type); > extern u64 e820__range_update(u64 start, u64 size, enum e820_type old_type, enum e820_type new_type); > +extern u64 e820__range_update_firmware(u64 start, u64 size, enum e820_type old_type, > + enum e820_type new_type); > extern u64 e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type); > extern u64 e820__range_update_table(struct e820_table *t, u64 start, u64 size, enum e820_type old_type, enum e820_type new_type); > > diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c > index 82b96ed9890a..01d7d3c0d299 100644 > --- a/arch/x86/kernel/e820.c > +++ b/arch/x86/kernel/e820.c > @@ -538,6 +538,12 @@ u64 __init e820__range_update_table(struct e820_table *t, u64 start, u64 size, > return __e820__range_update(t, start, size, old_type, new_type); > } > > +u64 __init e820__range_update_firmware(u64 start, u64 size, enum e820_type old_type, > + enum e820_type new_type) > +{ > + return __e820__range_update(e820_table_firmware, start, size, old_type, new_type); > +} > + > /* Remove a range of memory from the E820 table: */ > u64 __init e820__range_remove(u64 start, u64 size, enum e820_type old_type, bool check_type) > { > diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c > index a7ff189421c3..13684c5d7c05 100644 > --- a/arch/x86/platform/efi/efi.c > +++ b/arch/x86/platform/efi/efi.c > @@ -168,6 +168,15 @@ static void __init do_add_efi_memmap(void) > e820__update_table(e820_table); > } > > +/* Reserve firmware area if it was marked as RAM */ > +void arch_update_firmware_area(u64 addr, u64 size) > +{ > + if (e820__get_entry_type(addr, addr + size) == E820_TYPE_RAM) { > + e820__range_update_firmware(addr, size, E820_TYPE_RAM, E820_TYPE_RESERVED); > + e820__update_table(e820_table_firmware); > + } > +} > + > /* > * Given add_efi_memmap defaults to 0 and there is no alternative > * e820 mechanism for soft-reserved memory, import the full EFI memory > diff --git a/drivers/firmware/efi/memattr.c b/drivers/firmware/efi/memattr.c > index d3bc161361fb..d131781e2d7b 100644 > --- a/drivers/firmware/efi/memattr.c > +++ b/drivers/firmware/efi/memattr.c > @@ -53,6 +53,7 @@ int __init efi_memattr_init(void) > size = tbl->num_entries * tbl->desc_size; > tbl_size = sizeof(*tbl) + size; > memblock_reserve(efi_mem_attr_table, tbl_size); > + arch_update_firmware_area(efi_mem_attr_table, tbl_size); > set_bit(EFI_MEM_ATTR, &efi.flags); > > unmap: > diff --git a/include/linux/efi.h b/include/linux/efi.h > index e5815867aba9..8eb9698bd6a4 100644 > --- a/include/linux/efi.h > +++ b/include/linux/efi.h > @@ -1358,4 +1358,11 @@ extern struct blocking_notifier_head efivar_ops_nh; > void efivars_generic_ops_register(void); > void efivars_generic_ops_unregister(void); > > +#ifdef CONFIG_X86_64 > +void __init arch_update_firmware_area(u64 addr, u64 size); > +#else > +static inline void __init arch_update_firmware_area(u64 addr, u64 size) > +{ > +} > +#endif > #endif /* _LINUX_EFI_H */ > -- > 2.43.5 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#120976): https://edk2.groups.io/g/devel/message/120976 Mute This Topic: https://groups.io/mt/110518541/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-