Re: [PATCH 0/7] firmware: add FW_DYNAMIC_APPEND firmware type

Zong Li <[email protected]>
Newsgroups org.infradead.lists.opensbi
Message-ID <CANXhq0qQVVZCEaVQe5v7grk=KVMMPwkKfP-B=quhPOnF3GK_YQ@mail.gmail.com>
On Wed, Jul 22, 2026 at 11:56 AM Zong Li <[email protected]> wrote:
>
> On Tue, Jul 7, 2026 at 11:39 AM Zong Li <[email protected]> wrote:
> >
> > This series adds a fourth OpenSBI firmware type, FW_DYNAMIC_APPEND, next to
> > the existing FW_DYNAMIC, FW_JUMP and FW_PAYLOAD.
> >
> > Motivation
> > ==========
> >
> > FW_DYNAMIC requires the previous booting stage to build a struct
> > fw_dynamic_info in memory and pass its address in a2. Some booting stages
> > cannot easily allocate and pass such a structure, but they can load the
> > OpenSBI image and patch a few words at a known location before jumping to
> > it. FW_DYNAMIC_APPEND targets exactly that case: the struct fw_dynamic_info
> > is appended into the OpenSBI binary and patched in place by the previous
> > stage. For example, the previous boot stage runs on a dedicated hart.
> > Therefore, it cannot set up CSRs of another hart that runs OpenSBI.
> > This scenario will occurs in server systems with secure boot.
> >
> > Key design points
> > =================
> >
> >   - The appended struct fw_dynamic_info is placed immediately before .bss.
> >     .bss is NOBITS and is dropped by 'objcopy -O binary', so a structure
> >     after it would not be part of the flat .bin. Placing it before .bss
> >     makes it the last PROGBITS content, i.e. it sits at the tail of the
> >     .bin and can be located from the image size. The previous booting
> >     tage can therefore find the structure at:
> >
> >         load_address + binary_file_size - sizeof(struct fw_dynamic_info)
> >
> >   - struct fw_dynamic_info gains a new 'boot_dtb' field (info version 3)
> >     to carry the DTB address. Existing offsets are unchanged.
> >
> >   - The previous booting stage patches every field at runtime. The
> >     reservation is a KEEP() PROGBITS section, so the zero-initialised
> >     bytes still land at the tail of the .bin.
> >
> >   - On the cold-boot path (guarded by FW_DYNAMIC_APPEND), fw_base.S calls
> >     fw_dynamic_append_boot_args() in fw_dynamic_append.S. The helper sets
> >     a0 = mhartid, a2 = &appended struct, and a1 = boot_dtb, and clears the
> >     reserved a3/a4 that fw_platform_init consumes. Only a0-a4 are handled
> >     here, the remaining GPRs are already cleared by the existing _reset_regs
> >     later on the cold path. The boot_dtb load is gated on info version 3, so
> >     an older layout leaves a1 = 0 instead of reading past the struct.
> >
> > Backward compatibility
> > ======================
> >
> > All changes for the existing three firmware types are compiled out: the
> > fw_base.S fixup and the .fw_dynamic_info output section are under
> > #ifdef FW_DYNAMIC_APPEND, which is defined only by fw_dynamic_append.S and
> > fw_dynamic_append.elf.ldS. FW_DYNAMIC, FW_JUMP and FW_PAYLOAD binaries are
> > byte-for-byte unchanged.
> >
> > Build
> > =====
> >
> >   make PLATFORM=<platform_subdir> FW_DYNAMIC_APPEND=y
> >
> > On the generic platform FW_DYNAMIC_APPEND=y is set in
> > platform/generic/objects.mk, so it is built by default.
> >
> > Zong Li (7):
> >   firmware: fw_dynamic: add boot_dtb field to struct fw_dynamic_info
> >   firmware: fw_base.ldS: add .fw_dynamic_info output section before .bss
> >   firmware: add fw_dynamic_append firmware type
> >   firmware: fw_base.S: call fw_dynamic_append_boot_args on cold boot
> >   firmware: build and enable the FW_DYNAMIC_APPEND firmware type
> >   docs: firmware: document the FW_DYNAMIC_APPEND firmware type
> >   docs: firmware: list FW_DYNAMIC_APPEND in fw.md
> >
> >  docs/firmware/fw.md                |  19 ++++-
> >  docs/firmware/fw_dynamic_append.md | 110 +++++++++++++++++++++++++++++
> >  firmware/external_deps.mk          |   1 +
> >  firmware/fw_base.S                 |  11 +++
> >  firmware/fw_base.ldS               |  24 +++++++
> >  firmware/fw_dynamic_append.S       | 106 +++++++++++++++++++++++++++
> >  firmware/fw_dynamic_append.elf.ldS |  24 +++++++
> >  firmware/objects.mk                |   2 +
> >  include/sbi/fw_dynamic.h           |  17 ++++-
> >  platform/generic/objects.mk        |   1 +
> >  platform/template/objects.mk       |   9 +++
> >  11 files changed, 322 insertions(+), 2 deletions(-)
> >  create mode 100644 docs/firmware/fw_dynamic_append.md
> >  create mode 100644 firmware/fw_dynamic_append.S
> >  create mode 100644 firmware/fw_dynamic_append.elf.ldS
> >
> > --
> > 2.43.7
> >
>
> Hi Anup,
> Could I know your perspective on this series. I would appreciate it if
> you could let me know if it is ready to move forward. Thanks

Hi Anup,
Would you mind taking a look at this series when you have a moment?
Thanks

-- 
opensbi mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/opensbi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.