All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marek Marczykowski-Górecki" <marmarek@invisiblethingslab.com>
To: Jason Andryuk <jason.andryuk@amd.com>
Cc: xen-devel@lists.xenproject.org,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Julien Grall" <julien@xen.org>,
	"Bertrand Marquis" <bertrand.marquis@arm.com>,
	"Michal Orzel" <michal.orzel@amd.com>,
	"Volodymyr Babchuk" <Volodymyr_Babchuk@epam.com>,
	"Daniel P. Smith" <dpsmith@apertussolutions.com>,
	"Jan Beulich" <jbeulich@suse.com>,
	"Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Roger Pau Monné" <roger@xenproject.org>,
	"Teddy Astie" <teddy.astie@vates.tech>
Subject: Re: [PATCH] xen/efi: Handle efi_memmap with Xen relocating itself
Date: Mon, 9 Nov 2026 16:11:13 +0100	[thread overview]
Message-ID: <avHikdwM2wR-GpON@mail-itl> (raw)
In-Reply-To: <20261106231818.482564-1-jason.andryuk@amd.com>

[-- Attachment #1: Type: text/plain, Size: 3847 bytes --]

On Fri, Nov 06, 2026 at 06:18:18PM -0500, Jason Andryuk wrote:
> With Xen booting via Multiboot2/GRUB on an EFI platform, and modified to
> use MULTIBOOT2_LOAD_PREFERENCE_LOW, Xen relocates itself with
> move_xen().
> 
> However a PVH dom0 shows:
> kernel: Failed to lookup header 0x77ffd000 in Xen memory map: error -3
> kernel: ACPI=0x77ffd000
> 
> ... for all the Xen efi memory map lookups.  Dumping the memory map at
> runtime showed it was scrubbed.  Because Xen relocated itself, the
> original physical address referenced through a directmap address goes
> stale.
> 
> Add efi_arch_mmap_buffer_virt() to convert from the initial value to an
> appropriate runtime value.  ARM uses Boot Services AllocatePool(), so it
> must continue to use DIRECTMAP_VIRT_START.
> 
> For x86, we use an offset into the loaded Xen binary at the time of the
> call and add the to XEN_VIRT_START.  ebmalloc() allocates from the Xen
> image memory, so it moves during relocation.  xen_phys_start is set for
> xen.efi in efi_exit_boot(), but not for xen.gz, so it cannot be used
> Use `lea __image_base__(%rip)` to get the current load address, and use
> that to calculate the offset into the Xen image.  That offset is also
> valid from XEN_VIRT_START.
> 
> Fixes: c5b9805bc1f7 ("efi: create new early memory allocator")
> Signed-off-by: Jason Andryuk <jason.andryuk@amd.com>

I did not tested this, but looks correct:
Reviewed-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>

> ---
> I think it could be seen without MULTIBOOT2_LOAD_PREFERENCE_LOW if xen
> chose to relocate itself.  But since grub usually loads xen high, it
> doesn't relocate itself.
> ---
>  xen/arch/arm/efi/efi-boot.h |  5 +++++
>  xen/arch/x86/efi/efi-boot.h | 10 ++++++++++
>  xen/common/efi/boot.c       |  2 +-
>  3 files changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
> index 069cc68b0a..717bd8d607 100644
> --- a/xen/arch/arm/efi/efi-boot.h
> +++ b/xen/arch/arm/efi/efi-boot.h
> @@ -449,6 +449,11 @@ static void *__init efi_arch_allocate_mmap_buffer(UINTN map_size)
>      return ptr;
>  }
>  
> +static void *__init efi_arch_mmap_buffer_virt(void *ptr)
> +{
> +    return ptr + DIRECTMAP_VIRT_START;
> +}
> +
>  static void __init efi_arch_edd(void)
>  {
>  }
> diff --git a/xen/arch/x86/efi/efi-boot.h b/xen/arch/x86/efi/efi-boot.h
> index d738b839ee..ffc277ccfd 100644
> --- a/xen/arch/x86/efi/efi-boot.h
> +++ b/xen/arch/x86/efi/efi-boot.h
> @@ -224,6 +224,16 @@ static void *__init efi_arch_allocate_mmap_buffer(UINTN map_size)
>      return ebmalloc(map_size);
>  }
>  
> +static void *__init efi_arch_mmap_buffer_virt(void *ptr)
> +{
> +    unsigned long load_base;
> +
> +    /* RIP-relative address is the current Xen load address. */
> +    asm("lea __image_base__(%%rip), %0" : "=r" (load_base));
> +
> +    return ptr - load_base + XEN_VIRT_START;
> +}
> +
>  static void __init efi_arch_pre_exit_boot(void)
>  {
>      if ( !trampoline_phys )
> diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
> index 89b5831691..5396bad7a5 100644
> --- a/xen/common/efi/boot.c
> +++ b/xen/common/efi/boot.c
> @@ -1425,8 +1425,8 @@ static void __init efi_exit_boot(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *Syste
>      /* Adjust pointers into EFI. */
>      efi_ct = (const void *)efi_ct + DIRECTMAP_VIRT_START;
>      efi_rs = (const void *)efi_rs + DIRECTMAP_VIRT_START;
> -    efi_memmap = (void *)efi_memmap + DIRECTMAP_VIRT_START;
>      efi_fw_vendor = (const void *)efi_fw_vendor + DIRECTMAP_VIRT_START;
> +    efi_memmap = efi_arch_mmap_buffer_virt(efi_memmap);
>  }
>  
>  /* SAF-1-safe */
> -- 
> 2.34.1
> 

-- 
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2026-11-09 15:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06 23:18 [PATCH] xen/efi: Handle efi_memmap with Xen relocating itself Jason Andryuk
2026-11-09 15:11 ` Marek Marczykowski-Górecki [this message]
2026-11-10  8:42 ` Jan Beulich
2026-11-10 14:42   ` Jason Andryuk
2026-11-10 15:14     ` Jan Beulich
2026-11-10 15:16       ` Jan Beulich

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=avHikdwM2wR-GpON@mail-itl \
    --to=marmarek@invisiblethingslab.com \
    --cc=Volodymyr_Babchuk@epam.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=bertrand.marquis@arm.com \
    --cc=dpsmith@apertussolutions.com \
    --cc=jason.andryuk@amd.com \
    --cc=jbeulich@suse.com \
    --cc=julien@xen.org \
    --cc=michal.orzel@amd.com \
    --cc=roger@xenproject.org \
    --cc=sstabellini@kernel.org \
    --cc=teddy.astie@vates.tech \
    --cc=xen-devel@lists.xenproject.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 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.