From: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: "Alexandre Ghiti" <alex@ghiti.fr>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Arnd Bergmann" <arnd@arndb.de>,
"Catalin Marinas" <catalin.marinas@arm.com>,
"Jonathan Corbet" <corbet@lwn.net>,
"David Sterba" <dsterba@suse.com>,
"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-doc@vger.kernel.org, linux-efi@vger.kernel.org,
linux-riscv@lists.infradead.org,
"Mark Rutland" <mark.rutland@arm.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Paul Walmsley" <pjw@kernel.org>,
"Randy Dunlap" <rdunlap@infradead.org>,
"Simon Glass" <sjg@chromium.org>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Nick Terrell" <terrelln@fb.com>, "Will Deacon" <will@kernel.org>,
"Alexandre Ghiti" <alexghiti@rivosinc.com>,
"Conor Dooley" <conor.dooley@microchip.com>,
linux-integrity@vger.kernel.org,
"Palmer Dabbelt" <palmer@rivosinc.com>,
patches@lists.linux.dev, "Piotr Król" <piotr.krol@3mdeb.com>,
"Ross Philipson" <ross.philipson@gmail.com>,
"Sami Tolvanen" <samitolvanen@google.com>,
"Song Shuai" <songshuaishuai@tinylab.org>
Subject: Re: [PATCH v2 04/15] efi/libstub: Add a general way to get symbols from the vmlinux into zboot
Date: Wed, 21 Oct 2026 09:16:25 -0700 [thread overview]
Message-ID: <20261021091625.0000515e@oss.qualcomm.com> (raw)
In-Reply-To: <4-v2-989a18390eb1+486-arm64_drtm_jgg@nvidia.com>
On Fri, 2 Oct 2026 20:31:41 -0300
Jason Gunthorpe <jgg@nvidia.com> wrote:
> Currently the zboot stub has no access to symbols in the vmlinux. In
> contrast x86 has a voffsets.h header that allows the stub to know whatever
> symbols it wants for the decompressed image. ARM DRTM needs another 4
> symbol locations to work, and it also wants to compile the DRTM libstub
> code once and have it work in both zboot and embedded.
>
> The current solution in arm is "code_size" from commit 45dd403da851
> ("efi/zboot: arm64: Inject kernel code size symbol into the zboot
> payload"). This is neat, but it makes the zboot and embedded cases
> work differently.
Not a real review as linker fun is not my forte. So just some
trivial formatting comments.
>
> The x86 voffsets.h approach is also nice, but it can only work in zboot
> since it relies on 'nm vmlinux' to extract the locations. That's a
> circular dependency for the embedded stub.
>
> One idea that meets the requirements is to embed a struct of offsets
> inside the vmlinux and then have both stubs know its offset from the start
> of the image.
>
> First, each arch defines what information it wants the stub to have in a
> struct:
>
> struct efi_image_info {
> __le64 code_size;
> };
>
> Second, it populates the struct with the linker:
>
> EFI_IMAGE_INFO(
> /* code_size */
> EFI_IMAGE_INFO_OFFSET(__inittext_end)
> )
>
> This approach with the linker is guaranteed to emit a value and not a
> relocation. I looked at writing the struct initializer in C, but that can
> result in relocations inside the struct. That seemed sketchy so I stuck
> with a linker script approach.
>
> Finally, any stub code, either in zboot or embedded can access the struct
> through:
>
> const struct efi_image_info *efi_get_image_info(unsigned long image_base);
>
> The makefiles arrange that both links have a "u64 __efi_image_info_offset"
> symbol that contains the value. For vmlinux this links to a symbol created
> by the EFI_IMAGE_INFO() macro, for zboot it uses the same technique as
> code_size through the zboot.lds.
>
> Since this needs arch changes, protect it under
> CONFIG_EFI_STUB_IMAGE_INFO. The arch should define the struct and use the
Odd line wrap as moving the CONFIG up a line is still shorter than some of
the lines above.
> linker macro before enabling that config.
>
> Since everything is linked together, and the actual location of the struct
> is not fixed, this is all private within the kernel build and can't become
> ABI to any bootloader.
>
> As some follow-up work, it seems interesting to standardize on this
> mechanism and remove the PROVIDE() and voffset.h alternatives. This would
> also avoid needing to pass sysfb_primary_display through EFI from zboot,
> for example.
>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index b2988aa12f6645..4dd52ddb148401 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -83,6 +83,44 @@
> #define RO_EXCEPTION_TABLE
> #endif
>
> +/*
> + * Architecture specific information made available to the EFI stub, see
> + * CONFIG_EFI_STUB_IMAGE_INFO. The architecture describes the data with a
> + * struct efi_image_info in its asm/image.h and emits the matching bytes here
> + * through contents, using linker expressions the compiler cannot compute.
> + *
> + * Place in the same section as INIT_DATA.
> + *
> + * The architecture must also define EFI_IMAGE_INFO_SIZE to sizeof(struct
> + * efi_image_info), and that definition has to be visible to the linker script
I'd wrap this to have the whole sizeof() on one line line.
> + * before this macro is used. Keeping the two in sync is checked by a
> + * static_assert() next to the struct and by the ASSERT() below.
> + *
> + * The struct's offset from _text is emitted as a u64 at
> + * __efi_image_info_offset. The architecture aliases this location to
> + * __efistub_efi_image_info_offset for the embedded stub. The absolute
> + * _efi_image_info_offset_value contains the offset itself; Makefile.zboot
> + * extracts it with nm and zboot.lds emits it for the compressed image.
> + */
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
To: Jason Gunthorpe <jgg@nvidia.com>
Cc: "Alexandre Ghiti" <alex@ghiti.fr>,
"Albert Ou" <aou@eecs.berkeley.edu>,
"Ard Biesheuvel" <ardb@kernel.org>,
"Arnd Bergmann" <arnd@arndb.de>,
"Catalin Marinas" <catalin.marinas@arm.com>,
"Jonathan Corbet" <corbet@lwn.net>,
"David Sterba" <dsterba@suse.com>,
"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-doc@vger.kernel.org, linux-efi@vger.kernel.org,
linux-riscv@lists.infradead.org,
"Mark Rutland" <mark.rutland@arm.com>,
"Palmer Dabbelt" <palmer@dabbelt.com>,
"Paul Walmsley" <pjw@kernel.org>,
"Randy Dunlap" <rdunlap@infradead.org>,
"Simon Glass" <sjg@chromium.org>,
"Shuah Khan" <skhan@linuxfoundation.org>,
"Nick Terrell" <terrelln@fb.com>, "Will Deacon" <will@kernel.org>,
"Alexandre Ghiti" <alexghiti@rivosinc.com>,
"Conor Dooley" <conor.dooley@microchip.com>,
linux-integrity@vger.kernel.org,
"Palmer Dabbelt" <palmer@rivosinc.com>,
patches@lists.linux.dev, "Piotr Król" <piotr.krol@3mdeb.com>,
"Ross Philipson" <ross.philipson@gmail.com>,
"Sami Tolvanen" <samitolvanen@google.com>,
"Song Shuai" <songshuaishuai@tinylab.org>
Subject: Re: [PATCH v2 04/15] efi/libstub: Add a general way to get symbols from the vmlinux into zboot
Date: Wed, 21 Oct 2026 09:16:25 -0700 [thread overview]
Message-ID: <20261021091625.0000515e@oss.qualcomm.com> (raw)
In-Reply-To: <4-v2-989a18390eb1+486-arm64_drtm_jgg@nvidia.com>
On Fri, 2 Oct 2026 20:31:41 -0300
Jason Gunthorpe <jgg@nvidia.com> wrote:
> Currently the zboot stub has no access to symbols in the vmlinux. In
> contrast x86 has a voffsets.h header that allows the stub to know whatever
> symbols it wants for the decompressed image. ARM DRTM needs another 4
> symbol locations to work, and it also wants to compile the DRTM libstub
> code once and have it work in both zboot and embedded.
>
> The current solution in arm is "code_size" from commit 45dd403da851
> ("efi/zboot: arm64: Inject kernel code size symbol into the zboot
> payload"). This is neat, but it makes the zboot and embedded cases
> work differently.
Not a real review as linker fun is not my forte. So just some
trivial formatting comments.
>
> The x86 voffsets.h approach is also nice, but it can only work in zboot
> since it relies on 'nm vmlinux' to extract the locations. That's a
> circular dependency for the embedded stub.
>
> One idea that meets the requirements is to embed a struct of offsets
> inside the vmlinux and then have both stubs know its offset from the start
> of the image.
>
> First, each arch defines what information it wants the stub to have in a
> struct:
>
> struct efi_image_info {
> __le64 code_size;
> };
>
> Second, it populates the struct with the linker:
>
> EFI_IMAGE_INFO(
> /* code_size */
> EFI_IMAGE_INFO_OFFSET(__inittext_end)
> )
>
> This approach with the linker is guaranteed to emit a value and not a
> relocation. I looked at writing the struct initializer in C, but that can
> result in relocations inside the struct. That seemed sketchy so I stuck
> with a linker script approach.
>
> Finally, any stub code, either in zboot or embedded can access the struct
> through:
>
> const struct efi_image_info *efi_get_image_info(unsigned long image_base);
>
> The makefiles arrange that both links have a "u64 __efi_image_info_offset"
> symbol that contains the value. For vmlinux this links to a symbol created
> by the EFI_IMAGE_INFO() macro, for zboot it uses the same technique as
> code_size through the zboot.lds.
>
> Since this needs arch changes, protect it under
> CONFIG_EFI_STUB_IMAGE_INFO. The arch should define the struct and use the
Odd line wrap as moving the CONFIG up a line is still shorter than some of
the lines above.
> linker macro before enabling that config.
>
> Since everything is linked together, and the actual location of the struct
> is not fixed, this is all private within the kernel build and can't become
> ABI to any bootloader.
>
> As some follow-up work, it seems interesting to standardize on this
> mechanism and remove the PROVIDE() and voffset.h alternatives. This would
> also avoid needing to pass sysfb_primary_display through EFI from zboot,
> for example.
>
> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
> diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
> index b2988aa12f6645..4dd52ddb148401 100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -83,6 +83,44 @@
> #define RO_EXCEPTION_TABLE
> #endif
>
> +/*
> + * Architecture specific information made available to the EFI stub, see
> + * CONFIG_EFI_STUB_IMAGE_INFO. The architecture describes the data with a
> + * struct efi_image_info in its asm/image.h and emits the matching bytes here
> + * through contents, using linker expressions the compiler cannot compute.
> + *
> + * Place in the same section as INIT_DATA.
> + *
> + * The architecture must also define EFI_IMAGE_INFO_SIZE to sizeof(struct
> + * efi_image_info), and that definition has to be visible to the linker script
I'd wrap this to have the whole sizeof() on one line line.
> + * before this macro is used. Keeping the two in sync is checked by a
> + * static_assert() next to the struct and by the ASSERT() below.
> + *
> + * The struct's offset from _text is emitted as a u64 at
> + * __efi_image_info_offset. The architecture aliases this location to
> + * __efistub_efi_image_info_offset for the embedded stub. The absolute
> + * _efi_image_info_offset_value contains the offset itself; Makefile.zboot
> + * extracts it with nm and zboot.lds emits it for the compressed image.
> + */
>
next prev parent reply other threads:[~2026-10-21 16:16 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-02 23:31 [PATCH v2 00/15] arm64: DRTM, boot portion Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 01/15] efi/libstub: Fix error unwind freeing fdt in allocate_new_fdt_and_exit_boot() Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 02/15] efi/riscv: libstub: Don't set image_size in handle_kernel_image() Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 16:00 ` Jonathan Cameron
2026-10-21 16:00 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 03/15] efi/libstub: Free cmdline_ptr in efi_pe_entry Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 16:08 ` Jonathan Cameron
2026-10-21 16:08 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 04/15] efi/libstub: Add a general way to get symbols from the vmlinux into zboot Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 16:16 ` Jonathan Cameron [this message]
2026-10-21 16:16 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 05/15] arm64/efi: Use CONFIG_EFI_STUB_IMAGE_INFO for code_size Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 06/15] efi/zboot: Lift efi_cache_sync_image() from efi_zboot_decompress() Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 16:33 ` Jonathan Cameron
2026-10-21 16:33 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 07/15] efi/libstub: Add generic arch callbacks for DRTM Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 16:51 ` Jonathan Cameron
2026-10-21 16:51 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 08/15] efi/libstub: Have efi_kaslr_relocate_kernel() handle extra_size Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 17:06 ` Jonathan Cameron
2026-10-21 17:06 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 09/15] efi: Add a __efi_data_handoff section annotation Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 10/15] efi/libstub: Put the stub's writable data in unique sections for DRTM Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 11/15] arm64: drtm: Add macro definitions for DEN0113 Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 17:43 ` Jonathan Cameron
2026-10-21 17:43 ` Jonathan Cameron
2026-10-02 23:31 ` [PATCH v2 12/15] arm64: drtm: Update the linker script for EFI_STUB_DRTM Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-20 22:49 ` Yeoreum Yun
2026-10-20 22:49 ` Yeoreum Yun
2026-10-21 12:20 ` Jason Gunthorpe
2026-10-21 12:20 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 13/15] arm64: drtm: Add drtm_entry point to head.S Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 14/15] arm64: drtm: Call UNPROTECT_MEMORY Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-21 17:47 ` Jonathan Cameron
2026-10-21 17:47 ` Jonathan Cameron
2026-10-21 17:50 ` Jason Gunthorpe
2026-10-21 17:50 ` Jason Gunthorpe
2026-10-02 23:31 ` [PATCH v2 15/15] efi/arm64: Implement ARM64 DRTM in the stub Jason Gunthorpe
2026-10-02 23:31 ` Jason Gunthorpe
2026-10-16 16:54 ` Jason Gunthorpe
2026-10-16 16:54 ` Jason Gunthorpe
2026-10-20 23:24 ` Yeoreum Yun
2026-10-20 23:24 ` Yeoreum Yun
2026-10-20 23:34 ` Jason Gunthorpe
2026-10-20 23:34 ` Jason Gunthorpe
2026-10-21 6:14 ` Yeoreum Yun
2026-10-21 6:14 ` Yeoreum Yun
2026-10-21 8:08 ` Yeoreum Yun
2026-10-21 8:08 ` Yeoreum Yun
2026-10-21 14:06 ` Jason Gunthorpe
2026-10-21 14:06 ` Jason Gunthorpe
2026-10-21 14:17 ` Yeoreum Yun
2026-10-21 14:17 ` Yeoreum Yun
2026-10-21 18:11 ` Jonathan Cameron
2026-10-21 18:11 ` Jonathan Cameron
2026-10-21 23:39 ` Jason Gunthorpe
2026-10-21 23:39 ` Jason Gunthorpe
2026-10-22 0:31 ` Jonathan Cameron
2026-10-22 0:31 ` Jonathan Cameron
2026-10-06 10:30 ` [PATCH v2 00/15] arm64: DRTM, boot portion Ard Biesheuvel
2026-10-06 10:30 ` Ard Biesheuvel
2026-10-16 16:51 ` Jason Gunthorpe
2026-10-16 16:51 ` Jason Gunthorpe
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=20261021091625.0000515e@oss.qualcomm.com \
--to=jonathan.cameron@oss.qualcomm.com \
--cc=alex@ghiti.fr \
--cc=alexghiti@rivosinc.com \
--cc=aou@eecs.berkeley.edu \
--cc=ardb@kernel.org \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=conor.dooley@microchip.com \
--cc=corbet@lwn.net \
--cc=dsterba@suse.com \
--cc=ilias.apalodimas@linaro.org \
--cc=jgg@nvidia.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=mark.rutland@arm.com \
--cc=palmer@dabbelt.com \
--cc=palmer@rivosinc.com \
--cc=patches@lists.linux.dev \
--cc=piotr.krol@3mdeb.com \
--cc=pjw@kernel.org \
--cc=rdunlap@infradead.org \
--cc=ross.philipson@gmail.com \
--cc=samitolvanen@google.com \
--cc=sjg@chromium.org \
--cc=skhan@linuxfoundation.org \
--cc=songshuaishuai@tinylab.org \
--cc=terrelln@fb.com \
--cc=will@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 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.