From e7a71694467a5e7e5a4b8f36a3a2f6c0dd3c80c3 Mon Sep 17 00:00:00 2001 From: Tuan Phan Date: Thu, 28 Sep 2023 14:14:03 -0700 Subject: StandaloneMmPkg: Make StandaloneMmCpu driver architecture independent StandaloneMmCpu now can supports more architectures like RISC-V besides ARM/AARCH64. Signed-off-by: Tuan Phan Reviewed-by: levi.yun Reviewed-by: Sami Mujawar --- .../Drivers/StandaloneMmCpu/EventHandle.c | 25 ++---- .../Drivers/StandaloneMmCpu/StandaloneMmCpu.c | 42 +++++----- .../Drivers/StandaloneMmCpu/StandaloneMmCpu.h | 82 ------------------- .../Drivers/StandaloneMmCpu/StandaloneMmCpu.inf | 9 +-- StandaloneMmPkg/Include/StandaloneMmCpu.h | 94 ++++++++++++++++++++++ StandaloneMmPkg/StandaloneMmPkg.dec | 2 +- 6 files changed, 123 insertions(+), 131 deletions(-) delete mode 100644 StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h create mode 100644 StandaloneMmPkg/Include/StandaloneMmCpu.h diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c index 818e147f87..dc11d4375a 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/EventHandle.c @@ -3,6 +3,7 @@ Copyright (c) 2016 HP Development Company, L.P. Copyright (c) 2016 - 2021, Arm Limited. All rights reserved. Copyright (c) 2021, Linaro Limited + Copyright (c) 2023, Ventana Micro System Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -11,8 +12,6 @@ #include #include -#include -#include #include #include #include @@ -22,10 +21,7 @@ #include #include -#include -#include - -#include "StandaloneMmCpu.h" +#include EFI_STATUS EFIAPI @@ -108,7 +104,7 @@ CheckBufferAddr ( } /** - The PI Standalone MM entry point for the TF-A CPU driver. + The PI Standalone MM entry point for the CPU driver. @param [in] EventId The event Id. @param [in] CpuNumber The CPU number. @@ -121,7 +117,7 @@ CheckBufferAddr ( @retval EFI_UNSUPPORTED Operation not supported. **/ EFI_STATUS -PiMmStandaloneArmTfCpuDriverEntry ( +PiMmStandaloneMmCpuDriverEntry ( IN UINTN EventId, IN UINTN CpuNumber, IN UINTN NsCommBufferAddr @@ -135,17 +131,6 @@ PiMmStandaloneArmTfCpuDriverEntry ( DEBUG ((DEBUG_INFO, "Received event - 0x%x on cpu %d\n", EventId, CpuNumber)); Status = EFI_SUCCESS; - // - // ARM TF passes SMC FID of the MM_COMMUNICATE interface as the Event ID upon - // receipt of a synchronous MM request. Use the Event ID to distinguish - // between synchronous and asynchronous events. - // - if ((ARM_SMC_ID_MM_COMMUNICATE != EventId) && - (ARM_SVC_ID_FFA_MSG_SEND_DIRECT_REQ != EventId)) - { - DEBUG ((DEBUG_ERROR, "UnRecognized Event - 0x%x\n", EventId)); - return EFI_INVALID_PARAMETER; - } // Perform parameter validation of NsCommBufferAddr if (NsCommBufferAddr == (UINTN)NULL) { @@ -177,7 +162,7 @@ PiMmStandaloneArmTfCpuDriverEntry ( } // X1 contains the VA of the normal world memory accessible from - // S-EL0 + // secure world. CopyMem (GuidedEventContext, (CONST VOID *)NsCommBufferAddr, NsCommBufferSize); // Stash the pointer to the allocated Event Context for this CPU diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c index 3d1dc6181b..c5ec1a5a80 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.c @@ -3,6 +3,7 @@ Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
Copyright (c) 2016 HP Development Company, L.P. Copyright (c) 2016 - 2021, Arm Limited. All rights reserved. + Copyright (c) 2023, Ventana Micro System Inc. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -10,10 +11,7 @@ #include #include -#include #include -#include -#include #include #include @@ -22,7 +20,7 @@ #include #include -#include "StandaloneMmCpu.h" +#include // GUID to identify HOB with whereabouts of communication buffer with Normal // World @@ -31,7 +29,7 @@ extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid; // GUID to identify HOB where the entry point of this CPU driver will be // populated to allow the entry point driver to invoke it upon receipt of an // event -extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid; +extern EFI_GUID gEfiMmCpuDriverEpDescriptorGuid; // // Private copy of the MM system table for future use @@ -96,17 +94,17 @@ StandaloneMmCpuInitialize ( IN EFI_MM_SYSTEM_TABLE *SystemTable // not actual systemtable ) { - ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc; - EFI_CONFIGURATION_TABLE *ConfigurationTable; - MP_INFORMATION_HOB_DATA *MpInformationHobData; - EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange; - EFI_STATUS Status; - EFI_HANDLE DispatchHandle; - UINT32 MpInfoSize; - UINTN Index; - UINTN ArraySize; - VOID *HobStart; - EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob; + MM_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc; + EFI_CONFIGURATION_TABLE *ConfigurationTable; + MP_INFORMATION_HOB_DATA *MpInformationHobData; + EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange; + EFI_STATUS Status; + EFI_HANDLE DispatchHandle; + UINT32 MpInfoSize; + UINTN Index; + UINTN ArraySize; + VOID *HobStart; + EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob; ASSERT (SystemTable != NULL); mMmst = SystemTable; @@ -133,7 +131,7 @@ StandaloneMmCpuInitialize ( } // Retrieve the Hoblist from the MMST to extract the details of the NS - // communication buffer that has been reserved by S-EL1/EL3 + // communication buffer that has been reserved for StandaloneMmPkg ConfigurationTable = mMmst->MmConfigurationTable; for (Index = 0; Index < mMmst->NumberOfTableEntries; Index++) { if (CompareGuid (&gEfiHobListGuid, &(ConfigurationTable[Index].VendorGuid))) { @@ -154,11 +152,11 @@ StandaloneMmCpuInitialize ( // Status = GetGuidedHobData ( HobStart, - &gEfiArmTfCpuDriverEpDescriptorGuid, + &gEfiMmCpuDriverEpDescriptorGuid, (VOID **)&CpuDriverEntryPointDesc ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "ArmTfCpuDriverEpDesc HOB data extraction failed - 0x%x\n", Status)); + DEBUG ((DEBUG_ERROR, "MmCpuDriverEpDesc HOB data extraction failed - 0x%x\n", Status)); return Status; } @@ -166,10 +164,10 @@ StandaloneMmCpuInitialize ( DEBUG (( DEBUG_INFO, "Sharing Cpu Driver EP *0x%lx = 0x%lx\n", - (UINTN)CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr, - (UINTN)PiMmStandaloneArmTfCpuDriverEntry + (UINTN)CpuDriverEntryPointDesc->MmCpuDriverEpPtr, + (UINTN)PiMmStandaloneMmCpuDriverEntry )); - *(CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr) = PiMmStandaloneArmTfCpuDriverEntry; + *(CpuDriverEntryPointDesc->MmCpuDriverEpPtr) = PiMmStandaloneMmCpuDriverEntry; // Find the descriptor that contains the whereabouts of the buffer for // communication with the Normal world. diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h deleted file mode 100644 index 3d4698ec19..0000000000 --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.h +++ /dev/null @@ -1,82 +0,0 @@ -/** @file - Private header with declarations and definitions specific to the MM Standalone - CPU driver - - Copyright (c) 2017 - 2021, Arm Limited. All rights reserved. - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef _ARM_TF_CPU_DRIVER_H_ -#define _ARM_TF_CPU_DRIVER_H_ - -#include -#include -#include -#include - -// -// CPU driver initialization specific declarations -// -extern EFI_MM_SYSTEM_TABLE *mMmst; - -// -// CPU State Save protocol specific declarations -// -extern EFI_MM_CPU_PROTOCOL mMmCpuState; - -// -// MM event handling specific declarations -// -extern EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext; -extern EFI_MMRAM_DESCRIPTOR mNsCommBuffer; -extern EFI_MMRAM_DESCRIPTOR mSCommBuffer; -extern MP_INFORMATION_HOB_DATA *mMpInformationHobData; -extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig; - -/** - The PI Standalone MM entry point for the TF-A CPU driver. - - @param [in] EventId The event Id. - @param [in] CpuNumber The CPU number. - @param [in] NsCommBufferAddr Address of the NS common buffer. - - @retval EFI_SUCCESS Success. - @retval EFI_INVALID_PARAMETER A parameter was invalid. - @retval EFI_ACCESS_DENIED Access not permitted. - @retval EFI_OUT_OF_RESOURCES Out of resources. - @retval EFI_UNSUPPORTED Operation not supported. -**/ -EFI_STATUS -PiMmStandaloneArmTfCpuDriverEntry ( - IN UINTN EventId, - IN UINTN CpuNumber, - IN UINTN NsCommBufferAddr - ); - -/** - This function is the main entry point for an MM handler dispatch - or communicate-based callback. - - @param DispatchHandle The unique handle assigned to this handler by - MmiHandlerRegister(). - @param Context Points to an optional handler context which was - specified when the handler was registered. - @param CommBuffer A pointer to a collection of data in memory that will - be conveyed from a non-MM environment into an - MM environment. - @param CommBufferSize The size of the CommBuffer. - - @return Status Code - -**/ -EFI_STATUS -EFIAPI -PiMmCpuTpFwRootMmiHandler ( - IN EFI_HANDLE DispatchHandle, - IN CONST VOID *Context OPTIONAL, - IN OUT VOID *CommBuffer OPTIONAL, - IN OUT UINTN *CommBufferSize OPTIONAL - ); - -#endif diff --git a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf index 1fcb17d89d..486ccbac1b 100644 --- a/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf +++ b/StandaloneMmPkg/Drivers/StandaloneMmCpu/StandaloneMmCpu.inf @@ -1,9 +1,10 @@ ## @file -# Standalone MM CPU driver for ARM Standard Platforms +# Standalone MM CPU driver # # Copyright (c) 2009, Apple Inc. All rights reserved.
# Copyright (c) 2016 HP Development Company, L.P. # Copyright (c) 2017 - 2021, Arm Limited. All rights reserved. +# Copyright (c) 2023, Ventana Micro System Inc. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent ## @@ -19,18 +20,14 @@ [Sources] StandaloneMmCpu.c - StandaloneMmCpu.h EventHandle.c [Packages] - ArmPkg/ArmPkg.dec MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec StandaloneMmPkg/StandaloneMmPkg.dec [LibraryClasses] - ArmLib - ArmSvcLib BaseMemoryLib DebugLib HobLib @@ -46,7 +43,7 @@ gZeroGuid gMpInformationHobGuid gEfiStandaloneMmNonSecureBufferGuid - gEfiArmTfCpuDriverEpDescriptorGuid + gEfiMmCpuDriverEpDescriptorGuid [Depex] TRUE diff --git a/StandaloneMmPkg/Include/StandaloneMmCpu.h b/StandaloneMmPkg/Include/StandaloneMmCpu.h new file mode 100644 index 0000000000..1dce7c132e --- /dev/null +++ b/StandaloneMmPkg/Include/StandaloneMmCpu.h @@ -0,0 +1,94 @@ +/** @file + Private header with declarations and definitions specific to the MM Standalone + CPU driver + + Copyright (c) 2017 - 2021, Arm Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef MM_CPU_DRIVER_H_ +#define MM_CPU_DRIVER_H_ + +#include +#include +#include +#include + +typedef +EFI_STATUS +(*PI_MM_CPU_DRIVER_ENTRYPOINT) ( + IN UINTN EventId, + IN UINTN CpuNumber, + IN UINTN NsCommBufferAddr + ); + +typedef struct { + PI_MM_CPU_DRIVER_ENTRYPOINT *MmCpuDriverEpPtr; +} MM_CPU_DRIVER_EP_DESCRIPTOR; + +// +// CPU driver initialization specific declarations +// +extern EFI_MM_SYSTEM_TABLE *mMmst; + +// +// CPU State Save protocol specific declarations +// +extern EFI_MM_CPU_PROTOCOL mMmCpuState; + +// +// MM event handling specific declarations +// +extern EFI_MM_COMMUNICATE_HEADER **PerCpuGuidedEventContext; +extern EFI_MMRAM_DESCRIPTOR mNsCommBuffer; +extern EFI_MMRAM_DESCRIPTOR mSCommBuffer; +extern MP_INFORMATION_HOB_DATA *mMpInformationHobData; +extern EFI_MM_CONFIGURATION_PROTOCOL mMmConfig; + +/** + The PI Standalone MM entry point for the CPU driver. + + @param [in] EventId The event Id. + @param [in] CpuNumber The CPU number. + @param [in] NsCommBufferAddr Address of the NS common buffer. + + @retval EFI_SUCCESS Success. + @retval EFI_INVALID_PARAMETER A parameter was invalid. + @retval EFI_ACCESS_DENIED Access not permitted. + @retval EFI_OUT_OF_RESOURCES Out of resources. + @retval EFI_UNSUPPORTED Operation not supported. +**/ +EFI_STATUS +PiMmStandaloneMmCpuDriverEntry ( + IN UINTN EventId, + IN UINTN CpuNumber, + IN UINTN NsCommBufferAddr + ); + +/** + This function is the main entry point for an MM handler dispatch + or communicate-based callback. + + @param DispatchHandle The unique handle assigned to this handler by + MmiHandlerRegister(). + @param Context Points to an optional handler context which was + specified when the handler was registered. + @param CommBuffer A pointer to a collection of data in memory that will + be conveyed from a non-MM environment into an + MM environment. + @param CommBufferSize The size of the CommBuffer. + + @return Status Code + +**/ +EFI_STATUS +EFIAPI +PiMmCpuTpFwRootMmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *Context OPTIONAL, + IN OUT VOID *CommBuffer OPTIONAL, + IN OUT UINTN *CommBufferSize OPTIONAL + ); + +#endif /* MM_CPU_DRIVER_H_ */ diff --git a/StandaloneMmPkg/StandaloneMmPkg.dec b/StandaloneMmPkg/StandaloneMmPkg.dec index c43632d6d8..fc91bb4c3e 100644 --- a/StandaloneMmPkg/StandaloneMmPkg.dec +++ b/StandaloneMmPkg/StandaloneMmPkg.dec @@ -46,7 +46,7 @@ gEfiMmPeiMmramMemoryReserveGuid = { 0x0703f912, 0xbf8d, 0x4e2a, { 0xbe, 0x07, 0xab, 0x27, 0x25, 0x25, 0xc5, 0x92 }} gEfiStandaloneMmNonSecureBufferGuid = { 0xf00497e3, 0xbfa2, 0x41a1, { 0x9d, 0x29, 0x54, 0xc2, 0xe9, 0x37, 0x21, 0xc5 }} - gEfiArmTfCpuDriverEpDescriptorGuid = { 0x6ecbd5a1, 0xc0f8, 0x4702, { 0x83, 0x01, 0x4f, 0xc2, 0xc5, 0x47, 0x0a, 0x51 }} + gEfiMmCpuDriverEpDescriptorGuid = { 0x6ecbd5a1, 0xc0f8, 0x4702, { 0x83, 0x01, 0x4f, 0xc2, 0xc5, 0x47, 0x0a, 0x51 }} [PcdsFixedAtBuild, PcdsPatchableInModule] ## Maximum permitted encapsulation levels of sections in a firmware volume, -- cgit v1.2.3