Firmware Handoff

MCU ROM passes boot state to MCU Runtime through HandoffData, a shared structure in a NOLOAD DCCM region. The platform reserves 1 KiB for this structure at a fixed address supplied to both ROM and Runtime linker scripts. The handoff is volatile: Runtime may use it after the ROM-to-Runtime reset, but software must not treat it as persistent storage across a power cycle.

Ownership

HandoffData begins with two fixed-size tables:

OffsetSizeOwnerPurpose
064 bytesROMVersion, firmware boot type, capabilities, and ROM state consumed by Runtime
6464 bytesRuntimeData produced or updated by Runtime

ROM initializes the complete defined structure during cold boot. Runtime must treat the ROM table as read-only. Runtime may update the Runtime table only after ensuring that no conflicting references exist.

Validation and Versioning

Runtime accepts a handoff only when the marker and major version match. A consumer of a field added in a later minor version must also verify that the producer's minor version includes that field and validate any field-specific validity marker.

Use the version numbers as follows:

  • Increment the minor version for an append-only, backward-compatible change.
  • Increment the major version for an incompatible change, including moving or reinterpreting an existing field.
  • Never insert an extension before an existing field or change the size of one of the original 64-byte tables.
  • Keep layout fields unconditional. If a feature is disabled, retain the same bytes as reserved or invalid data.
  • Add compile-time size and offset assertions for every ABI change.

This permits an older Runtime to ignore appended data from a newer ROM. A newer Runtime must use the minor version to avoid interpreting uninitialized bytes when booted by an older ROM. The complete structure must remain within the platform's 1 KiB reservation.

ROM Handoff Table

The 64-byte RomHandoffTable has the following layout:

OffsetSizeFieldDescription
04 bytesfht_markerHandoff marker, 0x4855434D (MCUH in little-endian)
42 bytesfht_major_verMajor ABI version
62 bytesfht_minor_verMinor ABI version
812 bytesreserved_hekReserved for compatibility with the version 1.0 layout
201 bytefirmware_boot_typeSource used to boot MCU firmware
213 bytesreservedReserved for alignment and future byte-sized fields
244 bytesmcu_rom_capabilitiesMCU ROM capability bitmap
2836 bytespaddingReserved for backward-compatible fields

Handoff version 1.2 defines firmware_boot_type as follows:

ValueBoot typeDescription
0UnknownSource is unavailable
1FlashMCU ROM loaded the firmware from flash
2StreamingEarly firmware was streamed through the I3C recovery interface; remainder firmware uses the Runtime streaming loader (typically PLDM)
OtherInvalidRuntime rejects the value

Runtime uses HandOff::firmware_boot_type() so tables from versions before 1.2 and invalid values are reported as unavailable. Userspace applications use System::firmware_boot_type(); the System capsule validates the handoff while keeping the DCCM region inaccessible to userspace. The Runtime image-loading task uses this API to select the streaming loader or flash loader. For handoff versions before 1.2, the task preserves the legacy streaming-boot behavior.

Handoff version 1.3 defines mcu_rom_capabilities as follows:

BitNameDescription
0STREAMING_BOOT_I3CMCU ROM supports streaming boot over I3C
1FLASH_BOOTMCU ROM supports flash boot
2:3ReservedROM writes zero; consumers ignore these bits
4FW_MANIFEST_DOTMCU ROM supports Device Ownership Transfer manifests
5COMPONENT_SVN_MANIFESTMCU ROM supports component SVN manifests
6ReservedROM writes zero; consumers ignore this bit
7DOT_BOOTMCU ROM supports DOT blob authentication during boot
8DOT_LOCKED_RECOVERYMCU ROM has a configured DOT locked-state recovery path
9I3C_DOT_RECOVERYMCU ROM supports DOT recovery over I3C
10:31ReservedROM writes zero; consumers ignore these bits

The bitmap describes capabilities implemented by the ROM image, independent of the source selected for the current boot. Runtime reports zero when paired with a handoff version before 1.3.

Adding Data

Small fields may replace reserved bytes when doing so preserves the size and offset of every existing field. Larger fields must be added as fixed-layout extensions after the last defined block. Each extension that can be populated later than initial handoff creation should provide an explicit validity signal, which the producer publishes only after writing all associated data.