From nobody Sat May 4 09:54:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72744+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72744+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1615660314; cv=none; d=zohomail.com; s=zohoarc; b=kGWhaSQoLK62uZH53jnwvJUPRriAN46UnwrbhaZGR0jx1cquqAeXSTn1lJ8NNJOw2d1WqkivUTZMON1XRAam3qd2KdcqiRr033y0b4WnkJOg4mqMLrolr/f8PvnR+52iKhSXEWAtcF7skycOz64aPYS8CKInb5+Rhrb7rcanyCc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615660314; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=QHkYV0LMEz+GEwKbYlyVONUtc3lxabcyEh02kDs4L0o=; b=E9Gbmyu1m3m3ZilRop/eP4t/mp6cF1q5bC2Yk+Sd80Y+ZANkwxW5UarWAz8MyZ3PrQ+EQ9k13k+viT9xhuZNvakJJozSKyyN7fA4Ql1zkE2ZMm/x1b/5Zu6sMIgwg78O0cmXGm+0utoa62DuUGturISGFDFFRS5pIPGiLQINNek= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72744+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1615660314101159.1655453771424; Sat, 13 Mar 2021 10:31:54 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id fkwiYY1788612xqzcOQDmHIr; Sat, 13 Mar 2021 10:31:53 -0800 X-Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by mx.groups.io with SMTP id smtpd.web09.2266.1615660309024409662 for ; Sat, 13 Mar 2021 10:31:49 -0800 X-Received: by mail-wr1-f48.google.com with SMTP id y16so6570727wrw.3 for ; Sat, 13 Mar 2021 10:31:48 -0800 (PST) X-Gm-Message-State: IhIz4KdvjsBwmO26W6Px9Ahkx1787277AA= X-Google-Smtp-Source: ABdhPJyaHHzJEVhY9qihq5M3mWN/cwBpc9tMttihj941FCNTjodTbuinJm+tskykAJLYo0mia0OiOw== X-Received: by 2002:adf:c3c8:: with SMTP id d8mr20013938wrg.167.1615660307292; Sat, 13 Mar 2021 10:31:47 -0800 (PST) X-Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id s18sm14744164wrr.27.2021.03.13.10.31.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 10:31:46 -0800 (PST) From: "Ilias Apalodimas" To: devel@edk2.groups.io, sami.mujawar@arm.com, pierre.gondois@arm.com Cc: ardb+tianocore@kernel.org, sughosh.ganu@linaro.org, leif@nuviainc.com, Ilias Apalodimas Subject: [edk2-devel] [PATCH 1/3 v7] Drivers/OpTeeRpmb: Add an OP-TEE backed RPMB driver Date: Sat, 13 Mar 2021 20:31:37 +0200 Message-Id: <20210313183139.3256104-2-ilias.apalodimas@linaro.org> In-Reply-To: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> References: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ilias.apalodimas@linaro.org Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1615660313; bh=64TUrWSyliu/elTQcI3Pwp8GaqC/W2c6L7HvbVsIUzI=; h=Cc:Date:From:Reply-To:Subject:To; b=XNoWLYW0T4cFmMW94KpYZ7jIOxIx60phhtVsWlM69VcEcm4L3ssg3cc10x2p22vYcze Oe5RoqMLqdzsFM7NQ1jgyj4wy2pRNVr8GfDb8LGaMWEQ28PEkpRQcLpzCapLdhwCNbknK 4V0FwqINrXUkQSbEZIbqE9a+OHmuoJoNwBQ= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" A following patch is adding support for building StMM in order to run it from OP-TEE. OP-TEE in combination with a NS-world supplicant can use the RPMB partition of an eMMC to store EFI variables. The supplicant functionality is currently available in U-Boot only but can be ported into EDK2. Assuming similar functionality is added in EDK2, this will allow any hardware with an RPMB partition to store EFI variables securely. So let's add a driver that enables access of the RPMB partition through OP-TEE. Since the upper layers expect a byte addressable interface, the driver allocates memory and patches the PCDs, while syncing the memory/hardware on read/write callbacks. Signed-off-by: Ilias Apalodimas Reviewed-by: Sami Mujawar sami.mujawar@arm.com --- Drivers/OpTee/OpteeRpmbPkg/FixupPcd.c | 81 ++ Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf | 43 + Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf | 58 ++ Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.c | 861 +++++++++++++++++++++ Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.h | 51 ++ 5 files changed, 1094 insertions(+) create mode 100644 Drivers/OpTee/OpteeRpmbPkg/FixupPcd.c create mode 100644 Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf create mode 100644 Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf create mode 100644 Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.c create mode 100644 Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.h diff --git a/Drivers/OpTee/OpteeRpmbPkg/FixupPcd.c b/Drivers/OpTee/OpteeRpm= bPkg/FixupPcd.c new file mode 100644 index 000000000000..56402fd1283f --- /dev/null +++ b/Drivers/OpTee/OpteeRpmbPkg/FixupPcd.c @@ -0,0 +1,81 @@ +/** @file + + Update the patched PCDs to their correct value + + Copyright (c) 2020, Linaro Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +/** + * Patch the relevant PCDs of the RPMB driver with the correct address of = the + * allocated memory + * +**/ +#include +#include +#include +#include + +#include +#include + +#include "OpTeeRpmbFvb.h" + +/** + Fixup the Pcd values for variable storage + + Since the upper layers of EDK2 expect a memory mapped interface and we c= an't + offer that from an RPMB, the driver allocates memory on init and passes = that + on the upper layers. Since the memory is dynamically allocated and we ca= n't set the + PCD in StMM context, we need to patch it correctly on each access + + @retval EFI_SUCCESS Protocol was found and PCDs patched up + @retval EFI_INVALID_PARAMETER Invalid parameter + @retval EFI_NOT_FOUND Protocol interface not found +**/ +EFI_STATUS +EFIAPI +FixPcdMemory ( + VOID + ) +{ + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *FvbProtocol; + MEM_INSTANCE *Instance; + EFI_STATUS Status; + + // + // Locate SmmFirmwareVolumeBlockProtocol + // + Status =3D gMmst->MmLocateProtocol ( + &gEfiSmmFirmwareVolumeBlockProtocolGuid, + NULL, + (VOID **) &FvbProtocol + ); + ASSERT_EFI_ERROR (Status); + + Instance =3D INSTANCE_FROM_FVB_THIS (FvbProtocol); + + // Patch PCDs with the correct values + PatchPcdSet64 (PcdFlashNvStorageVariableBase64, Instance->MemBaseAddress= ); + PatchPcdSet64 ( + PcdFlashNvStorageFtwWorkingBase64, + Instance->MemBaseAddress + PcdGet32 (PcdFlashNvStorageVariableSize) + ); + PatchPcdSet64 ( + PcdFlashNvStorageFtwSpareBase64, + Instance->MemBaseAddress + + PcdGet32 (PcdFlashNvStorageVariableSize) + + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) + ); + + DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageVariableBase64: 0x%lx\n", + __FUNCTION__, PcdGet64 (PcdFlashNvStorageVariableBase64))); + DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageFtwWorkingBase64: 0x%lx\= n", + __FUNCTION__, PcdGet64 (PcdFlashNvStorageFtwWorkingBase64))); + DEBUG ((DEBUG_INFO, "%a: Fixup PcdFlashNvStorageFtwSpareBase64: 0x%lx\n", + __FUNCTION__, PcdGet64 (PcdFlashNvStorageFtwSpareBase64))); + + return Status; +} diff --git a/Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf b/Drivers/OpTee/OpteeR= pmbPkg/FixupPcd.inf new file mode 100644 index 000000000000..5146257993ef --- /dev/null +++ b/Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf @@ -0,0 +1,43 @@ +## @file +# Instance of Base Memory Library without assembly. +# +# Copyright (c) 2020, Linaro Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +# +## + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D FixupPcd + FILE_GUID =3D a827c337-a9c6-301b-aeb7-acbc95d8da22 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 0.1 + LIBRARY_CLASS =3D RpmbPcdFixup|MM_STANDALONE + CONSTRUCTOR =3D FixPcdMemory + +[Sources] + FixupPcd.c + OpTeeRpmbFvb.h + +[Packages] + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + MmServicesTableLib + PcdLib + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + +[Protocols] + gEfiSmmFirmwareVolumeBlockProtocolGuid ## CONSUMES diff --git a/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf b/Drivers/OpTee/Opt= eeRpmbPkg/OpTeeRpmbFv.inf new file mode 100644 index 000000000000..c3580859ffde --- /dev/null +++ b/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf @@ -0,0 +1,58 @@ +## @file +# +# Component description file for OpTeeRpmbFv module +# +# Copyright (c) 2020, Linaro Ltd. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D OpTeeRpmbFv + FILE_GUID =3D 4803FC20-E583-3BCD-8C60-141E85C9A2CF + MODULE_TYPE =3D MM_STANDALONE + VERSION_STRING =3D 0.1 + PI_SPECIFICATION_VERSION =3D 0x00010032 + ENTRY_POINT =3D OpTeeRpmbFvbInit + +[Sources] + OpTeeRpmbFvb.c + OpTeeRpmbFvb.h + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + ArmSvcLib + BaseLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + MmServicesTableLib + PcdLib + StandaloneMmDriverEntryPoint + +[Guids] + gEfiAuthenticatedVariableGuid + gEfiSystemNvDataFvGuid + gEfiVariableGuid + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + +[Protocols] + gEfiSmmFirmwareVolumeBlockProtocolGuid ## PRODUCES + +[Depex] + TRUE diff --git a/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.c b/Drivers/OpTee/Opte= eRpmbPkg/OpTeeRpmbFvb.c new file mode 100644 index 000000000000..80d5b21ff12a --- /dev/null +++ b/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.c @@ -0,0 +1,861 @@ +/** @file + + FV block I/O protocol driver for RPMB eMMC accessed via OP-TEE + + Copyright (c) 2020, Linaro Ltd. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "OpTeeRpmbFvb.h" + +// These are what OP-TEE expects in ./core/arch/arm/kernel/stmm_sp.c +// Since the FFA autodiscovery mechanism is not yet implemented we are +// hardcoding the ID values for the two operations OP-TEE currently suppor= ts +// +// mMemMgrId is used to set the page permissions after relocating the exec= utable +// mStorageId is used to access the RPMB partition via OP-TEE +// In both cases the return value is located in x3. Once the autodiscovery= mechanism +// is in place, we'll have to account for an error value in x2 as well, ha= ndling +// the autodiscovery failed scenario +STATIC CONST UINT16 mMemMgrId =3D 3U; +STATIC CONST UINT16 mStorageId =3D 4U; + +STATIC MEM_INSTANCE mInstance; + +/** + Sends an SVC call to OP-TEE for reading/writing an RPMB partition + + @param[in] SvcAct SVC ID for read/write + @param[in] Addr Base address of the buffer. When reading contents= will be + copied to that buffer after reading them from the= device. + When writing, the buffer holds the contents we wa= nt to + write cwtoin the device + @param[in] NumBytes Number of bytes to read/write + @param[in] Offset Offset into the RPMB file + + @retval EFI_SUCCESS read/write ok + @retval EFI_UNSUPPORTED SVC to op-tee not supported + @retval EFI_INVALID_PARAMETER SVC to op-tee had an invalid param + @retval EFI_ACCESS_DENIED SVC to op-tee was denied + @retval EFI_OUT_OF_RESOURCES op-tee out of memory +**/ +STATIC +EFI_STATUS +ReadWriteRpmb ( + IN UINTN SvcAct, + IN UINTN Addr, + IN UINTN NumBytes, + IN UINTN Offset + ) +{ + ARM_SVC_ARGS SvcArgs; + EFI_STATUS Status; + + ZeroMem (&SvcArgs, sizeof (SvcArgs)); + + SvcArgs.Arg0 =3D ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ_AARCH64; + SvcArgs.Arg1 =3D mStorageId; + SvcArgs.Arg2 =3D 0; + SvcArgs.Arg3 =3D SvcAct; + SvcArgs.Arg4 =3D Addr; + SvcArgs.Arg5 =3D NumBytes; + SvcArgs.Arg6 =3D Offset; + + ArmCallSvc (&SvcArgs); + if (SvcArgs.Arg3) { + DEBUG ((DEBUG_ERROR, "%a: Svc Call 0x%08x Addr: 0x%08x len: 0x%x Offse= t: 0x%x failed with 0x%x\n", + __func__, SvcAct, Addr, NumBytes, Offset, SvcArgs.Arg3)); + } + + switch (SvcArgs.Arg3) { + case ARM_SVC_SPM_RET_SUCCESS: + Status =3D EFI_SUCCESS; + break; + + case ARM_SVC_SPM_RET_NOT_SUPPORTED: + Status =3D EFI_UNSUPPORTED; + break; + + case ARM_SVC_SPM_RET_INVALID_PARAMS: + Status =3D EFI_INVALID_PARAMETER; + break; + + case ARM_SVC_SPM_RET_DENIED: + Status =3D EFI_ACCESS_DENIED; + break; + + case ARM_SVC_SPM_RET_NO_MEMORY: + Status =3D EFI_OUT_OF_RESOURCES; + break; + + default: + Status =3D EFI_ACCESS_DENIED; + } + + return Status; +} + +/** + The GetAttributes() function retrieves the attributes and + current settings of the block. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL + instance. + @param[out] Attributes Pointer to EFI_FVB_ATTRIBUTES_2 in which the + attributes and current settings are + returned. Type EFI_FVB_ATTRIBUTES_2 is defined + in EFI_FIRMWARE_VOLUME_HEADER. + + @retval EFI_SUCCESS The firmware volume attributes were + returned. + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbGetAttributes ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ) +{ + *Attributes =3D EFI_FVB2_READ_ENABLED_CAP | // Reads may be enabled + EFI_FVB2_READ_STATUS | // Reads are currently enabl= ed + EFI_FVB2_WRITE_STATUS | // Writes are currently enab= led + EFI_FVB2_WRITE_ENABLED_CAP | // Writes may be enabled + EFI_FVB2_STICKY_WRITE | // A block erase is required= to flip bits into EFI_FVB2_ERASE_POLARITY + EFI_FVB2_MEMORY_MAPPED | // It is memory mapped + EFI_FVB2_ERASE_POLARITY; // After erasure all bits ta= ke this value (i.e. '1') + + return EFI_SUCCESS; +} + +/** + The SetAttributes() function sets configurable firmware volume + attributes and returns the new settings of the firmware volume. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL= instance. + @param[in] Attributes On input, Attributes is a pointer to + EFI_FVB_ATTRIBUTES_2 that contains the + desired firmware volume settings. On + successful return, it contains the new + settings of the firmware volume. Type + EFI_FVB_ATTRIBUTES_2 is defined in + EFI_FIRMWARE_VOLUME_HEADER. + + @retval EFI_UNSUPPORTED Set attributes not supported + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbSetAttributes ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN OUT EFI_FVB_ATTRIBUTES_2 *Attributes + ) +{ + DEBUG ((DEBUG_ERROR, "FvbSetAttributes(0x%X) is not supported\n", *Attri= butes)); + return EFI_UNSUPPORTED; +} + +/** + The GetPhysicalAddress() function retrieves the base address of + a memory-mapped firmware volume. This function should be called + only for memory-mapped firmware volumes. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PR= OTOCOL instance. + @param[out] Address Pointer to a caller-allocated + EFI_PHYSICAL_ADDRESS that, on successful + return from GetPhysicalAddress(), contains= the + base address of the firmware volume. + + @retval EFI_SUCCESS The firmware volume base address was retur= ned. + @retval EFI_UNSUPPORTED The firmware volume is not memory mapped. + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbGetPhysicalAddress ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + OUT EFI_PHYSICAL_ADDRESS *Address + ) +{ + MEM_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + *Address =3D Instance->MemBaseAddress; + + return EFI_SUCCESS; +} + +/** + The GetBlockSize() function retrieves the size of the requested + block. It also returns the number of additional blocks with + the identical size. The GetBlockSize() function is used to + retrieve the block map (see EFI_FIRMWARE_VOLUME_HEADER). + + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_= PROTOCOL instance. + @param[in] Lba Indicates the block for which to return = the size. + @param[out] BlockSize Pointer to a caller-allocated UINTN in w= hich + the size of the block is returned. + @param[out] NumberOfBlocks Pointer to a caller-allocated UINTN in + which the number of consecutive blocks, + starting with Lba, is returned. All + blocks in this range have a size of + BlockSize. + + @retval EFI_SUCCESS The firmware volume base address was ret= urned. + @retval EFI_INVALID_PARAMETER The requested LBA is out of range. + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbGetBlockSize ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + OUT UINTN *BlockSize, + OUT UINTN *NumberOfBlocks + ) +{ + MEM_INSTANCE *Instance; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + if (Lba > Instance->NBlocks) { + return EFI_INVALID_PARAMETER; + } + + *NumberOfBlocks =3D Instance->NBlocks - (UINTN)Lba; + *BlockSize =3D Instance->BlockSize; + + return EFI_SUCCESS; +} + +/** + Reads the specified number of bytes into a buffer from the specified blo= ck. + + The Read() function reads the requested number of bytes from the + requested block and stores them in the provided buffer. + Implementations should be mindful that the firmware volume + might be in the ReadDisabled state. If it is in this state, + the Read() function must return the status code + EFI_ACCESS_DENIED without modifying the contents of the + buffer. The Read() function must also prevent spanning block + boundaries. If a read is requested that would span a block + boundary, the read must read up to the boundary but not + beyond. The output parameter NumBytes must be set to correctly + indicate the number of bytes actually read. The caller must be + aware that a read may be partially completed. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PROT= OCOL instance. + @param[in] Lba The starting logical block index + @param[in] Offset Offset into the block at which to begin read= ing. + @param[in,out] NumBytes Pointer to a UINTN. At entry, *NumBytes + contains the total size of the buffer. At + exit, *NumBytes contains the total number of + bytes read. + @param[in,out] Buffer Pointer to a caller-allocated buffer that wi= ll + be used to hold the data that is read. + + @retval EFI_SUCCESS The firmware volume was read successfully, + and contents are in Buffer. + @retval EFI_BAD_BUFFER_SIZE Read attempted across an LBA + boundary. On output, NumBytes + contains the total number of bytes + returned in Buffer. + @retval EFI_ACCESS_DENIED The firmware volume is in the + ReadDisabled state. + @retval EFI_DEVICE_ERROR The block device is not + functioning correctly and could + not be read. + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbRead ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN OUT UINT8 *Buffer + ) +{ + EFI_STATUS Status; + MEM_INSTANCE *Instance; + VOID *Base; + + Status =3D EFI_SUCCESS; + Instance =3D INSTANCE_FROM_FVB_THIS (This); + if (!Instance->Initialized) { + Status =3D Instance->Initialize (Instance); + if (EFI_ERROR (Status)) { + return Status; + } + } + + Base =3D (VOID *)Instance->MemBaseAddress + (Lba * Instance->BlockSize) = + Offset; + // We could read the data from the RPMB instead of memory + // The 2 copies should already be identical + // Copy from memory image + CopyMem (Buffer, Base, *NumBytes); + + return Status; +} + +/** + Writes the specified number of bytes from the input buffer to the block. + + The Write() function writes the specified number of bytes from + the provided buffer to the specified block and offset. If the + firmware volume is sticky write, the caller must ensure that + all the bits of the specified range to write are in the + EFI_FVB_ERASE_POLARITY state before calling the Write() + function, or else the result will be unpredictable. This + unpredictability arises because, for a sticky-write firmware + volume, a write may negate a bit in the EFI_FVB_ERASE_POLARITY + state but cannot flip it back again. Before calling the + Write() function, it is recommended for the caller to first call + the EraseBlocks() function to erase the specified block to + write. A block erase cycle will transition bits from the + (NOT)EFI_FVB_ERASE_POLARITY state back to the + EFI_FVB_ERASE_POLARITY state. Implementations should be + mindful that the firmware volume might be in the WriteDisabled + state. If it is in this state, the Write() function must + return the status code EFI_ACCESS_DENIED without modifying the + contents of the firmware volume. The Write() function must + also prevent spanning block boundaries. If a write is + requested that spans a block boundary, the write must store up + to the boundary but not beyond. The output parameter NumBytes + must be set to correctly indicate the number of bytes actually + written. The caller must be aware that a write may be + partially completed. All writes, partial or otherwise, must be + fully flushed to the hardware before the Write() service + returns. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLO= CK_PROTOCOL + instance. + @param[in] Lba The starting logical block index to w= rite to. + @param[in] Offset Offset into the block at which to beg= in writing. + @param[in,out] NumBytes The pointer to a UINTN. At entry, *Nu= mBytes + contains the total size of the buffer= . At + exit, *NumBytes contains the total nu= mber of + bytes actually written. + @param[in] Buffer The pointer to a caller-allocated buf= fer + that contains the source for the writ= e. + + @retval EFI_SUCCESS The firmware volume was written + successfully. + @retval EFI_BAD_BUFFER_SIZE The write was attempted across an + LBA boundary. On output, NumBytes + contains the total number of bytes + actually written. + @retval EFI_ACCESS_DENIED The firmware volume is in the + WriteDisabled state. + @retval EFI_DEVICE_ERROR The block device is malfunctioning + and could not be written. +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbWrite ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + IN EFI_LBA Lba, + IN UINTN Offset, + IN OUT UINTN *NumBytes, + IN UINT8 *Buffer + ) +{ + MEM_INSTANCE *Instance; + EFI_STATUS Status; + VOID *Base; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + if (!Instance->Initialized) { + Status =3D Instance->Initialize (Instance); + if (EFI_ERROR (Status)) { + return Status; + } + } + Base =3D (VOID *)Instance->MemBaseAddress + Lba * Instance->BlockSize + = Offset; + Status =3D ReadWriteRpmb ( + SP_SVC_RPMB_WRITE, + (UINTN)Buffer, + *NumBytes, + (Lba * Instance->BlockSize) + Offset + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // Update the memory copy + CopyMem (Base, Buffer, *NumBytes); + + return Status; +} + +/** + Erases and initializes a firmware volume block. + + The EraseBlocks() function erases one or more blocks as denoted + by the variable argument list. The entire parameter list of + blocks must be verified before erasing any blocks. If a block is + requested that does not exist within the associated firmware + volume (it has a larger index than the last block of the + firmware volume), the EraseBlocks() function must return the + status code EFI_INVALID_PARAMETER without modifying the contents + of the firmware volume. Implementations should be mindful that + the firmware volume might be in the WriteDisabled state. If it + is in this state, the EraseBlocks() function must return the + status code EFI_ACCESS_DENIED without modifying the contents of + the firmware volume. All calls to EraseBlocks() must be fully + flushed to the hardware before the EraseBlocks() service + returns. + + @param[in] This Indicates the EFI_FIRMWARE_VOLUME_BLOCK_PR= OTOCOL + instance. + @param[in] ... The variable argument list is a list of tu= ples. + Each tuple describes a range of LBAs to er= ase + and consists of the following: + - An EFI_LBA that indicates the starting L= BA + - A UINTN that indicates the number of blo= cks to + erase. + + The list is terminated with an + EFI_LBA_LIST_TERMINATOR. For example, the + following indicates that two ranges of blo= cks + (5-7 and 10-11) are to be erased: EraseBlo= cks + (This, 5, 3, 10, 2, EFI_LBA_LIST_TERMINATO= R); + + @retval EFI_SUCCESS The erase request successfully + completed. + @retval EFI_ACCESS_DENIED The firmware volume is in the + WriteDisabled state. + @retval EFI_DEVICE_ERROR The block device is not functioning + correctly and could not be written. + The firmware device may have been + partially erased. + @retval EFI_INVALID_PARAMETER One or more of the LBAs listed + in the variable argument list do + not exist in the firmware volume. + +**/ +STATIC +EFI_STATUS +OpTeeRpmbFvbErase ( + IN CONST EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *This, + ... + ) +{ + MEM_INSTANCE *Instance; + UINTN NumBytes; + UINTN NumLba; + EFI_LBA Start; + VOID *Base; + VOID *Buf; + VA_LIST Args; + EFI_STATUS Status; + + Instance =3D INSTANCE_FROM_FVB_THIS (This); + + VA_START (Args, This); + for (Start =3D VA_ARG (Args, EFI_LBA); + Start !=3D EFI_LBA_LIST_TERMINATOR; + Start =3D VA_ARG (Args, EFI_LBA)) { + NumLba =3D VA_ARG (Args, UINTN); + if (NumLba =3D=3D 0 || Start + NumLba > Instance->NBlocks) { + return EFI_INVALID_PARAMETER; + } + NumBytes =3D NumLba * Instance->BlockSize; + Base =3D (VOID *)Instance->MemBaseAddress + Start * Instance->BlockSiz= e; + Buf =3D AllocatePool (NumLba * Instance->BlockSize); + if (Buf =3D=3D NULL) { + return EFI_DEVICE_ERROR; + } + SetMem64 (Buf, NumLba * Instance->BlockSize, ~0UL); + // Write the device + Status =3D ReadWriteRpmb ( + SP_SVC_RPMB_WRITE, + (UINTN)Buf, + NumBytes, + Start * Instance->BlockSize + ); + if (EFI_ERROR (Status)) { + return Status; + } + // Update the in memory copy + SetMem64 (Base, NumLba * Instance->BlockSize, ~0UL); + FreePool (Buf); + } + + VA_END (Args); + + return EFI_SUCCESS; +} + +/** + Since we use a memory backed storage we need to restore the RPMB contents + into memory before we register the Fvb protocol. + + @param Instance Address to copy flash contents to +**/ +STATIC +VOID +ReadEntireFlash ( + IN MEM_INSTANCE *Instance + ) +{ + UINTN ReadAddr; + UINTN StorageFtwWorkingSize; + UINTN StorageVariableSize; + UINTN StorageFtwSpareSize; + + StorageFtwWorkingSize =3D PcdGet32(PcdFlashNvStorageFtwWorkingSize); + StorageVariableSize =3D PcdGet32(PcdFlashNvStorageVariableSize); + StorageFtwSpareSize =3D PcdGet32(PcdFlashNvStorageFtwSpareSize); + + ReadAddr =3D Instance->MemBaseAddress; + // There's no need to check if the read failed here. The upper EDK2 laye= rs + // will initialize the flash correctly if the in-memory copy is wrong + ReadWriteRpmb ( + SP_SVC_RPMB_READ, + ReadAddr, + StorageVariableSize + StorageFtwWorkingSize + StorageFtwSpareSize, + 0 + ); +} + +/** + Validate the firmware volume header. + + @param[in] FwVolHeader Pointer to the firmware volume + header for the RPMB + + @retval EFI_SUCCESS The firmware volume header is correct + @retval EFI_NOT_FOUND No header present + @retval EFI_VOLUME_CORRUPTED The firmware volume header CRC was invalid + or either one of GUID's, Signature and hea= der + length was invalid +**/ +STATIC +EFI_STATUS +EFIAPI +ValidateFvHeader ( + IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader + ) +{ + UINT16 Checksum; + VARIABLE_STORE_HEADER *VariableStoreHeader; + UINTN VariableStoreLength; + UINTN FvLength; + + FvLength =3D PcdGet32(PcdFlashNvStorageVariableSize) + + PcdGet32(PcdFlashNvStorageFtwWorkingSize) + + PcdGet32(PcdFlashNvStorageFtwSpareSize); + + // Verify the header revision, header signature, length + // Length of FvBlock cannot be 2**64-1 + // HeaderLength cannot be an odd number + // + if ( (FwVolHeader->Revision !=3D EFI_FVH_REVISION) + || (FwVolHeader->Signature !=3D EFI_FVH_SIGNATURE) + || (FwVolHeader->FvLength !=3D FvLength)) { + DEBUG ((DEBUG_INFO, "%a: No Firmware Volume header present\n", + __FUNCTION__)); + return EFI_NOT_FOUND; + } + + // Check the Firmware Volume Guid + if (!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid)= ) { + DEBUG ((DEBUG_INFO, "%a: Firmware Volume Guid non-compatible\n", + __FUNCTION__)); + return EFI_VOLUME_CORRUPTED; + } + + // Verify the header checksum + Checksum =3D CalculateSum16((UINT16*)FwVolHeader, FwVolHeader->HeaderLen= gth); + if (Checksum !=3D 0) { + DEBUG ((DEBUG_INFO, "%a: FV checksum is invalid (Checksum:0x%X)\n", + __FUNCTION__, Checksum)); + return EFI_VOLUME_CORRUPTED; + } + + VariableStoreHeader =3D (VARIABLE_STORE_HEADER*)((UINTN)FwVolHeader + + FwVolHeader->HeaderLength); + + // Check the Variable Store Guid + if (!CompareGuid (&VariableStoreHeader->Signature, &gEfiVariableGuid) && + !CompareGuid (&VariableStoreHeader->Signature, &gEfiAuthenticatedVar= iableGuid)) { + DEBUG ((DEBUG_INFO, "%a: Variable Store Guid non-compatible\n", __FUNC= TION__)); + return EFI_VOLUME_CORRUPTED; + } + + VariableStoreLength =3D PcdGet32 (PcdFlashNvStorageVariableSize) - + FwVolHeader->HeaderLength; + if (VariableStoreHeader->Size !=3D VariableStoreLength) { + DEBUG ((DEBUG_INFO, "%a: Variable Store Length does not match\n", + __FUNCTION__)); + return EFI_VOLUME_CORRUPTED; + } + + return EFI_SUCCESS; +} + +/** + Initialize Fvb and variable storage headers for the RPMB storage. + + @param[in,out] Instance MEM_INSTANCE pointer describing the device = and + the Firmware Block Protocol + + @retval EFI_SUCCESS read/write ok + @retval EFI_UNSUPPORTED SVC to op-tee not supported + @retval EFI_INVALID_PARAMETER SVC to op-tee had an invalid par= am + @retval EFI_ACCESS_DENIED SVC to op-tee was denied + @retval EFI_OUT_OF_RESOURCES op-tee out of memory +**/ +STATIC +EFI_STATUS +InitializeFvAndVariableStoreHeaders ( + IN OUT MEM_INSTANCE *Instance + ) +{ + EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumeHeader; + VARIABLE_STORE_HEADER *VariableStoreHeader; + EFI_STATUS Status; + UINTN HeadersLength; + VOID* Headers; + + HeadersLength =3D sizeof (EFI_FIRMWARE_VOLUME_HEADER) + + sizeof (EFI_FV_BLOCK_MAP_ENTRY) + + sizeof (VARIABLE_STORE_HEADER); + Headers =3D AllocateZeroPool (HeadersLength); + if (Headers =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // EFI_FIRMWARE_VOLUME_HEADER + // + FirmwareVolumeHeader =3D (EFI_FIRMWARE_VOLUME_HEADER*)Headers; + CopyGuid (&FirmwareVolumeHeader->FileSystemGuid, &gEfiSystemNvDataFvGuid= ); + FirmwareVolumeHeader->FvLength =3D PcdGet32(PcdFlashNvStorageVariableSiz= e) + + PcdGet32(PcdFlashNvStorageFtwWorkingSiz= e) + + PcdGet32(PcdFlashNvStorageFtwSpareSize); + FirmwareVolumeHeader->Signature =3D EFI_FVH_SIGNATURE; + FirmwareVolumeHeader->Attributes =3D EFI_FVB2_READ_ENABLED_CAP | + EFI_FVB2_READ_STATUS | + EFI_FVB2_STICKY_WRITE | + EFI_FVB2_MEMORY_MAPPED | + EFI_FVB2_ERASE_POLARITY | + EFI_FVB2_WRITE_STATUS | + EFI_FVB2_WRITE_ENABLED_CAP; + + FirmwareVolumeHeader->HeaderLength =3D sizeof (EFI_FIRMWARE_VOLUME_HEADE= R) + + sizeof (EFI_FV_BLOCK_MAP_ENTRY); + FirmwareVolumeHeader->Revision =3D EFI_FVH_REVISION; + FirmwareVolumeHeader->BlockMap[0].NumBlocks =3D Instance->NBlocks; + FirmwareVolumeHeader->BlockMap[0].Length =3D Instance->BlockSize; + FirmwareVolumeHeader->BlockMap[1].NumBlocks =3D 0; + FirmwareVolumeHeader->BlockMap[1].Length =3D 0; + FirmwareVolumeHeader->Checksum =3D CalculateCheckSum16 ( + (UINT16*)FirmwareVolumeHeader, + FirmwareVolumeHeader->HeaderLength + ); + + // + // VARIABLE_STORE_HEADER + // + VariableStoreHeader =3D (VARIABLE_STORE_HEADER*)((UINTN)Headers + + FirmwareVolumeHeader->HeaderLength); + CopyGuid (&VariableStoreHeader->Signature, &gEfiAuthenticatedVariableGui= d); + VariableStoreHeader->Size =3D PcdGet32(PcdFlashNvStorageVariableSize) - + FirmwareVolumeHeader->HeaderLength; + VariableStoreHeader->Format =3D VARIABLE_STORE_FORMATTED; + VariableStoreHeader->State =3D VARIABLE_STORE_HEALTHY; + + Status =3D ReadWriteRpmb (SP_SVC_RPMB_WRITE, (UINTN)Headers, HeadersLeng= th, 0); + if (EFI_ERROR (Status)) { + goto Exit; + } + // Install the combined header in memory + CopyMem ((VOID*)Instance->MemBaseAddress, Headers, HeadersLength); + +Exit: + FreePool (Headers); + return Status; +} + +/** + Initialize the firmware block protocol for the specified memory. + + @param[in,out] Instance MEM_INSTANCE pointer describing= the device and the + Firmware Block Protocol + + @retval EFI_SUCCESS Initialized successfully or alr= eady initialized + @retval EFI_UNSUPPORTED SVC to op-tee not supported + @retval EFI_INVALID_PARAMETER SVC to op-tee had an invalid pa= ram + @retval EFI_ACCESS_DENIED SVC to op-tee was denied + @retval EFI_OUT_OF_RESOURCES op-tee out of memory +**/ +STATIC +EFI_STATUS +EFIAPI +FvbInitialize ( + IN OUT MEM_INSTANCE *Instance + ) +{ + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader; + EFI_STATUS Status; + + if (Instance->Initialized) { + return EFI_SUCCESS; + } + + // FirmwareVolumeHeader->FvLength is declared to have the Variable area + // AND the FTW working area AND the FTW Spare contiguous. + ASSERT ( + (PcdGet64 (PcdFlashNvStorageVariableBase64) + + PcdGet32 (PcdFlashNvStorageVariableSize)) =3D=3D + PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) + ); + ASSERT ( + (PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) + + PcdGet32 (PcdFlashNvStorageFtwWorkingSize)) =3D=3D + PcdGet64 (PcdFlashNvStorageFtwSpareBase64)); + + // Check if the size of the area is at least one block size + ASSERT (PcdGet32 (PcdFlashNvStorageVariableSize) / Instance->BlockSize >= 0); + ASSERT (PcdGet32 (PcdFlashNvStorageFtwWorkingSize) / Instance->BlockSize= > 0); + ASSERT (PcdGet32 (PcdFlashNvStorageFtwSpareSize) / Instance->BlockSize >= 0); + + // Ensure the Variable areas are aligned on block size boundaries + ASSERT ((PcdGet64 (PcdFlashNvStorageVariableBase64) % Instance->BlockSiz= e) =3D=3D 0); + ASSERT ((PcdGet64 (PcdFlashNvStorageFtwWorkingBase64) % Instance->BlockS= ize) =3D=3D 0); + ASSERT ((PcdGet64 (PcdFlashNvStorageFtwSpareBase64) % Instance->BlockSiz= e) =3D=3D 0); + + // Read the file from disk and copy it to memory + ReadEntireFlash (Instance); + + FwVolHeader =3D (EFI_FIRMWARE_VOLUME_HEADER *)Instance->MemBaseAddress; + Status =3D ValidateFvHeader (FwVolHeader); + if (EFI_ERROR (Status)) { + // There is no valid header, so time to install one. + DEBUG ((DEBUG_INFO, "%a: The FVB Header is not valid.\n", __FUNCTION__= )); + + // Reset memory + SetMem64 ((VOID *)Instance->MemBaseAddress, Instance->NBlocks * Instan= ce->BlockSize, ~0UL); + DEBUG ((DEBUG_INFO, "%a: Erasing Flash.\n", __FUNCTION__)); + Status =3D ReadWriteRpmb ( + SP_SVC_RPMB_WRITE, + Instance->MemBaseAddress, + PcdGet32(PcdFlashNvStorageVariableSize) + + PcdGet32(PcdFlashNvStorageFtwWorkingSize) + + PcdGet32(PcdFlashNvStorageFtwSpareSize), + 0 + ); + if (EFI_ERROR (Status)) { + return Status; + } + // Install all appropriate headers + DEBUG ((DEBUG_INFO, "%a: Installing a correct one for this volume.\n", + __FUNCTION__)); + Status =3D InitializeFvAndVariableStoreHeaders (Instance); + if (EFI_ERROR (Status)) { + return Status; + } + } else { + DEBUG ((DEBUG_INFO, "%a: Found valid FVB Header.\n", __FUNCTION__)); + } + Instance->Initialized =3D TRUE; + + return Status; +} + +/** + Since the RPMB is not byte addressable we need to allocate memory + and sync that on reads/writes. Initialize the memory and install the + Fvb protocol. + + @param[in] ImageHandle The EFI image handle + @param[in] SystemTable MM system table + + @retval EFI_SUCCESS Protocol installed + @retval EFI_INVALID_PARAMETER Invalid Pcd values specified + @retval EFI_OUT_OF_RESOURCES Can't allocate necessary memory +**/ +EFI_STATUS +EFIAPI +OpTeeRpmbFvbInit ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + VOID *Addr; + UINTN FvLength; + UINTN NBlocks; + + FvLength =3D PcdGet32(PcdFlashNvStorageVariableSize) + + PcdGet32(PcdFlashNvStorageFtwWorkingSize) + + PcdGet32(PcdFlashNvStorageFtwSpareSize); + + NBlocks =3D EFI_SIZE_TO_PAGES (ALIGN_VARIABLE (FvLength)); + Addr =3D AllocatePages (NBlocks); + if (Addr =3D=3D NULL) { + ASSERT (0); + return EFI_OUT_OF_RESOURCES; + } + + ZeroMem (&mInstance, sizeof (mInstance)); + + mInstance.FvbProtocol.GetPhysicalAddress =3D OpTeeRpmbFvbGetPhysicalAddr= ess; + mInstance.FvbProtocol.GetAttributes =3D OpTeeRpmbFvbGetAttributes; + mInstance.FvbProtocol.SetAttributes =3D OpTeeRpmbFvbSetAttributes; + mInstance.FvbProtocol.GetBlockSize =3D OpTeeRpmbFvbGetBlockSize; + mInstance.FvbProtocol.EraseBlocks =3D OpTeeRpmbFvbErase; + mInstance.FvbProtocol.Write =3D OpTeeRpmbFvbWrite; + mInstance.FvbProtocol.Read =3D OpTeeRpmbFvbRead; + + mInstance.MemBaseAddress =3D (EFI_PHYSICAL_ADDRESS)Addr; + mInstance.Signature =3D FLASH_SIGNATURE; + mInstance.Initialize =3D FvbInitialize; + mInstance.BlockSize =3D EFI_PAGE_SIZE; + mInstance.NBlocks =3D NBlocks; + + // Update the defined PCDs related to Variable Storage + PatchPcdSet64 (PcdFlashNvStorageVariableBase64, mInstance.MemBaseAddress= ); + PatchPcdSet64 ( + PcdFlashNvStorageFtwWorkingBase64, + mInstance.MemBaseAddress + PcdGet32 (PcdFlashNvStorageVariableSize) + ); + PatchPcdSet64 ( + PcdFlashNvStorageFtwSpareBase64, + mInstance.MemBaseAddress + + PcdGet32 (PcdFlashNvStorageVariableSize) + + PcdGet32 (PcdFlashNvStorageFtwWorkingSize) + ); + + Status =3D gMmst->MmInstallProtocolInterface ( + &mInstance.Handle, + &gEfiSmmFirmwareVolumeBlockProtocolGuid, + EFI_NATIVE_INTERFACE, + &mInstance.FvbProtocol + ); + ASSERT_EFI_ERROR (Status); + + DEBUG ((DEBUG_INFO, "%a: Register OP-TEE RPMB Fvb\n", __FUNCTION__)); + DEBUG ((DEBUG_INFO, "%a: Using NV store FV in-memory copy at 0x%lx\n", + __FUNCTION__, PatchPcdGet64 (PcdFlashNvStorageVariableBase64))); + + return Status; +} diff --git a/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.h b/Drivers/OpTee/Opte= eRpmbPkg/OpTeeRpmbFvb.h new file mode 100644 index 000000000000..8a8e67160758 --- /dev/null +++ b/Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFvb.h @@ -0,0 +1,51 @@ +/** @file + + Copyright (c) 2020, Linaro Ltd. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef OPTEE_RPMB_FVB_H_ +#define OPTEE_RPMB_FVB_H_ + +/** + Those are not currently defined in any spec, it's an internal + contract between OP-TEE and EDK2. + For more details check core/arch/arm/include/kernel/stmm_sp.h in OP-TEE +**/ +#define SP_SVC_RPMB_READ 0xC4000066 +#define SP_SVC_RPMB_WRITE 0xC4000067 + +#define FLASH_SIGNATURE SIGNATURE_32('r', 'p', 'm', 'b') +#define INSTANCE_FROM_FVB_THIS(a) CR(a, MEM_INSTANCE, FvbProtocol, \ + FLASH_SIGNATURE) + +typedef struct _MEM_INSTANCE MEM_INSTANCE; +typedef EFI_STATUS (*MEM_INITIALIZE) (MEM_INSTANCE* Instance); + +/** + This struct is used by the RPMB driver. Since the upper EDK2 layers + expect byte addressable memory, we allocate a memory area of certain + size and sync it to the hardware on reads/writes. +**/ +struct _MEM_INSTANCE +{ + /// Internal signature used to discover the instance + UINT32 Signature; + /// Function used to initialize the instance + MEM_INITIALIZE Initialize; + /// Set to true if initialized + BOOLEAN Initialized; + /// FVB protocol of the instance + EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL FvbProtocol; + /// Handle to install + EFI_HANDLE Handle; + /// Physical address of the beggining of the allocated memory + EFI_PHYSICAL_ADDRESS MemBaseAddress; + /// Blocksize + UINT16 BlockSize; + /// Number of allocated blocks + UINT16 NBlocks; +}; + +#endif --=20 2.30.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72744): https://edk2.groups.io/g/devel/message/72744 Mute This Topic: https://groups.io/mt/81309169/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sat May 4 09:54:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72745+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72745+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1615660314; cv=none; d=zohomail.com; s=zohoarc; b=lvCRCQhKOu2qstXI7e5M2yNFqKiDE36GnCgNfHxnL07rcpDdCpgIIex0qS1/efFIy9vocq+K4oRnCvmy97YLAFWnDqTuwo5thpRSiVjCMnOToUihKODjL/LbfO56uO11nHtiRCeKocLgoFGhXSNFCOB3Hc04zbXtjViAyuwFgeI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615660314; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=GgDjDM4Ckn6Yqnf4cWuuNMl9EaUflMJmZ+sLaR5Qdfg=; b=E3WRjShHe09Zt/8Mht6GEhzjLFgippjxRLDjhiW1+k0MFp64mUAh4Iya4aBzI/AGgH8Yq0AJdJf0fCMzAUm+jHyejyIn2h0TBHnwQEeqpbtmwDGwcfF+FLWDyappfX9+0qgWDL/hsJOto8Ca60uhP/IDDKTbiRxvdqr6uXW52LI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72745+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1615660314581523.4130429015502; Sat, 13 Mar 2021 10:31:54 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id lsEbYY1788612xofEEevtlWM; Sat, 13 Mar 2021 10:31:54 -0800 X-Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by mx.groups.io with SMTP id smtpd.web09.2268.1615660310042179131 for ; Sat, 13 Mar 2021 10:31:50 -0800 X-Received: by mail-wr1-f54.google.com with SMTP id u16so6562368wrt.1 for ; Sat, 13 Mar 2021 10:31:49 -0800 (PST) X-Gm-Message-State: rkwsrR6JTEyYHHRe5fh32sCdx1787277AA= X-Google-Smtp-Source: ABdhPJw02sYWC/Km7TlaB2EYL+ItE1w6hS4j+//SG3/2yiVr+N3qinf81XbjEPv85gWzX+m9U0O3fA== X-Received: by 2002:adf:fec5:: with SMTP id q5mr19195064wrs.43.1615660308436; Sat, 13 Mar 2021 10:31:48 -0800 (PST) X-Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id s18sm14744164wrr.27.2021.03.13.10.31.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 10:31:48 -0800 (PST) From: "Ilias Apalodimas" To: devel@edk2.groups.io, sami.mujawar@arm.com, pierre.gondois@arm.com Cc: ardb+tianocore@kernel.org, sughosh.ganu@linaro.org, leif@nuviainc.com, Ilias Apalodimas Subject: [edk2-devel] [PATCH 2/3 v7] StMMRpmb: Add support for building StandaloneMm image for OP-TEE Date: Sat, 13 Mar 2021 20:31:38 +0200 Message-Id: <20210313183139.3256104-3-ilias.apalodimas@linaro.org> In-Reply-To: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> References: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ilias.apalodimas@linaro.org Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1615660314; bh=H/ITwAvXgjj/0srbtezgo8jh4YPhHsToG195s04jZ9g=; h=Cc:Date:From:Reply-To:Subject:To; b=Ky0LXnrMoNGMluh9isyTKR15apNpxNbqoUyxm20T0oxwfIX2cxngHgMOTxUQOolMhJt LiAblHmudCMb4fOLeOt/Mg60kHHZy7N/QR30+ySl6KNwEerMd1hsr8fVjegRm1WbczIZj k6mmEBzoi/8Lu4MeNpssJdmzJbPIFRrvkzg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" With some recent changes in OP-TEE [1] and U-Boot [2] we can compile StMM and launch it from an OP-TEE secure partition which is mimicking SPM. There's a number of advantages in this approach. In Arm world SPM, currently used for dispatching StMM, and SPD used for OP-TEE, are mutually exclusive. Since there's no application in OP-TEE for managing EFI variables, this means that one can have a secure OS or secure variable storage. By re-using StMM we have EDK2s approved application controlling variable storage and the ability to run a secure world OS. This also allows various firmware implementations to adopt EDK2 way of storing variables (including the FTW implementation), as long as OP-TEE is available on that given platform (or any other secure OS that can launch StMM and has a supplicant for handling the RPMB partition). Another advantage is that OP-TEE has the ability to access an eMMC RPMB partition to store those variables. This requires a normal world supplicant, which is implemented in U-Boot currently. The supplicant picks up the encrypted buffer from OP-TEE and wires it to the eMMC driver(s). Similar functionality can be added in EDK2 by porting the supplicant and adapt it to using the native eMMC drivers. There's is one drawback in using OP-TEE. The current SPM calls need to run to completion. This contradicts the current OP-TEE RPC call requirements, used to access the RPMB storage. Thats leads to two different SMC calls for entering secure world to access StMM. So let's add support for a platform that compiles StMM and an RPMB driver that communicates with OP-TEE to read/write the variables. For anyone interested in testing this there's repo that builds all the sources and works on QEMU [3]. [1] https://github.com/OP-TEE/optee_os/pull/3973 [2] http://u-boot.10912.n7.nabble.com/PATCH-0-7-v4-EFI-variable-support-via= -OP-TEE-td412499.html [3] https://git.linaro.org/people/ilias.apalodimas/efi_optee_variables.git/ Reviewed-by: Sami Mujawar Signed-off-by: Ilias Apalodimas --- .../PlatformStandaloneMmRpmb.dsc | 162 ++++++++++++++++++ .../PlatformStandaloneMmRpmb.fdf | 111 ++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformS= tandaloneMmRpmb.dsc create mode 100644 Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformS= tandaloneMmRpmb.fdf diff --git a/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStandalo= neMmRpmb.dsc b/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStanda= loneMmRpmb.dsc new file mode 100644 index 000000000000..f99a47ebf605 --- /dev/null +++ b/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStandaloneMmRpm= b.dsc @@ -0,0 +1,162 @@ +# +# Copyright (c) 2018, ARM Limited. All rights reserved. +# Copyright (c) 2020, Linaro Ltd. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +##########################################################################= ###### +# +# Defines Section - statements that will be processed to create a Makefile. +# +##########################################################################= ###### +[Defines] + PLATFORM_NAME =3D MmStandaloneRpmb + PLATFORM_GUID =3D A27A486E-D7B9-4D70-9F37-FED9ABE041A2 + PLATFORM_VERSION =3D 1.0 + DSC_SPECIFICATION =3D 0x0001001C + OUTPUT_DIRECTORY =3D Build/$(PLATFORM_NAME) + SUPPORTED_ARCHITECTURES =3D AARCH64 + BUILD_TARGETS =3D DEBUG|RELEASE|NOOPT + SKUID_IDENTIFIER =3D DEFAULT + FLASH_DEFINITION =3D Platform/StandaloneMm/PlatformStandal= oneMmPkg/PlatformStandaloneMmRpmb.fdf + DEFINE DEBUG_MESSAGE =3D TRUE + +##########################################################################= ###### +# +# Library Class section - list of all Library Classes needed by this Platf= orm. +# +##########################################################################= ###### +[LibraryClasses] + ArmSvcLib|ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf + ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf + BaseLib|MdePkg/Library/BaseLib/BaseLib.inf + SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf + VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/Var= iablePolicyHelperLib.inf + BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf + DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseD= ebugPrintErrorLevelLib.inf + ExtractGuidedSectionLib|EmbeddedPkg/Library/PrePiExtractGuidedSectionLib= /PrePiExtractGuidedSectionLib.inf + FvLib|StandaloneMmPkg/Library/FvLib/FvLib.inf + HobLib|StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHo= bLib.inf + IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf + MemLib|StandaloneMmPkg/Library/StandaloneMmMemLib/StandaloneMmMemLib.inf + MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmCoreMemoryAlloca= tionLib/StandaloneMmCoreMemoryAllocationLib.inf + PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf + PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf + PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf + VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyL= ib.inf + ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseRepor= tStatusCodeLibNull.inf + + # + # Entry point + # + StandaloneMmCoreEntryPoint|StandaloneMmPkg/Library/StandaloneMmCoreEntry= Point/StandaloneMmCoreEntryPoint.inf + StandaloneMmDriverEntryPoint|MdePkg/Library/StandaloneMmDriverEntryPoint= /StandaloneMmDriverEntryPoint.inf + + StandaloneMmMmuLib|ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmL= ib.inf + CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLibNull/BaseCache= MaintenanceLibNull.inf + PeCoffExtraActionLib|StandaloneMmPkg/Library/StandaloneMmPeCoffExtraActi= onLib/StandaloneMmPeCoffExtraActionLib.inf + RngLib|MdePkg/Library/BaseRngLibNull/BaseRngLibNull.inf + + SerialPortLib|MdePkg/Library/BaseSerialPortLibNull/BaseSerialPortLibNull= .inf + DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + + # + # It is not possible to prevent the ARM compiler for generic intrinsic f= unctions. + # This library provides the intrinsic functions generate by a given comp= iler. + # NULL means link this library into all ARM images. + # + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + +[LibraryClasses.common.MM_STANDALONE] + HobLib|StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf + MmServicesTableLib|MdePkg/Library/StandaloneMmServicesTableLib/Standalon= eMmServicesTableLib.inf + MemoryAllocationLib|StandaloneMmPkg/Library/StandaloneMmMemoryAllocation= Lib/StandaloneMmMemoryAllocationLib.inf + + IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf + OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf + PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecu= reLibNull.inf + SynchronizationLib|MdePkg/Library/BaseSynchronizationLib/BaseSynchroniza= tionLib.inf + TimerLib|MdePkg/Library/BaseTimerLibNullTemplate/BaseTimerLibNullTemplat= e.inf + +##########################################################################= ###### +# +# Pcd Section - list of all EDK II PCD Entries defined by this Platform +# +##########################################################################= ###### +[PcdsFeatureFlag.common] + gArmTokenSpaceGuid.PcdFfaEnable|TRUE + +[PcdsFixedAtBuild] + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x800000CF + gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xff + gEfiMdePkgTokenSpaceGuid.PcdReportStatusCodePropertyMask|0x0f + + gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x2 + # Secure Storage + gEfiSecurityPkgTokenSpaceGuid.PcdUserPhysicalPresence|TRUE + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000 + gEfiMdeModulePkgTokenSpaceGuid.PcdMaxAuthVariableSize|0x2800 + + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize|0x00004000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0x00004000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00004000 + gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x00004000 + +[PcdsPatchableInModule] + # Allocated memory for EDK2 uppers layers + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|0x0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|0x0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|0x0 + +##########################################################################= ######################### +# +# Components Section - list of the modules and components that will be pro= cessed by compilation +# tools and the EDK II tools to generate PE32/PE32+/C= off image files. +# +# Note: The EDK II DSC file is not used to specify how compiled binary ima= ges get placed +# into firmware volume images. This section is just a list of module= s to compile from +# source into UEFI-compliant binaries. +# It is the FDF file that contains information on combining binary f= iles into firmware +# volume images, whose concept is beyond UEFI and is described in PI= specification. +# Binary modules do not need to be listed in this section, as they s= hould be +# specified in the FDF file. For example: Shell binary (Shell_Full.e= fi), FAT binary (Fat.efi), +# Logo (Logo.bmp), and etc. +# There may also be modules listed in this section that are not requ= ired in the FDF file, +# When a module listed here is excluded from FDF file, then UEFI-com= pliant binary will be +# generated for it, but the binary will not be put into any firmware= volume. +# +##########################################################################= ######################### +[Components.common] + # + # Standalone MM components + # + Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf + StandaloneMmPkg/Core/StandaloneMmCore.inf + StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.inf + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandalon= eMm.inf { + + NULL|Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf + } + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf { + + AuthVariableLib|SecurityPkg/Library/AuthVariableLib/AuthVariableLib.= inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf + DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf + VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + NULL|Drivers/OpTee/OpteeRpmbPkg/FixupPcd.inf + } + +##########################################################################= ######################### +# +# BuildOptions Section - Define the module specific tool chain flags that = should be used as +# the default flags for a module. These flags are a= ppended to any +# standard flags that are defined by the build proc= ess. They can be +# applied for any modules or only those modules wit= h the specific +# module style (EDK or EDKII) specified in [Compone= nts] section. +# +##########################################################################= ######################### +[BuildOptions.AARCH64] +GCC:*_*_*_DLINK_FLAGS =3D -z common-page-size=3D0x1000 -march=3Darmv8-a+no= fp +GCC:*_*_*_CC_FLAGS =3D -mstrict-align diff --git a/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStandalo= neMmRpmb.fdf b/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStanda= loneMmRpmb.fdf new file mode 100644 index 000000000000..e175dc7b2db8 --- /dev/null +++ b/Platform/StandaloneMm/PlatformStandaloneMmPkg/PlatformStandaloneMmRpm= b.fdf @@ -0,0 +1,111 @@ +# +# Copyright (c) 2018, ARM Limited. All rights reserved. +# Copyright (c) 2020, Linaro Ltd. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +##########################################################################= ###### +# +# FD Section +# The [FD] Section is made up of the definition statements and a +# description of what goes into the Flash Device Image. Each FD section +# defines one flash "device" image. A flash device image may be one of +# the following: Removable media bootable image (like a boot floppy +# image,) an Option ROM image (that would be "flashed" into an add-in +# card,) a System "Flash" image (that would be burned into a system's +# flash) or an Update ("Capsule") image that will be used to update and +# existing system flash. +# +##########################################################################= ###### + +[FD.BL32_AP_MM] +BaseAddress =3D 0x1000 # any address apart from 0x0 +Size =3D 0x00300000 +ErasePolarity =3D 1 + +BlockSize =3D 0x00001000 +NumBlocks =3D 0x0300 + +##########################################################################= ###### +# +# Following are lists of FD Region layout which correspond to the location= s of different +# images within the flash device. +# +# Regions must be defined in ascending order and may not overlap. +# +# A Layout Region start with a eight digit hex offset (leading "0x" requir= ed) followed by +# the pipe "|" character, followed by the size of the region, also in hex = with the leading +# "0x" characters. Like: +# Offset|Size +# PcdOffsetCName|PcdSizeCName +# RegionType +# +##########################################################################= ###### + +0x00000000|0x00280000 +FV =3D FVMAIN_COMPACT + +[FV.FVMAIN_COMPACT] +FvAlignment =3D 8 +ERASE_POLARITY =3D 1 +MEMORY_MAPPED =3D TRUE +STICKY_WRITE =3D TRUE +LOCK_CAP =3D TRUE +LOCK_STATUS =3D TRUE +WRITE_DISABLED_CAP =3D TRUE +WRITE_ENABLED_CAP =3D TRUE +WRITE_STATUS =3D TRUE +WRITE_LOCK_CAP =3D TRUE +WRITE_LOCK_STATUS =3D TRUE +READ_DISABLED_CAP =3D TRUE +READ_ENABLED_CAP =3D TRUE +READ_STATUS =3D TRUE +READ_LOCK_CAP =3D TRUE +READ_LOCK_STATUS =3D TRUE + + INF StandaloneMmPkg/Core/StandaloneMmCore.inf + INF Drivers/OpTee/OpteeRpmbPkg/OpTeeRpmbFv.inf + INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStand= aloneMm.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf + INF StandaloneMmPkg/Drivers/StandaloneMmCpu/AArch64/StandaloneMmCpu.inf +##########################################################################= ###### +# +# Rules are use with the [FV] section's module INF type to define +# how an FFS file is created for a given INF file. The following Rule are = the default +# rules for the different module type. User can add the customized rules t= o define the +# content of the FFS file. +# +##########################################################################= ###### + + +##########################################################################= ## +# Example of a DXE_DRIVER FFS file with a Checksum encapsulation section = # +##########################################################################= ## +# +#[Rule.Common.DXE_DRIVER] +# FILE DRIVER =3D $(NAMED_GUID) { +# DXE_DEPEX DXE_DEPEX Optional $(INF_OUTPUT)/$(MODULE_= NAME).depex +# COMPRESS PI_STD { +# GUIDED { +# PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi +# UI STRING=3D"$(MODULE_NAME)" Optional +# VERSION STRING=3D"$(INF_VERSION)" Optional BUILD_NUM=3D$(BUILD_N= UMBER) +# } +# } +# } +# +##########################################################################= ## + +[Rule.Common.MM_CORE_STANDALONE] + FILE SEC =3D $(NAMED_GUID) FIXED { + PE32 PE32 Align =3D Auto $(INF_OUTPUT)/$(MODULE_NAME).efi + } + +[Rule.Common.MM_STANDALONE] + FILE MM_STANDALONE =3D $(NAMED_GUID) { + SMM_DEPEX SMM_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex + PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING=3D"$(MODULE_NAME)" Optional + VERSION STRING=3D"$(INF_VERSION)" Optional BUILD_NUM=3D$(BUILD_NUMBE= R) + } --=20 2.30.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72745): https://edk2.groups.io/g/devel/message/72745 Mute This Topic: https://groups.io/mt/81309171/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sat May 4 09:54:11 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+72746+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72746+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1615660317; cv=none; d=zohomail.com; s=zohoarc; b=IPxkYVkmJ2FkLFWOdhxNIbm9LOmrjGq+8EgK69KlFjLVhUE4wV3jpRnrqhYzNHWd57/rChrgZR/xJdoCiZjRCzLe6y+KzasPJEclyDeVXYo92suI0ArF6H6kIplMuOwQKZ0PUgNDNwRnxqFNO55wMWIm5RliQBjI2fboF3Ez8tA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615660317; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=YK+6IjADCekWdAwr6qjmPa+Ap8a5v//JczzVXr9Znp0=; b=O9yoge0CaL95QVco83/QFm3rEONNYCnK0tRCTDrELPLM2ompl4NsOwvoky00AvZE9dcneeJAH7MHwpLTa0O0OfwZWTLY13S83swYa+BJzaT7Cpf5YzO7tKgmCSbRyKh61kLIf93P88gEIaUsOrpxfUk3HH0o8GxnXPwniczO6v8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+72746+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1615660317177900.5042776687035; Sat, 13 Mar 2021 10:31:57 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 8p8CYY1788612xM9jLip2t8L; Sat, 13 Mar 2021 10:31:54 -0800 X-Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by mx.groups.io with SMTP id smtpd.web11.2309.1615660310906763591 for ; Sat, 13 Mar 2021 10:31:51 -0800 X-Received: by mail-wr1-f44.google.com with SMTP id a18so6528018wrc.13 for ; Sat, 13 Mar 2021 10:31:50 -0800 (PST) X-Gm-Message-State: ZlL1MVILcIgW9k9F27XnUlyyx1787277AA= X-Google-Smtp-Source: ABdhPJzHSdb8Rp/8+RZF2PW1/GueVEyqv3tvcroavJEzYU3dROhNm6oDGClWwnEP0gJuITbo1VqlxA== X-Received: by 2002:adf:ea0e:: with SMTP id q14mr20417336wrm.389.1615660309564; Sat, 13 Mar 2021 10:31:49 -0800 (PST) X-Received: from apalos.home ([2a02:587:4647:e6c6:2e56:dcff:fe9a:8f06]) by smtp.gmail.com with ESMTPSA id s18sm14744164wrr.27.2021.03.13.10.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Mar 2021 10:31:49 -0800 (PST) From: "Ilias Apalodimas" To: devel@edk2.groups.io, sami.mujawar@arm.com, pierre.gondois@arm.com Cc: ardb+tianocore@kernel.org, sughosh.ganu@linaro.org, leif@nuviainc.com, Ilias Apalodimas Subject: [edk2-devel] [PATCH 3/3 v7] Maintainers: Add maintainers for StandAloneMM and RPMB driver Date: Sat, 13 Mar 2021 20:31:39 +0200 Message-Id: <20210313183139.3256104-4-ilias.apalodimas@linaro.org> In-Reply-To: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> References: <20210313183139.3256104-1-ilias.apalodimas@linaro.org> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ilias.apalodimas@linaro.org Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1615660314; bh=YK+6IjADCekWdAwr6qjmPa+Ap8a5v//JczzVXr9Znp0=; h=Cc:Date:From:Reply-To:Subject:To; b=CYcyl/EsHnTJXiMyA3r0P2wVD6RPNI7fHvRNAzEa70veiJ7wOk+NjhKhPWYOyfwq/Zx dOzNy5OhSqhTGp2JJuiOCINyar2hF9eQ5Ka4GXVfkanzr+WWgvXDXSw5fSTxRy3/tI1WW XR94vtO/dgj5AjaUm0zwDtavUBLRgp0TVfI= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Add Sami and myself as maintainers for the new StandAlonemmPkg and the relevant RPMB driver that can be used in OP-TEE Signed-off-by: Ilias Apalodimas Reviewed-by: Sami Mujawar sami.mujawar@arm.com --- Maintainers.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Maintainers.txt b/Maintainers.txt index 56e16fc48cb4..6fdd8341057d 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -123,6 +123,11 @@ F: Drivers/OptionRomPkg/ W: https://github.com/tianocore/tianocore.github.io/wiki/OptionRomPkg M: Ray Ni =20 +StandAloneMMPkg for OP-TEE +F: Platform/StandaloneMm/PlatformStandaloneMmPkg/ +M: Sami Mujawar +M: Ilias Apalodimas + DisplayLink F: Drivers/DisplayLink/ M: Leif Lindholm @@ -292,6 +297,11 @@ M: Ard Biesheuvel M: Leif Lindholm R: Pete Batard =20 +RPMB driver for OP-TEE +F: Drivers/OpTee/OpteeRpmbPkg/ +M: Sami Mujawar +M: Ilias Apalodimas + Socionext platforms and silicon F: Platform/Socionext/ F: Silicon/NXP/Library/Pcf8563RealTimeClockLib/ --=20 2.30.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72746): https://edk2.groups.io/g/devel/message/72746 Mute This Topic: https://groups.io/mt/81309172/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-