| # SPDX-License-Identifier: GPL-2.0+ |
| # Copyright (c) 2023 Linaro Limited |
| # |
| # Entry-type module for producing an empty EFI capsule |
| # |
| |
| import os |
| |
| from binman.entry import Entry |
| from binman.etype.efi_capsule import get_binman_test_guid |
| from binman.etype.section import Entry_section |
| from dtoc import fdt_util |
| from u_boot_pylib import tools |
| |
| class Entry_efi_empty_capsule(Entry_section): |
| """Generate EFI empty capsules |
| |
| The parameters needed for generation of the empty capsules can |
| be provided as properties in the entry. |
| |
| Properties / Entry arguments: |
| - image-guid: Image GUID which will be used for identifying the |
| updatable image on the board. Mandatory for accept capsule. |
| - capsule-type - String to indicate type of capsule to generate. Valid |
| values are 'accept' and 'revert'. |
| |
| For more details on the description of the capsule format, and the capsule |
| update functionality, refer Section 8.5 and Chapter 23 in the `UEFI |
| specification`_. For more information on the empty capsule, refer the |
| sections 2.3.2 and 2.3.3 in the `Dependable Boot specification`_. |
| |
| A typical accept empty capsule entry node would then look something like this |
| |
| empty-capsule { |
| type = "efi-empty-capsule"; |
| /* GUID of image being accepted */ |
| image-type-id = SANDBOX_UBOOT_IMAGE_GUID; |
| capsule-type = "accept"; |
| }; |
| |
| A typical revert empty capsule entry node would then look something like this |
| |
| empty-capsule { |
| type = "efi-empty-capsule"; |
| capsule-type = "revert"; |
| }; |
| |
| The empty capsules do not have any input payload image. |
| |
| .. _`UEFI specification`: https://uefi.org/sites/default/files/resources/UEFI_Spec_2_10_Aug29.pdf |
| .. _`Dependable Boot specification`: https://git.codelinaro.org/linaro/dependable-boot/mbfw/uploads/6f7ddfe3be24e18d4319e108a758d02e/mbfw.pdf |
| """ |
| def __init__(self, section, etype, node): |
| super().__init__(section, etype, node) |
| self.required_props = ['capsule-type'] |
| self.accept = 0 |
| self.revert = 0 |
| |
| def ReadNode(self): |
| super().ReadNode() |
| |
| self.image_guid = fdt_util.GetString(self._node, 'image-guid') |
| self.capsule_type = fdt_util.GetString(self._node, 'capsule-type') |
| |
| if self.capsule_type != 'accept' and self.capsule_type != 'revert': |
| self.Raise('capsule-type should be either \'accept\' or \'revert\'') |
| |
| if self.capsule_type == 'accept' and not self.image_guid: |
| self.Raise('Image GUID needed for generating accept capsule') |
| |
| def BuildSectionData(self, required): |
| uniq = self.GetUniqueName() |
| outfile = self._filename if self._filename else 'capsule.%s' % uniq |
| capsule_fname = tools.get_output_filename(outfile) |
| accept = True if self.capsule_type == 'accept' else False |
| guid = self.image_guid |
| if self.image_guid == "binman-test": |
| guid = get_binman_test_guid('binman-test') |
| |
| ret = self.mkeficapsule.generate_empty_capsule(guid, capsule_fname, |
| accept) |
| if ret is not None: |
| return tools.read_file(capsule_fname) |
| |
| def AddBintools(self, btools): |
| self.mkeficapsule = self.AddBintool(btools, 'mkeficapsule') |