mbox series

[0/3] Support OpenSBI firmware header

Message ID 20260901022211.2619560-1-zong.li@sifive.com
Headers show
Series Support OpenSBI firmware header | expand

Message

Zong Li Sept. 1, 2026, 2:22 a.m. UTC
This series adds OpenSBI firmware header. The motivation is when a
system where the previous booting stage runs on a dedicated boot
processor, it can load and patch the OpenSBI image in DRAM and then
release the application hart that runs OpenSBI, but it can never execute
on that hart and therefore cannot place anything in its registers, such
as $a0, $a1 and $a2

Every OpenSBI firmware image, regardless of its type (FW_DYNAMIC,
FW_JUMP or FW_PAYLOAD), starts with a fixed 128-byte header. The header
serves two purposes:

1. it lets the previous booting stage recognize an OpenSBI firmware
   image and find out what it was built for, and
2. it gives the previous booting stage a well-known place inside the
   image to hand over the boot arguments by patching a few words,
   instead of setting up the *a0*, *a1* and *a2* registers.

This series also provides a document 'docs/firmware/fw_header.md' to
describe the layout of the 128-byte OpenSBI firmware header, the
a0/a1/a2 override flags, what a previous booting stage is expected to put
in each register, and an example of how to patch the header.

Thanks Anup for discussing it and providing the ideas

Zong Li (3):
  firmware: fw_base.S: add a formatted OpenSBI firmware header
  firmware: fw_base.S: override a0, a1 and a2 from the firmware header
  docs: firmware: document the OpenSBI firmware header

 docs/firmware/fw.md        |   9 +++
 docs/firmware/fw_header.md | 127 +++++++++++++++++++++++++++++++++++++
 firmware/fw_base.S         | 100 +++++++++++++++++++++++++++++
 3 files changed, 236 insertions(+)
 create mode 100644 docs/firmware/fw_header.md

Comments

Zong Li Sept. 15, 2026, 7:47 a.m. UTC | #1
On Tue, Sep 1, 2026 at 10:22 AM Zong Li <zong.li@sifive.com> wrote:
>
> This series adds OpenSBI firmware header. The motivation is when a
> system where the previous booting stage runs on a dedicated boot
> processor, it can load and patch the OpenSBI image in DRAM and then
> release the application hart that runs OpenSBI, but it can never execute
> on that hart and therefore cannot place anything in its registers, such
> as $a0, $a1 and $a2
>
> Every OpenSBI firmware image, regardless of its type (FW_DYNAMIC,
> FW_JUMP or FW_PAYLOAD), starts with a fixed 128-byte header. The header
> serves two purposes:
>
> 1. it lets the previous booting stage recognize an OpenSBI firmware
>    image and find out what it was built for, and
> 2. it gives the previous booting stage a well-known place inside the
>    image to hand over the boot arguments by patching a few words,
>    instead of setting up the *a0*, *a1* and *a2* registers.
>
> This series also provides a document 'docs/firmware/fw_header.md' to
> describe the layout of the 128-byte OpenSBI firmware header, the
> a0/a1/a2 override flags, what a previous booting stage is expected to put
> in each register, and an example of how to patch the header.
>
> Thanks Anup for discussing it and providing the ideas
>

Hi Anup,
Could I know if this patch set looks good to you? Thanks

> Zong Li (3):
>   firmware: fw_base.S: add a formatted OpenSBI firmware header
>   firmware: fw_base.S: override a0, a1 and a2 from the firmware header
>   docs: firmware: document the OpenSBI firmware header
>
>  docs/firmware/fw.md        |   9 +++
>  docs/firmware/fw_header.md | 127 +++++++++++++++++++++++++++++++++++++
>  firmware/fw_base.S         | 100 +++++++++++++++++++++++++++++
>  3 files changed, 236 insertions(+)
>  create mode 100644 docs/firmware/fw_header.md
>
> --
> 2.43.7
>
Anup Patel Sept. 16, 2026, 5:09 a.m. UTC | #2
On Tue, Sep 15, 2026 at 1:17 PM Zong Li <zong.li@sifive.com> wrote:
>
> On Tue, Sep 1, 2026 at 10:22 AM Zong Li <zong.li@sifive.com> wrote:
> >
> > This series adds OpenSBI firmware header. The motivation is when a
> > system where the previous booting stage runs on a dedicated boot
> > processor, it can load and patch the OpenSBI image in DRAM and then
> > release the application hart that runs OpenSBI, but it can never execute
> > on that hart and therefore cannot place anything in its registers, such
> > as $a0, $a1 and $a2
> >
> > Every OpenSBI firmware image, regardless of its type (FW_DYNAMIC,
> > FW_JUMP or FW_PAYLOAD), starts with a fixed 128-byte header. The header
> > serves two purposes:
> >
> > 1. it lets the previous booting stage recognize an OpenSBI firmware
> >    image and find out what it was built for, and
> > 2. it gives the previous booting stage a well-known place inside the
> >    image to hand over the boot arguments by patching a few words,
> >    instead of setting up the *a0*, *a1* and *a2* registers.
> >
> > This series also provides a document 'docs/firmware/fw_header.md' to
> > describe the layout of the 128-byte OpenSBI firmware header, the
> > a0/a1/a2 override flags, what a previous booting stage is expected to put
> > in each register, and an example of how to patch the header.
> >
> > Thanks Anup for discussing it and providing the ideas
> >
>
> Hi Anup,
> Could I know if this patch set looks good to you? Thanks

Overall, the series is in very good shape. Once the comment about
FW_HEADER_FLAGS_OVERRIDE_A0 is addressed, I will merge.

Thanks,
Anup