Hi Sughosh, Thanks a lot for picking this up. CIL..
On Tue, Jul 03, 2018 at 03:12:39PM +0530, Supreeth Venkatesh wrote: > The Standalone MM environment runs in S-EL0 in AArch64 on ARM Standard > Platforms and is initialised during the SEC phase. ARM Trusted firmware > in EL3 is responsible for initialising the architectural context for > S-EL0 and loading the Standalone MM image. The memory allocated to this > image is marked as RO+X. Heap memory is marked as RW+XN. > > Certain actions have to be completed prior to executing the generic code > in the Standalone MM Core module. These are: > > 1. Memory permission attributes for each section of the Standalone MM > Core module need to be changed prior to accessing any RW data. > > 2. A Hob list has to be created with information that allows the MM > environment to initialise and dispatch drivers. > > Furthermore, this module is responsible for handing over runtime MM > events to the Standalone MM CPU driver and returning control to ARM > Trusted Firmware upon event completion. Hence it needs to know the CPU > driver entry point. > > This patch implements an entry point module that ARM Trusted Firmware > jumps to in S-EL0. It then performs the above actions before calling the > Standalone MM Foundation entry point and handling subsequent MM events. > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Achin Gupta <achin.gu...@arm.com> > Signed-off-by: Supreeth Venkatesh <supreeth.venkat...@arm.com> > Cc: Jiewen Yao <jiewen....@intel.com> > Cc: Achin Gupta <achin.gu...@arm.com> > --- > .../Library/AArch64/StandaloneMmCoreEntryPoint.h | 214 +++++++++++++++ > .../AArch64/CreateHobList.c | 200 ++++++++++++++ > .../AArch64/SetPermissions.c | 275 ++++++++++++++++++++ > .../AArch64/StandaloneMmCoreEntryPoint.c | 287 > +++++++++++++++++++++ > .../StandaloneMmCoreEntryPoint.inf | 55 ++++ > 5 files changed, 1031 insertions(+) > create mode 100644 > StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoint.h > create mode 100644 > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/CreateHobList.c > create mode 100644 > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c > create mode 100644 > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c > create mode 100644 > StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf > > diff --git > a/StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoint.h > b/StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoint.h > new file mode 100644 > index 0000000..6eb74af > --- /dev/null > +++ b/StandaloneMmPkg/Include/Library/AArch64/StandaloneMmCoreEntryPoint.h > @@ -0,0 +1,214 @@ > +/** @file > + Entry point to the Standalone MM Foundation when initialized during the SEC > + phase on ARM platforms > + > +Copyright (c) 2017 - 2018, ARM Ltd. All rights reserved.<BR> > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BSD > License > +which accompanies this distribution. The full text of the license may be > found at > +http://opensource.org/licenses/bsd-license.php > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef __STANDALONEMMCORE_ENTRY_POINT_H__ > +#define __STANDALONEMMCORE_ENTRY_POINT_H__ > + > +#include <Library/PeCoffLib.h> > +#include <Library/FvLib.h> > + > +#define CPU_INFO_FLAG_PRIMARY_CPU 0x00000001 > + > +typedef struct { > + UINT8 Type; /* type of the structure */ > + UINT8 Version; /* version of this structure */ > + UINT16 Size; /* size of this structure in bytes */ > + UINT32 Attr; /* attributes: unused bits SBZ */ > +} EFI_PARAM_HEADER; > + > +typedef struct { > + UINT64 Mpidr; > + UINT32 LinearId; > + UINT32 Flags; > +} EFI_SECURE_PARTITION_CPU_INFO; > + > +typedef struct { > + EFI_PARAM_HEADER Header; > + UINT64 SpMemBase; > + UINT64 SpMemLimit; > + UINT64 SpImageBase; > + UINT64 SpStackBase; > + UINT64 SpHeapBase; > + UINT64 SpNsCommBufBase; > + UINT64 SpSharedBufBase; > + UINT64 SpImageSize; > + UINT64 SpPcpuStackSize; > + UINT64 SpHeapSize; > + UINT64 SpNsCommBufSize; > + UINT64 SpPcpuSharedBufSize; > + UINT32 NumSpMemRegions; > + UINT32 NumCpus; > + EFI_SECURE_PARTITION_CPU_INFO *CpuInfo; > +} EFI_SECURE_PARTITION_BOOT_INFO; > + > +typedef > +EFI_STATUS > +(*PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT) ( > + IN UINTN EventId, > + IN UINTN CpuNumber, > + IN UINTN NsCommBufferAddr > + ); > + > +typedef struct { > + PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *ArmTfCpuDriverEpPtr; > +} ARM_TF_CPU_DRIVER_EP_DESCRIPTOR; > + > +typedef RETURN_STATUS (*REGION_PERMISSION_UPDATE_FUNC) ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ); > + > +/** > + Privileged firmware assigns RO & Executable attributes to all memory > occupied > + by the Boot Firmware Volume. This function sets the correct permissions of > + sections in the Standalone MM Core module to be able to access RO and RW > data > + and make further progress in the boot process. > + > + @param ImageContext Pointer to PE/COFF image context > + @param SectionHeaderOffset Offset of PE/COFF image section header > + @param NumberOfSections Number of Sections > + @param TextUpdater Function to change code permissions > + @param ReadOnlyUpdater Function to change RO permissions > + @param ReadWriteUpdater Function to change RW permissions > + > +**/ > +EFI_STATUS > +EFIAPI > +UpdateMmFoundationPeCoffPermissions ( > + IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, > + IN UINT32 SectionHeaderOffset, > + IN CONST UINT16 NumberOfSections, > + IN REGION_PERMISSION_UPDATE_FUNC TextUpdater, > + IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater, > + IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater > + ); > + > + > +/** > + Privileged firmware assigns RO & Executable attributes to all memory > occupied > + by the Boot Firmware Volume. This function locates the section information > of > + the Standalone MM Core module to be able to change permissions of the > + individual sections later in the boot process. > + > + @param TeData Pointer to PE/COFF image data > + @param ImageContext Pointer to PE/COFF image context > + @param SectionHeaderOffset Offset of PE/COFF image section header > + @param NumberOfSections Number of Sections > + > +**/ > +EFI_STATUS > +EFIAPI > +GetStandaloneMmCorePeCoffSections ( > + IN VOID *TeData, > + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, > + IN OUT UINT32 *SectionHeaderOffset, > + IN OUT UINT16 *NumberOfSections > + ); > + > + > +/** > + Privileged firmware assigns RO & Executable attributes to all memory > occupied > + by the Boot Firmware Volume. This function locates the Standalone MM Core > + module PE/COFF image in the BFV and returns this information. > + > + @param BfvAddress Base Address of Boot Firmware Volume > + @param TeData Pointer to address for allocating memory for > + PE/COFF image data > + @param TeDataSize Pointer to size of PE/COFF image data > + > +**/ > +EFI_STATUS > +EFIAPI > +LocateStandaloneMmCorePeCoffData ( > + IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress, > + IN OUT VOID **TeData, > + IN OUT UINTN *TeDataSize > + ); > + > + > +/** > + Use the boot information passed by privileged firmware to populate a HOB > list > + suitable for consumption by the MM Core and drivers. > + > + @param CpuDriverEntryPoint Address of MM CPU driver entrypoint > + @param PayloadBootInfo Boot information passed by privileged > firmware > + > +**/ > +VOID * > +EFIAPI > +CreateHobListFromBootInfo ( > + IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint, > + IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo > + ); > + > + > +/** > + The entry point of Standalone MM Foundation. > + > + @param SharedBufAddress Pointer to the Buffer between SPM and SP. > + @param cookie1. > + @param cookie2. > +**/ > +VOID > +EFIAPI > +_ModuleEntryPoint ( > + IN VOID *SharedBufAddress, > + IN UINT64 cookie1, > + IN UINT64 cookie2 > + ); This API has been changed from the previous revision but the corresponding change has not landed in Arm TF [1]. Could you please revert to original API i.e. EFIAPI _ModuleEntryPoint ( IN VOID *SharedBufAddress, IN UINT64 SharedBufSize, IN UINT64 cookie1, IN UINT64 cookie2 ); [1] https://github.com/ARM-software/arm-trusted-firmware/blob/b6c07bbb2ed520f0b51775adb5d22b294d6971eb/services/std_svc/spm/sp_setup.c#L56 > + > + > +/** > + Auto generated function that calls the library constructors for all of the > module's dependent libraries. > + > + This function must be called by _ModuleEntryPoint(). > + This function calls the set of library constructors for the set of library > instances > + that a module depends on. This includes library instances that a module > depends on > + directly and library instances that a module depends on indirectly through > other > + libraries. This function is auto generated by build tools and those build > tools are > + responsible for collecting the set of library instances, determine which > ones have > + constructors, and calling the library constructors in the proper order > based upon > + each of the library instances own dependencies. > + > + @param ImageHandle The image handle of the DXE Core. > + @param SystemTable A pointer to the EFI System Table. > + > +**/ > +VOID > +EFIAPI > +ProcessLibraryConstructorList ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_MM_SYSTEM_TABLE *MmSystemTable > + ); > + > + > +/** > + Auto generated function that calls a set of module entry points. > + > + This function must be called by _ModuleEntryPoint(). > + This function calls the set of module entry points. > + This function is auto generated by build tools and those build tools are > responsible > + for collecting the module entry points and calling them in a specified > order. > + > + @param HobStart Pointer to the beginning of the HOB List passed in from > the PEI Phase. > + > +**/ > +VOID > +EFIAPI > +ProcessModuleEntryPointList ( > + IN VOID *HobStart > + ); > + > +#endif > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/CreateHobList.c > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/CreateHobList.c > new file mode 100644 > index 0000000..d8844c5 > --- /dev/null > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/CreateHobList.c > @@ -0,0 +1,200 @@ > +/** @file > + Creates HOB during Standalone MM Foundation entry point > + on ARM platforms. > + > +Copyright (c) 2017 - 2018, ARM Ltd. All rights reserved.<BR> > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BSD > License > +which accompanies this distribution. The full text of the license may be > found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > + > +#include <PiMm.h> > + > +#include <PiPei.h> > +#include <Guid/MmramMemoryReserve.h> > +#include <Guid/MpInformation.h> > + > +#include <Library/AArch64/StandaloneMmCoreEntryPoint.h> > +#include <Library/ArmMmuLib.h> > +#include <Library/ArmSvcLib.h> > +#include <Library/DebugLib.h> > +#include <Library/HobLib.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/SerialPortLib.h> > + > +#include <IndustryStandard/ArmStdSmc.h> > + > +extern EFI_HOB_HANDOFF_INFO_TABLE* > +HobConstructor ( > + IN VOID *EfiMemoryBegin, > + IN UINTN EfiMemoryLength, > + IN VOID *EfiFreeMemoryBottom, > + IN VOID *EfiFreeMemoryTop > + ); > + > +// GUID to identify HOB with whereabouts of communication buffer with Normal > +// World > +extern EFI_GUID gEfiStandaloneMmNonSecureBufferGuid; > + > +// GUID to identify HOB where the entry point of the CPU driver will be > +// populated to allow this entry point driver to invoke it upon receipt of an > +// event > +extern EFI_GUID gEfiArmTfCpuDriverEpDescriptorGuid; > + > +/** > + Use the boot information passed by privileged firmware to populate a HOB > list > + suitable for consumption by the MM Core and drivers. > + > + @param PayloadBootInfo Boot information passed by privileged firmware > + > +**/ > +VOID * > +CreateHobListFromBootInfo ( > + IN OUT PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT *CpuDriverEntryPoint, > + IN EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo > +) > +{ > + EFI_HOB_HANDOFF_INFO_TABLE *HobStart; > + EFI_RESOURCE_ATTRIBUTE_TYPE Attributes; > + UINT32 Index; > + UINT32 BufferSize; > + UINT32 Flags; > + EFI_MMRAM_HOB_DESCRIPTOR_BLOCK *MmramRangesHob; > + EFI_MMRAM_DESCRIPTOR *MmramRanges; > + EFI_MMRAM_DESCRIPTOR *NsCommBufMmramRange; > + MP_INFORMATION_HOB_DATA *MpInformationHobData; > + EFI_PROCESSOR_INFORMATION *ProcInfoBuffer; > + EFI_SECURE_PARTITION_CPU_INFO *CpuInfo; > + ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *CpuDriverEntryPointDesc; > + > + // Create a hoblist with a PHIT and EOH > + HobStart = HobConstructor ((VOID *) PayloadBootInfo->SpMemBase, > + (UINTN) PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase, > + (VOID *) PayloadBootInfo->SpHeapBase, > + (VOID *) (PayloadBootInfo->SpHeapBase + PayloadBootInfo->SpHeapSize)); > + > + // Check that the Hoblist starts at the bottom of the Heap > + ASSERT (HobStart == (VOID *) PayloadBootInfo->SpHeapBase); > + > + // Build a Boot Firmware Volume HOB > + BuildFvHob(PayloadBootInfo->SpImageBase, PayloadBootInfo->SpImageSize); > + > + // Build a resource descriptor Hob that describes the available physical > + // memory range > + Attributes =( > + EFI_RESOURCE_ATTRIBUTE_PRESENT | > + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | > + EFI_RESOURCE_ATTRIBUTE_TESTED | > + EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE | > + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | > + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | > + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE > + ); > + > + BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY, > + Attributes, > + (UINTN) PayloadBootInfo->SpMemBase, > + PayloadBootInfo->SpMemLimit - PayloadBootInfo->SpMemBase); > + > + // Find the size of the GUIDed HOB with MP information > + BufferSize = sizeof (MP_INFORMATION_HOB_DATA); > + BufferSize += sizeof (EFI_PROCESSOR_INFORMATION) * > PayloadBootInfo->NumCpus; > + > + // Create a Guided MP information HOB to enable the ARM TF CPU driver to > + // perform per-cpu allocations. > + MpInformationHobData = BuildGuidHob(&gMpInformationHobGuid, BufferSize); > + > + // Populate the MP information HOB with the topology information passed by > + // privileged firmware > + MpInformationHobData->NumberOfProcessors = PayloadBootInfo->NumCpus; > + MpInformationHobData->NumberOfEnabledProcessors = PayloadBootInfo->NumCpus; > + ProcInfoBuffer = MpInformationHobData->ProcessorInfoBuffer; > + CpuInfo = PayloadBootInfo->CpuInfo; > + > + for (Index = 0; Index < PayloadBootInfo->NumCpus; Index++) { > + ProcInfoBuffer[Index].ProcessorId = CpuInfo[Index].Mpidr; > + ProcInfoBuffer[Index].Location.Package = > GET_CLUSTER_ID(CpuInfo[Index].Mpidr); > + ProcInfoBuffer[Index].Location.Core = > GET_CORE_ID(CpuInfo[Index].Mpidr); > + ProcInfoBuffer[Index].Location.Thread = > GET_CORE_ID(CpuInfo[Index].Mpidr); > + > + Flags = PROCESSOR_ENABLED_BIT | PROCESSOR_HEALTH_STATUS_BIT; > + if (CpuInfo[Index].Flags & CPU_INFO_FLAG_PRIMARY_CPU) { > + Flags |= PROCESSOR_AS_BSP_BIT; > + } > + ProcInfoBuffer[Index].StatusFlag = Flags; > + } > + > + // Create a Guided HOB to tell the ARM TF CPU driver the location and > length > + // of the communication buffer shared with the Normal world. > + NsCommBufMmramRange = (EFI_MMRAM_DESCRIPTOR *) BuildGuidHob > (&gEfiStandaloneMmNonSecureBufferGuid, sizeof(EFI_MMRAM_DESCRIPTOR)); > + NsCommBufMmramRange->PhysicalStart = PayloadBootInfo->SpNsCommBufBase; > + NsCommBufMmramRange->CpuStart = PayloadBootInfo->SpNsCommBufBase; > + NsCommBufMmramRange->PhysicalSize = PayloadBootInfo->SpNsCommBufSize; > + NsCommBufMmramRange->RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Create a Guided HOB to enable the ARM TF CPU driver to share its entry > + // point and populate it with the address of the shared buffer > + CpuDriverEntryPointDesc = (ARM_TF_CPU_DRIVER_EP_DESCRIPTOR *) BuildGuidHob > (&gEfiArmTfCpuDriverEpDescriptorGuid, > sizeof(ARM_TF_CPU_DRIVER_EP_DESCRIPTOR)); Shorten this line to 120 chars and have a look at others too. > + > + *CpuDriverEntryPoint = NULL; > + CpuDriverEntryPointDesc->ArmTfCpuDriverEpPtr = CpuDriverEntryPoint; > + > + // Find the size of the GUIDed HOB with SRAM ranges > + BufferSize = sizeof (EFI_MMRAM_HOB_DESCRIPTOR_BLOCK); > + BufferSize += PayloadBootInfo->NumSpMemRegions * > + sizeof(EFI_MMRAM_DESCRIPTOR); > + > + // Create a GUIDed HOB with SRAM ranges > + MmramRangesHob = BuildGuidHob (&gEfiMmPeiMmramMemoryReserveGuid, > BufferSize); > + > + // Fill up the number of MMRAM memory regions > + MmramRangesHob->NumberOfMmReservedRegions = > PayloadBootInfo->NumSpMemRegions; > + // Fill up the MMRAM ranges > + MmramRanges = &MmramRangesHob->Descriptor[0]; > + > + // Base and size of memory occupied by the Standalone MM image > + MmramRanges[0].PhysicalStart = PayloadBootInfo->SpImageBase; > + MmramRanges[0].CpuStart = PayloadBootInfo->SpImageBase; > + MmramRanges[0].PhysicalSize = PayloadBootInfo->SpImageSize; > + MmramRanges[0].RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Base and size of buffer shared with privileged Secure world software > + MmramRanges[1].PhysicalStart = PayloadBootInfo->SpSharedBufBase; > + MmramRanges[1].CpuStart = PayloadBootInfo->SpSharedBufBase; > + MmramRanges[1].PhysicalSize = PayloadBootInfo->SpPcpuSharedBufSize * > PayloadBootInfo->NumCpus; > + MmramRanges[1].RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Base and size of buffer used for synchronous communication with Normal > + // world software > + MmramRanges[2].PhysicalStart = PayloadBootInfo->SpNsCommBufBase; > + MmramRanges[2].CpuStart = PayloadBootInfo->SpNsCommBufBase; > + MmramRanges[2].PhysicalSize = PayloadBootInfo->SpNsCommBufSize; > + MmramRanges[2].RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Base and size of memory allocated for stacks for all cpus > + MmramRanges[3].PhysicalStart = PayloadBootInfo->SpStackBase; > + MmramRanges[3].CpuStart = PayloadBootInfo->SpStackBase; > + MmramRanges[3].PhysicalSize = PayloadBootInfo->SpPcpuStackSize * > PayloadBootInfo->NumCpus; > + MmramRanges[3].RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Base and size of heap memory shared by all cpus > + MmramRanges[4].PhysicalStart = (EFI_PHYSICAL_ADDRESS) HobStart; > + MmramRanges[4].CpuStart = (EFI_PHYSICAL_ADDRESS) HobStart; > + MmramRanges[4].PhysicalSize = HobStart->EfiFreeMemoryBottom - > (EFI_PHYSICAL_ADDRESS) HobStart; > + MmramRanges[4].RegionState = EFI_CACHEABLE | EFI_ALLOCATED; > + > + // Base and size of heap memory shared by all cpus > + MmramRanges[5].PhysicalStart = HobStart->EfiFreeMemoryBottom; > + MmramRanges[5].CpuStart = HobStart->EfiFreeMemoryBottom; > + MmramRanges[5].PhysicalSize = HobStart->EfiFreeMemoryTop - > HobStart->EfiFreeMemoryBottom; > + MmramRanges[5].RegionState = EFI_CACHEABLE; > + > + return HobStart; > +} > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c > new file mode 100644 > index 0000000..e8310d2 > --- /dev/null > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c > @@ -0,0 +1,275 @@ > +/** @file > + Locate, get and update PE/COFF permissions during Standalone MM > + Foundation Entry point on ARM platforms. > + > +Copyright (c) 2017 - 2018, ARM Ltd. All rights reserved.<BR> > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BSD > License > +which accompanies this distribution. The full text of the license may be > found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > + > +#include <PiMm.h> > + > +#include <PiPei.h> > +#include <Guid/MmramMemoryReserve.h> > +#include <Guid/MpInformation.h> > + > +#include <Library/AArch64/StandaloneMmCoreEntryPoint.h> > +#include <Library/ArmMmuLib.h> > +#include <Library/ArmSvcLib.h> > +#include <Library/DebugLib.h> > +#include <Library/HobLib.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/SerialPortLib.h> > + > +#include <IndustryStandard/ArmStdSmc.h> > + > +EFI_STATUS > +EFIAPI > +UpdateMmFoundationPeCoffPermissions ( > + IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, > + IN UINT32 SectionHeaderOffset, > + IN CONST UINT16 NumberOfSections, > + IN REGION_PERMISSION_UPDATE_FUNC TextUpdater, > + IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater, > + IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater > + ) > +{ > + EFI_IMAGE_SECTION_HEADER SectionHeader; > + RETURN_STATUS Status; > + EFI_PHYSICAL_ADDRESS Base; > + UINTN Size; > + UINTN ReadSize; > + UINTN Index; > + > + ASSERT (ImageContext != NULL); > + > + // > + // Iterate over the sections > + // > + for (Index = 0; Index < NumberOfSections; Index++) { > + // > + // Read section header from file > + // > + Size = sizeof (EFI_IMAGE_SECTION_HEADER); > + ReadSize = Size; > + Status = ImageContext->ImageRead (ImageContext->Handle, > SectionHeaderOffset, > + &Size, &SectionHeader); > + if (RETURN_ERROR (Status) || (Size != ReadSize)) { > + DEBUG ((DEBUG_ERROR, > + "%a: ImageContext->ImageRead () failed (Status = %r)\n", > + __FUNCTION__, Status)); > + return Status; > + } > + > + DEBUG ((DEBUG_INFO, > + "%a: Section %d of image at 0x%lx has 0x%x permissions\n", > + __FUNCTION__, Index, ImageContext->ImageAddress, > SectionHeader.Characteristics)); > + DEBUG ((DEBUG_INFO, > + "%a: Section %d of image at 0x%lx has %s name\n", > + __FUNCTION__, Index, ImageContext->ImageAddress, > SectionHeader.Name)); > + DEBUG ((DEBUG_INFO, > + "%a: Section %d of image at 0x%lx has 0x%x address\n", > + __FUNCTION__, Index, ImageContext->ImageAddress, > ImageContext->ImageAddress + SectionHeader.VirtualAddress)); > + DEBUG ((DEBUG_INFO, > + "%a: Section %d of image at 0x%lx has 0x%x data\n", > + __FUNCTION__, Index, ImageContext->ImageAddress, > SectionHeader.PointerToRawData)); > + > + // > + // If the section is marked as XN then remove the X attribute. > Furthermore, > + // if it is a writeable section then mark it appropriately as well. > + // > + if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) { > + Base = ImageContext->ImageAddress + SectionHeader.VirtualAddress; > + > + TextUpdater (Base, SectionHeader.Misc.VirtualSize); > + > + if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0) { > + ReadWriteUpdater (Base, SectionHeader.Misc.VirtualSize); > + DEBUG ((DEBUG_INFO, > + "%a: Mapping section %d of image at 0x%lx with RW-XN > permissions\n", > + __FUNCTION__, Index, ImageContext->ImageAddress)); > + } else { > + DEBUG ((DEBUG_INFO, > + "%a: Mapping section %d of image at 0x%lx with RO-XN > permissions\n", > + __FUNCTION__, Index, ImageContext->ImageAddress)); > + } > + } else { > + DEBUG ((DEBUG_INFO, > + "%a: Ignoring section %d of image at 0x%lx with 0x%x > permissions\n", > + __FUNCTION__, Index, ImageContext->ImageAddress, > SectionHeader.Characteristics)); > + } > + SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER); > + } > + > + return RETURN_SUCCESS; > +} > + > +EFI_STATUS > +EFIAPI > +LocateStandaloneMmCorePeCoffData ( > + IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress, > + IN OUT VOID **TeData, > + IN OUT UINTN *TeDataSize > + ) > +{ > + EFI_FFS_FILE_HEADER *FileHeader = NULL; > + EFI_STATUS Status; > + > + Status = FfsFindNextFile ( > + EFI_FV_FILETYPE_SECURITY_CORE, > + BfvAddress, > + &FileHeader); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM FFS file - 0x%x\n", > + Status)); > + return Status; > + } > + > + Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, TeData, > TeDataSize); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Section data - > 0x%x\n", > + Status)); > + return Status; > + } > + > + DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", *TeData)); > + return Status; > +} > + > +static > +EFI_STATUS > +GetPeCoffSectionInformation ( > + IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, > + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *TmpContext, > + IN OUT UINT32 *SectionHeaderOffset, > + IN OUT UINT16 *NumberOfSections > + ) > +{ > + RETURN_STATUS Status; > + EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; > + EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData; > + UINTN Size; > + UINTN ReadSize; > + > + ASSERT (ImageContext != NULL); > + ASSERT (TmpContext != NULL); > + ASSERT (SectionHeaderOffset != NULL); > + ASSERT (NumberOfSections != NULL); > + > + // > + // We need to copy ImageContext since PeCoffLoaderGetImageInfo () > + // will mangle the ImageAddress field > + // > + CopyMem (TmpContext, ImageContext, sizeof (*TmpContext)); > + > + if (TmpContext->PeCoffHeaderOffset == 0) { > + Status = PeCoffLoaderGetImageInfo (TmpContext); > + if (RETURN_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, > + "%a: PeCoffLoaderGetImageInfo () failed (Status = %r)\n", > + __FUNCTION__, Status)); > + return Status; > + } > + } > + > + if (TmpContext->IsTeImage && > + TmpContext->ImageAddress == ImageContext->ImageAddress) { > + DEBUG ((DEBUG_INFO, "%a: ignoring XIP TE image at 0x%lx\n", __FUNCTION__, > + ImageContext->ImageAddress)); > + return RETURN_UNSUPPORTED; > + } > + > + if (TmpContext->SectionAlignment < EFI_PAGE_SIZE) { > + // > + // The sections need to be at least 4 KB aligned, since that is the > + // granularity at which we can tighten permissions. > + // > + if (!TmpContext->IsTeImage) { > + DEBUG ((DEBUG_WARN, > + "%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n", > + __FUNCTION__, ImageContext->ImageAddress, > TmpContext->SectionAlignment)); > + } > + return RETURN_UNSUPPORTED; > + } > + > + // > + // Read the PE/COFF Header. For PE32 (32-bit) this will read in too much > + // data, but that should not hurt anything. Hdr.Pe32->OptionalHeader.Magic > + // determines if this is a PE32 or PE32+ image. The magic is in the same > + // location in both images. > + // > + Hdr.Union = &HdrData; > + Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION); > + ReadSize = Size; > + Status = TmpContext->ImageRead (TmpContext->Handle, > + TmpContext->PeCoffHeaderOffset, &Size, Hdr.Pe32); > + if (RETURN_ERROR (Status) || (Size != ReadSize)) { > + DEBUG ((DEBUG_ERROR, > + "%a: TmpContext->ImageRead () failed (Status = %r)\n", > + __FUNCTION__, Status)); > + return Status; > + } > + > + ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE); > + > + *SectionHeaderOffset = TmpContext->PeCoffHeaderOffset + sizeof (UINT32) + > + sizeof (EFI_IMAGE_FILE_HEADER); > + *NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections; > + > + switch (Hdr.Pe32->OptionalHeader.Magic) { > + case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: > + *SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader; > + break; > + case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC: > + *SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader; > + break; > + default: > + ASSERT (FALSE); > + } > + > + return RETURN_SUCCESS; > +} > + > +EFI_STATUS > +EFIAPI > +GetStandaloneMmCorePeCoffSections ( > + IN VOID *TeData, > + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, > + IN OUT UINT32 *SectionHeaderOffset, > + IN OUT UINT16 *NumberOfSections > + ) > +{ > + EFI_STATUS Status; > + PE_COFF_LOADER_IMAGE_CONTEXT TmpContext; > + > + // Initialize the Image Context > + ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT)); > + ImageContext->Handle = TeData; > + ImageContext->ImageRead = PeCoffLoaderImageReadFromMemory; > + > + DEBUG((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", TeData)); > + > + Status = PeCoffLoaderGetImageInfo (ImageContext); > + if (EFI_ERROR(Status)) { > + DEBUG((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Image > information - 0x%x\n", Status)); > + return Status; > + } > + > + Status = GetPeCoffSectionInformation(ImageContext, &TmpContext, > SectionHeaderOffset, NumberOfSections); > + if (EFI_ERROR(Status)) { > + DEBUG((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section > information - 0x%x\n", Status)); > + return Status; > + } > + > + DEBUG((DEBUG_INFO, "Standalone MM Core PE-COFF SectionHeaderOffset - 0x%x, > NumberOfSections - %d\n", *SectionHeaderOffset, *NumberOfSections)); > + > + return Status; > +} > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c > > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c > new file mode 100644 > index 0000000..a212136 > --- /dev/null > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/StandaloneMmCoreEntryPoint.c > @@ -0,0 +1,287 @@ > +/** @file > + Entry point to the Standalone MM Foundation when initialized during the SEC > + phase on ARM platforms > + > +Copyright (c) 2017 - 2018, ARM Ltd. All rights reserved.<BR> > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BSD > License > +which accompanies this distribution. The full text of the license may be > found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > + > +#include <PiMm.h> > + > +#include <Library/AArch64/StandaloneMmCoreEntryPoint.h> > + > +#include <PiPei.h> > +#include <Guid/MmramMemoryReserve.h> > +#include <Guid/MpInformation.h> > + > +#include <Library/ArmMmuLib.h> > +#include <Library/ArmSvcLib.h> > +#include <Library/DebugLib.h> > +#include <Library/HobLib.h> > +#include <Library/BaseLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/SerialPortLib.h> > + > +#include <IndustryStandard/ArmStdSmc.h> > +#include <IndustryStandard/ArmMmSvc.h> > + > +#define SPM_MAJOR_VER_MASK 0xFFFF0000 > +#define SPM_MINOR_VER_MASK 0x0000FFFF > +#define SPM_MAJOR_VER_SHIFT 16 > + > +const UINT32 SPM_MAJOR_VER = 0; > +const UINT32 SPM_MINOR_VER = 1; > + > +const UINT8 BOOT_PAYLOAD_VERSION = 1; > + > +PI_MM_ARM_TF_CPU_DRIVER_ENTRYPOINT CpuDriverEntryPoint = NULL; > + > +/** > + Retrieve a pointer to and print the boot information passed by privileged > + secure firmware > + > + @param SharedBufAddress The pointer memory shared with privileged firmware > + > +**/ > +EFI_SECURE_PARTITION_BOOT_INFO * > +GetAndPrintBootinformation ( > + IN VOID *SharedBufAddress > +) > +{ > + EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo; > + EFI_SECURE_PARTITION_CPU_INFO *PayloadCpuInfo; > + UINTN Index; > + > + PayloadBootInfo = (EFI_SECURE_PARTITION_BOOT_INFO *) SharedBufAddress; > + > + if (PayloadBootInfo->Header.Version != BOOT_PAYLOAD_VERSION) > + { > + DEBUG((DEBUG_ERROR, "Boot Information Version Mismatch. Current=0x%x, > Expected=0x%x.\n", PayloadBootInfo->Header.Version, BOOT_PAYLOAD_VERSION)); > + return NULL; > + } > + DEBUG((DEBUG_INFO, "NumSpMemRegions - 0x%x\n", > PayloadBootInfo->NumSpMemRegions)); > + DEBUG((DEBUG_INFO, "SpMemBase - 0x%lx\n", > PayloadBootInfo->SpMemBase)); > + DEBUG((DEBUG_INFO, "SpMemLimit - 0x%lx\n", > PayloadBootInfo->SpMemLimit)); > + DEBUG((DEBUG_INFO, "SpImageBase - 0x%lx\n", > PayloadBootInfo->SpImageBase)); > + DEBUG((DEBUG_INFO, "SpStackBase - 0x%lx\n", > PayloadBootInfo->SpStackBase)); > + DEBUG((DEBUG_INFO, "SpHeapBase - 0x%lx\n", > PayloadBootInfo->SpHeapBase)); > + DEBUG((DEBUG_INFO, "SpNsCommBufBase - 0x%lx\n", > PayloadBootInfo->SpNsCommBufBase)); > + DEBUG((DEBUG_INFO, "SpSharedBufBase - 0x%lx\n", > PayloadBootInfo->SpSharedBufBase)); > + > + DEBUG((DEBUG_INFO, "SpImageSize - 0x%x\n", > PayloadBootInfo->SpImageSize)); > + DEBUG((DEBUG_INFO, "SpPcpuStackSize - 0x%x\n", > PayloadBootInfo->SpPcpuStackSize)); > + DEBUG((DEBUG_INFO, "SpHeapSize - 0x%x\n", > PayloadBootInfo->SpHeapSize)); > + DEBUG((DEBUG_INFO, "SpNsCommBufSize - 0x%x\n", > PayloadBootInfo->SpNsCommBufSize)); > + DEBUG((DEBUG_INFO, "SpPcpuSharedBufSize - 0x%x\n", > PayloadBootInfo->SpPcpuSharedBufSize)); > + > + DEBUG((DEBUG_INFO, "NumCpus - 0x%x\n", PayloadBootInfo->NumCpus)); > + DEBUG((DEBUG_INFO, "CpuInfo - 0x%p\n", PayloadBootInfo->CpuInfo)); > + > + PayloadCpuInfo = (EFI_SECURE_PARTITION_CPU_INFO *) > PayloadBootInfo->CpuInfo; It is worth having a NULL pointer check here as well. > + > + for (Index = 0; Index < PayloadBootInfo->NumCpus; Index++) { > + DEBUG((DEBUG_INFO, "Mpidr - 0x%lx\n", > PayloadCpuInfo[Index].Mpidr)); > + DEBUG((DEBUG_INFO, "LinearId - 0x%x\n", > PayloadCpuInfo[Index].LinearId)); > + DEBUG((DEBUG_INFO, "Flags - 0x%x\n", > PayloadCpuInfo[Index].Flags)); > + } > + > + return PayloadBootInfo; > +} > + > +VOID > +EFIAPI > +DelegatedEventLoop ( > + IN ARM_SVC_ARGS *EventCompleteSvcArgs > + ) > +{ > + EFI_STATUS Status; > + UINTN SvcStatus; > + > + while(TRUE) { > + ArmCallSvc(EventCompleteSvcArgs); > + > + DEBUG ((DEBUG_INFO, "Received delegated event\n")); > + DEBUG ((DEBUG_INFO, "X0 : 0x%x\n", (UINT32) > EventCompleteSvcArgs->Arg0)); > + DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) > EventCompleteSvcArgs->Arg1)); > + DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) > EventCompleteSvcArgs->Arg2)); > + DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32) > EventCompleteSvcArgs->Arg3)); > + > + Status = CpuDriverEntryPoint( > + EventCompleteSvcArgs->Arg0, > + EventCompleteSvcArgs->Arg3, > + EventCompleteSvcArgs->Arg1); > + if (EFI_ERROR(Status)) { > + DEBUG((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n", > + EventCompleteSvcArgs->Arg0, Status)); > + } > + > + switch (Status) { > + case EFI_SUCCESS: > + SvcStatus = ARM_SVC_SPM_RET_SUCCESS; > + break; > + case EFI_INVALID_PARAMETER: > + SvcStatus = ARM_SVC_SPM_RET_INVALID_PARAMS; > + break; > + case EFI_ACCESS_DENIED: > + SvcStatus = ARM_SVC_SPM_RET_DENIED; > + break; > + case EFI_OUT_OF_RESOURCES: > + SvcStatus = ARM_SVC_SPM_RET_NO_MEMORY; > + break; > + case EFI_UNSUPPORTED: > + SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED; > + break; > + default: > + SvcStatus = ARM_SVC_SPM_RET_NOT_SUPPORTED; > + break; > + } > + > + EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64; > + EventCompleteSvcArgs->Arg1 = SvcStatus; > + } > +} > + > +STATIC > +EFI_STATUS > +GetSpmVersion () > +{ > + EFI_STATUS Status; > + UINT16 SpmMajorVersion; > + UINT16 SpmMinorVersion; > + UINT32 SpmVersion; > + ARM_SVC_ARGS SpmVersionArgs; > + > + SpmVersionArgs.Arg0 = ARM_SVC_ID_SPM_VERSION_AARCH32; > + > + ArmCallSvc (&SpmVersionArgs); > + > + SpmVersion = SpmVersionArgs.Arg0; > + > + SpmMajorVersion = ((SpmVersion & SPM_MAJOR_VER_MASK) >> > SPM_MAJOR_VER_SHIFT); > + SpmMinorVersion = ((SpmVersion & SPM_MINOR_VER_MASK) >> 0); > + > + // Different major revision values indicate possibly incompatible > functions. > + // For two revisions, A and B, for which the major revision values are > + // identical, if the minor revision value of revision B is greater than > + // the minor revision value of revision A, then every function in > + // revision A must work in a compatible way with revision B. > + // However, it is possible for revision B to have a higher > + // function count than revision A. > + if ((SpmMajorVersion == SPM_MAJOR_VER) && > + (SpmMinorVersion >= SPM_MINOR_VER)) > + { > + DEBUG ((DEBUG_INFO, "SPM Version: Major=0x%x, Minor=0x%x\n", > + SpmMajorVersion, SpmMinorVersion)); > + Status = EFI_SUCCESS; > + } > + else > + { > + DEBUG ((DEBUG_INFO, "Incompatible SPM Versions.\n Current Version: > Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n", > + SpmMajorVersion, SpmMinorVersion, SPM_MAJOR_VER, SPM_MINOR_VER)); > + Status = EFI_UNSUPPORTED; > + } > + > + return Status; > +} > + > +/** > + The entry point of Standalone MM Foundation. > + > + @param SharedBufAddress Pointer to the Buffer between SPM and SP. > + @param cookie1. > + @param cookie2. > + > +**/ > +VOID > +EFIAPI > +_ModuleEntryPoint ( > + IN VOID *SharedBufAddress, > + IN UINT64 cookie1, > + IN UINT64 cookie2 > + ) > +{ > + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; > + EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo; > + ARM_SVC_ARGS InitMmFoundationSvcArgs = {0}; > + EFI_STATUS Status; > + UINT32 SectionHeaderOffset; > + UINT16 NumberOfSections; > + VOID *HobStart; > + VOID *TeData; > + UINTN TeDataSize; > + > + Status = SerialPortInitialize (); > + ASSERT_EFI_ERROR (Status); > + > + // Get Secure Partition Manager Version Information > + Status = GetSpmVersion(); > + if (EFI_ERROR(Status)) { > + goto finish; > + } > + > + PayloadBootInfo = GetAndPrintBootinformation(SharedBufAddress); SharedBufAddress is dereferenced in GetAndPrintBootinformation() without a NULL pointer check that should happen above this statement. > + if (PayloadBootInfo == NULL) { > + Status = EFI_UNSUPPORTED; > + goto finish; > + } > + > + // Locate PE/COFF File information for the Standalone MM core module > + Status = LocateStandaloneMmCorePeCoffData ( > + (EFI_FIRMWARE_VOLUME_HEADER *) PayloadBootInfo->SpImageBase, > + &TeData, > + &TeDataSize); Indentation of statements following LocateStandaloneMmCorePeCoffData should be fixed. > + if (EFI_ERROR(Status)) { > + goto finish; > + } > + > + // Obtain the PE/COFF Section information for the Standalone MM core module > + Status = GetStandaloneMmCorePeCoffSections ( > + TeData, > + &ImageContext, > + &SectionHeaderOffset, > + &NumberOfSections); Fix indentation. > + if (EFI_ERROR(Status)) { > + goto finish; > + } > + > + // Update the memory access permissions of individual sections in the > + // Standalone MM core module > + Status = UpdateMmFoundationPeCoffPermissions( > + &ImageContext, > + SectionHeaderOffset, > + NumberOfSections, > + ArmSetMemoryRegionNoExec, > + ArmSetMemoryRegionReadOnly, > + ArmClearMemoryRegionReadOnly); Fix indentation. Could you have a skim through the entire file as there a few places where the coding convention has not been followed. cheers, Achin > + if (EFI_ERROR(Status)) { > + goto finish; > + } > + > + // > + // Create Hoblist based upon boot information passed by privileged software > + // > + HobStart = CreateHobListFromBootInfo(&CpuDriverEntryPoint, > PayloadBootInfo); > + > + // > + // Call the MM Core entry point > + // > + ProcessModuleEntryPointList (HobStart); > + > + ASSERT_EFI_ERROR (CpuDriverEntryPoint); > + DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64) > CpuDriverEntryPoint)); > + > +finish: > + InitMmFoundationSvcArgs.Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64; > + InitMmFoundationSvcArgs.Arg1 = Status; > + DelegatedEventLoop(&InitMmFoundationSvcArgs); > + ASSERT_EFI_ERROR(0); > + > +} > diff --git > a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf > > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf > new file mode 100644 > index 0000000..66184c4 > --- /dev/null > +++ > b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/StandaloneMmCoreEntryPoint.inf > @@ -0,0 +1,55 @@ > +## @file > +# Module entry point library for DXE core. > +# > +# Copyright (c) 2017 - 2018, ARM Ltd. All rights reserved.<BR> > +# > +# This program and the accompanying materials > +# are licensed and made available under the terms and conditions of the BSD > License > +# which accompanies this distribution. The full text of the license may be > found at > +# http://opensource.org/licenses/bsd-license.php. > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR > IMPLIED. > +# > +# > +## > + > +[Defines] > + INF_VERSION = 0x0001001A > + BASE_NAME = StandaloneMmCoreEntryPoint > + FILE_GUID = C97AC593-109A-4C63-905C-675FDE2689E8 > + MODULE_TYPE = MM_CORE_STANDALONE > + VERSION_STRING = 1.0 > + PI_SPECIFICATION_VERSION = 0x00010032 > + LIBRARY_CLASS = > StandaloneMmCoreEntryPoint|MM_CORE_STANDALONE > + > +# > +# VALID_ARCHITECTURES = IA32 X64 IPF EBC (EBC is for build only) > +# > + > +[Sources.AARCH64] > + AArch64/StandaloneMmCoreEntryPoint.c > + AArch64/SetPermissions.c > + AArch64/CreateHobList.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + StandaloneMmPkg/StandaloneMmPkg.dec > + > +[Packages.AARCH64] > + ArmPkg/ArmPkg.dec > + ArmPlatformPkg/ArmPlatformPkg.dec > + > +[LibraryClasses] > + BaseLib > + DebugLib > + > +[LibraryClasses.AARCH64] > + ArmMmuLib > + ArmSvcLib > + > +[Guids] > + gMpInformationHobGuid > + gEfiMmPeiMmramMemoryReserveGuid > + gEfiStandaloneMmNonSecureBufferGuid > + gEfiArmTfCpuDriverEpDescriptorGuid > -- > 2.7.4 > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel