Add status reporting for BGRT preservation and integrate with Xen's
ACPI subsystem:
- efi_bgrt_status_info() prints preservation status (success/failure)
- Called from acpi_boot_init() after ACPI tables are processed
- Clarifying comment explains why invalidation code remains
The invalidation code in acpi_invalidate_bgrt() now acts as a safety
net: if preservation fails, the image remains in conventional RAM
and gets invalidated. If preservation succeeds, the image is in
EfiACPIReclaimMemory which won't match the RAM_TYPE_CONVENTIONAL
check, leaving the table valid.
Signed-off-by: Soumyajyotii Ssarkar <soumyajyotisarkar23@gmail.com>
---
xen/arch/x86/acpi/boot.c | 8 ++++++++
xen/common/efi/boot.c | 16 ++++++++++++++++
xen/include/xen/efi.h | 1 +
3 files changed, 25 insertions(+)
diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
index 1ca2360e00..20afe79db9 100644
--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -29,6 +29,7 @@
#include <xen/mm.h>
#include <xen/param.h>
#include <xen/dmi.h>
+#include <xen/efi.h>
#include <asm/fixmap.h>
#include <asm/page.h>
#include <asm/apic.h>
@@ -327,6 +328,11 @@ static int __init cf_check acpi_parse_hpet(struct acpi_table_header *table)
return 0;
}
+/*
+ * Invalidate BGRT if image is in conventional RAM (preservation failed).
+ * If preservation succeeded, image is in EfiACPIReclaimMemory, which
+ * won't match RAM_TYPE_CONVENTIONAL check, so table remains valid.
+ */
static int __init cf_check acpi_invalidate_bgrt(struct acpi_table_header *table)
{
struct acpi_table_bgrt *bgrt_tbl =
@@ -754,5 +760,7 @@ int __init acpi_boot_init(void)
acpi_table_parse(ACPI_SIG_BGRT, acpi_invalidate_bgrt);
+ efi_bgrt_status_info();
+
return 0;
}
diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index e6451130ce..68e06d707c 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -1911,6 +1911,22 @@ static bool __init cf_check rt_range_valid(unsigned long smfn, unsigned long emf
return true;
}
+void __init efi_bgrt_status_info(void)
+{
+ if ( !efi_enabled(EFI_BOOT) )
+ return;
+
+ if ( bgrt_info.preserved )
+ {
+ printk(XENLOG_INFO "EFI: BGRT image preserved: %lu KB\n",
+ bgrt_info.size / 1024);
+ printk(XENLOG_INFO "EFI: BGRT relocated from %p to %p\n",
+ bgrt_info.old_addr, bgrt_info.new_addr);
+ }
+ else if ( bgrt_info.failure_reason[0] )
+ printk(XENLOG_WARNING "EFI: BGRT preservation failed: %s\n",
+ bgrt_info.failure_reason);
+}
void __init efi_init_memory(void)
{
diff --git a/xen/include/xen/efi.h b/xen/include/xen/efi.h
index 723cb80852..e72ab3c6b5 100644
--- a/xen/include/xen/efi.h
+++ b/xen/include/xen/efi.h
@@ -39,6 +39,7 @@ static inline bool efi_enabled(unsigned int feature)
extern bool efi_secure_boot;
void efi_init_memory(void);
+void efi_bgrt_status_info(void);
bool efi_boot_mem_unused(unsigned long *start, unsigned long *end);
bool efi_rs_using_pgtables(void);
unsigned long efi_get_time(void);
--
2.53.0
On 12/03/2026 11:14 am, Soumyajyotii Ssarkar wrote:
> diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
> index 1ca2360e00..20afe79db9 100644
> --- a/xen/arch/x86/acpi/boot.c
> +++ b/xen/arch/x86/acpi/boot.c
> static int __init cf_check acpi_invalidate_bgrt(struct acpi_table_header *table)
> {
> struct acpi_table_bgrt *bgrt_tbl =
> @@ -754,5 +760,7 @@ int __init acpi_boot_init(void)
>
> acpi_table_parse(ACPI_SIG_BGRT, acpi_invalidate_bgrt);
>
> + efi_bgrt_status_info();
To help with your build failure, given this call from outside EFI code,
you need...
> +
> return 0;
> }
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index e6451130ce..68e06d707c 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -1911,6 +1911,22 @@ static bool __init cf_check rt_range_valid(unsigned long smfn, unsigned long emf
> return true;
> }
>
> +void __init efi_bgrt_status_info(void)
> +{
> + if ( !efi_enabled(EFI_BOOT) )
> + return;
> +
> + if ( bgrt_info.preserved )
> + {
> + printk(XENLOG_INFO "EFI: BGRT image preserved: %lu KB\n",
> + bgrt_info.size / 1024);
> + printk(XENLOG_INFO "EFI: BGRT relocated from %p to %p\n",
> + bgrt_info.old_addr, bgrt_info.new_addr);
> + }
> + else if ( bgrt_info.failure_reason[0] )
> + printk(XENLOG_WARNING "EFI: BGRT preservation failed: %s\n",
> + bgrt_info.failure_reason);
> +}
... a matching stub function in xen/common/efi/common-stub.c
xen.efi is constructed by taking non-efi Xen and linking in a few more
object files. It is not a full rebuild with different toolchain settings.
~Andrew
© 2016 - 2026 Red Hat, Inc.