[PATCH 13/13] arm-bsp/doc: corstone1000: Update architecture document with new PSA FWU implementation details
Harsimran Singh Tungal <[email protected]>
| Newsgroups | org.yoctoproject.lists.meta-arm |
|---|---|
| Message-ID | <[email protected]> |
Update the architecture documentation for Corstone-1000 to include details about the new PSA Firmware Update (FWU) implementation. The new section describes the bootloader abstraction layer (BAL), UEFI capsule update flow, FWU metadata handling, and the integration between TF-M and U-Boot for managing trial and accepted images. This documentation helps align the platform with PSA FWU requirements Signed-off-by: Harsimran Singh Tungal <[email protected]> --- .../SystemArchitecturePSAFirmwareUpdate.png | Bin 0 -> 47522 bytes .../corstone1000/software-architecture.rst | 117 ++++++++++++++---- 2 files changed, 94 insertions(+), 23 deletions(-) create mode 100644 meta-arm-bsp/documentation/corstone1000/images/SystemArchitecturePSAFirmwareUpdate.png diff --git a/meta-arm-bsp/documentation/corstone1000/images/SystemArchitecturePSAFirmwareUpdate.png b/meta-arm-bsp/documentation/corstone1000/images/SystemArchitecturePSAFirmwareUpdate.png new file mode 100644 index 0000000000000000000000000000000000000000..75cee8be7d6873ab03bfd2b790772dccd4b67458 GIT binary patch literal 47522 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 literal 0 HcmV?d00001 diff --git a/meta-arm-bsp/documentation/corstone1000/software-architecture.rst b/meta-arm-bsp/documentation/corstone1000/software-architecture.rst index a2370f60..c5bfea33 100644 --- a/meta-arm-bsp/documentation/corstone1000/software-architecture.rst +++ b/meta-arm-bsp/documentation/corstone1000/software-architecture.rst @@ -315,15 +315,49 @@ Host Secure World experience lower latency, but rely on TrustZone technology for which offers comparatively less robust security. -********************** -Secure Firmware Update -********************** - +************************** +PSA Secure Firmware Update +************************** + +The Arm Corstone-1000 platform necessitates a robust, secure, and flexible firmware update mechanism +including partial capsule update to ensure fielded devices can receive critical patches, feature enhancements, +and security fixes without compromising system integrity. To meet these requirements, we have implemented the +Platform Security Architecture (PSA) Firmware Update (FWU) framework on Corstone-1000, leveraging Trusted Firmware-M (TF-M) +for the Secure Enclave, U-Boot as the host-side client on Cortex-A, and the UEFI capsule update mechanism for payload +encapsulation. This design supports both the Fixed Virtual Platform (FVP) and the Field Programmable Gate Array (FPGA) +targets, providing consistent behavior across simulation and silicon-based deployments. The Corstone-1000 supports FWU +which complies with the `Platform Security Firmware Update for the A-profile Arm Architecture <platform-security-fwu-for-a-profile-pdf_>`__ +and `PSA Firmware Update IHI 0093 <psa-firmware-update-ihi-0093-api-reference-website_>`__ +specifications. + +To standardize and streamline capsule creation with multiple FMP payloads, the `EDK2 capsule generation tool <edk2-capsule-generation-tool-repository_>`__ +tool has been integrated into the meta-arm Yocto layer for Corstone‑1000. This integration involves defining +build rules for generating UEFI capsules as part of the firmware image build process. Configuration parameters +exposed in the recipe allow developers to specify the number of FMP payloads, target image GUIDs, version numbers etc. +This capsule ensures that all update payloads conform to the UEFI FMP specification and are ready for +validation and delivery by U‑Boot. + +The FWU solution for Corstone-1000 is composed of three primary domains: + +- Host System +- Trusted Services intermediary +- Secure Enclave + +Each domain has distinct responsibilities and communicates through standardized interfaces. + + +.. image:: images/SystemArchitecturePSAFirmwareUpdate.png + :width: 690 + :alt: SystemArchitecturePSAFirmwareUpdate -In addition to always booting authorized images, it is equally important that the device only accepts -authorized (signed) images during the firmware update process. Corstone-1000 supports over-the-air (OTA) -firmware updates and complies with the `Platform Security Firmware Update for the A-profile Arm Architecture <platform-security-fwu-for-a-profile-pdf_>`__ -specification. +On the host side, U-Boot functions as the FWU client and orchestrates the update process from capsule retrieval to +payload delivery based on `PSA FWU DEN0018 specification <psa-fwu-den0018-specification-website_>`__ +via Arm FF-A framework. The Trusted-Services SE Proxy secure partition serves as a gateway between the non-secure host +environment and the Secure Enclave. The `PSA FWU service <ts-psa-fwu-service-website_>`__ running in the Trusted Services +implementation forwards the data to the Secure Enclave via MHU-based PSA calls. Within the Secure Enclave, the PSA FWU +Agent, conforming to `PSA Firmware Update IHI 0093 <psa-firmware-update-ihi-0093-api-reference-website_>`__ specification, +orchestrates the actual flash programming, metadata management, and rollback protection mechanisms. The agent relies on a +bespoke `shim layer <tfm-shim-layer-website_>`__ to abstract hardware‑specific flash operations and bootloader interactions. As defined in the specification, the external flash is divided into two banks: one bank holds the currently running images, while the other is used to stage new images. @@ -336,23 +370,55 @@ New images are delivered and accepted in the form of UEFI capsules. :width: 690 :alt: ExternalFlash -When a firmware update is triggered, U-Boot begins by verifying the UEFI capsule by checking its signature, -version number, and size. After successful verification, it signals the Secure Enclave, which then -starts writing the capsule contents to flash memory. +When a FWU is initiated on Corstone-1000, the following sequence of operations takes place: + +#. **Capsule Retrieval and Preparation** + + U-Boot on the host system retrieves the firmware capsule. + It validates the capsule header and parses the FMP (Firmware Management Protocol) descriptor list to identify the payloads to be updated. + + For each FMP descriptor, U-Boot: + + Splits the firmware payload into 4 KiB chunks. + Invokes the PSA_FWU_Update API for each chunk, transmitting the buffer address via the FF-A (Firmware Framework for Arm) shared memory interface. + +#. **Secure Transmission and Forwarding** + + The PSA Firmware Update (FWU) service, running as part of Trusted Services, receives the chunks through Secure Partition Client (SPC) calls. + It forwards these chunks to the Secure Enclave using MHU-based PSA calls. + +#. **Flashing Within the Secure Enclave** + + Inside the Secure Enclave, the PSA FWU Agent dispatches each chunk to the shim layer. + + The shim layer: + + Erases the corresponding sectors in the non-active flash bank. + Writes the received firmware chunks at the correct offsets. + During partial updates, it also copies static partitions from the active bank to the non-active one to maintain consistency. + +#. **Finalization and Boot Preparation** + + After all chunks are successfully written: + + The shim updates the firmware manifest and the EFI System Resource Table (ESRT) entries to reflect the new image version. + This step enables the bootloader to recognize the new firmware for a trial boot. + The platform then performs an automatic reset, booting into the non-active bank in trial mode. + +#. **Trial Boot and Confirmation** + + In trial mode, U-Boot evaluates the new firmware and issues either an accept or reject command using the PSA FWU ABI. + These commands are sent to the Secure Enclave, instructing the shim to update the firmware metadata accordingly. + +#. **Recovery and Fallback Mechanism** + + If the trial boot is successful, the host sends an acknowledgment, transitioning the firmware state from 'trial' to 'regular'. -Once the write operation is complete, the Secure Enclave resets the entire system. The update process -is tracked using a state machine stored in the Metadata Block within flash. TF-M runs an OTA service -that is responsible for verifying and updating the images in the passive flash bank. Communication -between the UEFI capsule update subsystem and the OTA service follows the same data path described -earlier. After verifying the capsule, the OTA service writes the new images to the passive bank, -updates the system state to 'trial,' and initiates a reset. + If the system fails or becomes unresponsive: -During boot, the bootloaders in both the Secure Enclave and the Host system read the Metadata Block to -determine which bank to boot from. If the trial boot succeeds, the Host system sends an acknowledgment -that transitions the system state from 'trial' to 'regular.' If the system fails during the trial phase -or hangs, a watchdog timer triggers a reset. The Secure Enclave’s BL1 contains logic to detect multiple -resets and can revert to the previously known-good bank. This fallback mechanism is essential to ensure -the device remains available and functional. + A watchdog timer triggers a system reset. + The BL1 firmware in the Secure Enclave detects repeated failures and reverts to the previously known-good flash bank. + This rollback mechanism ensures the device remains operational and recoverable, even after a failed update. .. image:: images/SecureFirmwareUpdate.png @@ -401,6 +467,11 @@ References .. _arm-fmw-framework-a-profile-pdf: https://developer.arm.com/documentation/den0077/latest .. _arm-fmw-framework-m-profile-pdf: https://developer.arm.com/architectures/Firmware%20Framework%20for%20M-Profile .. _platform-security-fwu-for-a-profile-pdf: https://developer.arm.com/documentation/den0118/a/ +.. _psa-firmware-update-ihi-0093-api-reference-website: https://arm-software.github.io/psa-api/fwu/1.0/api/api.html +.. _edk2-capsule-generation-tool-repository: https://github.com/tianocore/edk2/blob/master/BaseTools/Source/Python/Capsule/GenerateCapsule.py +.. _psa-fwu-den0018-specification-website: https://developer.arm.com/documentation/den0118/latest/ +.. _ts-psa-fwu-service-website: https://trusted-services.readthedocs.io/en/stable/services/fwu/psa-fwu-m.html +.. _tfm-shim-layer-website: https://trustedfirmware-m.readthedocs.io/en/latest/design_docs/services/tfm_fwu_service.html#shim-layer-between-fwu-and-bootloader .. _op-tee-os-repository: https://github.com/OP-TEE/optee_os .. _psa-certified-website: https://www.psacertified.org/ .. _psa_l2-ready: https://www.psacertified.org/products/corstone-1000/