From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4864:20::135; helo=mail-it1-x135.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-it1-x135.google.com (mail-it1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 63AFC21197B29 for ; Fri, 21 Dec 2018 00:58:47 -0800 (PST) Received: by mail-it1-x135.google.com with SMTP id h65so5592558ith.3 for ; Fri, 21 Dec 2018 00:58:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=PztsRSXnmur2eaF7BbhJ3iC16BlnmPpxoNh/FVA8dMI=; b=ERrihK79nWvY2u5Rt2+TBAGM4dWXA5oN6xMRY8TbugnuVhTN0yGIUiX8dF+gdvfDvl aYw7sDW/Q736zYTx8bbQLL0Qy3v9h85MshPU3XgJOMZSCsqHd5Op3DA38t7J0JjlJvo4 ymHDbghyEf0U9ibfS9ps6uPU4zBRiyiOSnAPE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=PztsRSXnmur2eaF7BbhJ3iC16BlnmPpxoNh/FVA8dMI=; b=NwCXM8WeKqff9pBYbw+6BLEJyZhf4w1mWdVtOki3bVLxlxz8HsWv3vSJ/42lMQ+ze0 G334N1s71/Waj2eG5CL5Lv/Vp8DLvuPkQckhUYNmNHeXBN5Hb2tp5pYN7wFyVPrsYPvn bTJeb/A0EMk6DJlR9JFwOf2tgdX6cR7kKtX3BHUW/e3/A2wKxfyJd7P2khuKSx6m8/a8 ede8Qy/ebNJ9ec0kPKi1QHernb6h2LCQLjV49klDO4AT5gUIG/1hnyamqEeUKvz9L23p MMuZaWXDfvp9xz5dEh0LF+24CnSruVswn8co3EdQuhnNXmOvxtWppxY3wsr5lOanrPPx rILg== X-Gm-Message-State: AA+aEWauW+uFIv+Rsn/lTdEORMANbr4NKKRPFb3yQFnQ4P5xuAY8hHGP YGTfbQzC3yRWhRvumu/NrW2WsCMJFhBaKMX0m/TCfA== X-Google-Smtp-Source: AFSGD/Uhg2UNj2hE2ECn5vEoWhyr0nntF2kXyDUY9bgJcQ5dcB7RFxm7WYAGcaWA/esdNhiO4VYQjTQbNd90lRM29VM= X-Received: by 2002:a24:710:: with SMTP id f16mr1209168itf.121.1545382725568; Fri, 21 Dec 2018 00:58:45 -0800 (PST) MIME-Version: 1.0 References: <1544789607-11316-1-git-send-email-jagadeesh.ujja@arm.com> <1544789607-11316-2-git-send-email-jagadeesh.ujja@arm.com> In-Reply-To: <1544789607-11316-2-git-send-email-jagadeesh.ujja@arm.com> From: Ard Biesheuvel Date: Fri, 21 Dec 2018 09:58:06 +0100 Message-ID: To: Jagadeesh Ujja Cc: "edk2-devel@lists.01.org" , "Gao, Liming" , "Zhang, Chao B" , Leif Lindholm Subject: Re: [PATCH 01/13] StandaloneMmPkg: Pull in additonal libraries from staging branch X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Dec 2018 08:58:47 -0000 Content-Type: text/plain; charset="UTF-8" Hello Jagadeesh, Please drop the reference to the staging branch from the subject and from below, it is not relevant. On Fri, 14 Dec 2018 at 13:13, Jagadeesh Ujja wrote: > > Three additional library packages are being pulled into StandaloneMmPkg > from the staging area in order to support the secure variable service. > The three packages being pulled in are > - StandaloneMmHobLib > - StandaloneMmMemoryAllocationLib > - StandaloneMmServicesTableLib > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Jagadeesh Ujja > --- > StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf | 2 +- > StandaloneMmPkg/Library/StandaloneMmHobLib/AArch64/StandaloneMmCoreHobLibInternal.c | 64 ++ > StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c | 655 ++++++++++++++++ > StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf | 48 ++ > StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.c | 824 ++++++++++++++++++++ > StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf | 45 ++ > StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.c | 64 ++ > StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf | 36 + > 8 files changed, 1737 insertions(+), 1 deletion(-) > > diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf > index db19d3c..ac036e3 100644 > --- a/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf > +++ b/StandaloneMmPkg/Library/StandaloneMmCoreHobLib/StandaloneMmCoreHobLib.inf > @@ -24,7 +24,7 @@ > MODULE_TYPE = MM_CORE_STANDALONE > VERSION_STRING = 1.0 > PI_SPECIFICATION_VERSION = 0x00010032 > - LIBRARY_CLASS = HobLib|MM_CORE_STANDALONE MM_STANDALONE > + LIBRARY_CLASS = HobLib|MM_CORE_STANDALONE > > # > # VALID_ARCHITECTURES = AARCH64 This is an unrelated change. > diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/AArch64/StandaloneMmCoreHobLibInternal.c b/StandaloneMmPkg/Library/StandaloneMmHobLib/AArch64/StandaloneMmCoreHobLibInternal.c > new file mode 100644 > index 0000000..ac5a1c0 > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/AArch64/StandaloneMmCoreHobLibInternal.c > @@ -0,0 +1,64 @@ > +/** @file > + HOB Library implementation for Standalone MM Core. > + > +Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
> +Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> + > +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 > + > +#include > +#include > +#include > + > +#include > + > +// > +// Cache copy of HobList pointer. > +// > +extern VOID *gHobList; > + > +EFI_HOB_HANDOFF_INFO_TABLE* > +HobConstructor ( > + IN VOID *EfiMemoryBegin, > + IN UINTN EfiMemoryLength, > + IN VOID *EfiFreeMemoryBottom, > + IN VOID *EfiFreeMemoryTop > + ) > +{ > + EFI_HOB_HANDOFF_INFO_TABLE *Hob; > + EFI_HOB_GENERIC_HEADER *HobEnd; > + > + Hob = EfiFreeMemoryBottom; > + HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1); > + > + Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF; > + Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE); > + Hob->Header.Reserved = 0; > + > + HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; > + HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER); > + HobEnd->Reserved = 0; > + > + Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION; > + Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION; > + > + Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength; > + Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin; > + Hob->EfiFreeMemoryTop = (UINTN)EfiFreeMemoryTop; > + Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1); > + Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd; > + > + gHobList = Hob; > + > + return Hob; > +} > diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c > new file mode 100644 > index 0000000..591a78c > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.c > @@ -0,0 +1,655 @@ > +/** @file > + HOB Library implementation for Standalone MM Core. > + > +Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.
> +Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> + > +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 > + > +#include > +#include > +#include > + > +#include > + > +// > +// Cache copy of HobList pointer. > +// > +VOID *gHobList = NULL; > + > +EFI_MM_SYSTEM_TABLE *gMmst = NULL; > + > +/** > + The constructor function caches the pointer to HOB list. > + > + The constructor function gets the start address of HOB list from system configuration table. > + It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. > + > + @param ImageHandle The firmware allocated handle for the EFI image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The constructor successfully gets HobList. > + @retval Other value The constructor can't get HobList. > + > +**/ > +EFI_STATUS > +EFIAPI > +HobLibConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_MM_SYSTEM_TABLE *SmmSystemTable > + ) > +{ > + UINTN Index; > + > + for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) { > + if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) { > + gHobList = gMmst->MmConfigurationTable[Index].VendorTable; > + break; > + } > + } > + > + /* HACK: Use the ImageHandle to smuggle the hoblist into the library constructor */ Please elaborate. Can we do this properly instead? > + if (ImageHandle) > + gHobList = (VOID *) ImageHandle; No spaces after casts please (throughout the file) > + > + return EFI_SUCCESS; > +} > +/** > + Returns the pointer to the HOB list. > + > + This function returns the pointer to first HOB in the list. > + If the pointer to the HOB list is NULL, then ASSERT(). > + > + @return The pointer to the HOB list. > + > +**/ > +VOID * > +EFIAPI > +GetHobList ( > + VOID > + ) > +{ > + UINTN Index; > + > + if (gHobList == NULL) { > + for (Index = 0; Index < gMmst->NumberOfTableEntries; Index++) { > + if (CompareGuid (&gEfiHobListGuid, &gMmst->MmConfigurationTable[Index].VendorGuid)) { > + gHobList = gMmst->MmConfigurationTable[Index].VendorTable; > + break; > + } > + } > + } > + ASSERT (gHobList != NULL); > + return gHobList; > +} > + > +/** > + Returns the next instance of a HOB type from the starting HOB. > + > + This function searches the first instance of a HOB type from the starting HOB pointer. > + If there does not exist such HOB type from the starting HOB pointer, it will return NULL. > + In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer > + unconditionally: it returns HobStart back if HobStart itself meets the requirement; > + caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart. > + > + If HobStart is NULL, then ASSERT(). > + > + @param Type The HOB type to return. > + @param HobStart The starting HOB pointer to search from. > + > + @return The next instance of a HOB type from the starting HOB. > + > +**/ > +VOID * > +EFIAPI > +GetNextHob ( > + IN UINT16 Type, > + IN CONST VOID *HobStart > + ) > +{ > + EFI_PEI_HOB_POINTERS Hob; > + > + ASSERT (HobStart != NULL); > + > + Hob.Raw = (UINT8 *) HobStart; > + // > + // Parse the HOB list until end of list or matching type is found. > + // > + while (!END_OF_HOB_LIST (Hob)) { > + if (Hob.Header->HobType == Type) { > + return Hob.Raw; > + } > + Hob.Raw = GET_NEXT_HOB (Hob); > + } > + return NULL; > +} > + > +/** > + Returns the first instance of a HOB type among the whole HOB list. > + > + This function searches the first instance of a HOB type among the whole HOB list. > + If there does not exist such HOB type in the HOB list, it will return NULL. > + > + If the pointer to the HOB list is NULL, then ASSERT(). > + > + @param Type The HOB type to return. > + > + @return The next instance of a HOB type from the starting HOB. > + > +**/ > +VOID * > +EFIAPI > +GetFirstHob ( > + IN UINT16 Type > + ) > +{ > + VOID *HobList; > + > + HobList = GetHobList (); > + return GetNextHob (Type, HobList); > +} > + > +/** > + Returns the next instance of the matched GUID HOB from the starting HOB. > + > + This function searches the first instance of a HOB from the starting HOB pointer. > + Such HOB should satisfy two conditions: > + its HOB type is EFI_HOB_TYPE_GUID_EXTENSION, and its GUID Name equals to the input Guid. > + If such a HOB from the starting HOB pointer does not exist, it will return NULL. > + Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE () > + to extract the data section and its size information, respectively. > + In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer > + unconditionally: it returns HobStart back if HobStart itself meets the requirement; > + caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart. > + > + If Guid is NULL, then ASSERT(). > + If HobStart is NULL, then ASSERT(). > + > + @param Guid The GUID to match with in the HOB list. > + @param HobStart A pointer to a Guid. > + > + @return The next instance of the matched GUID HOB from the starting HOB. > + > +**/ > +VOID * > +EFIAPI > +GetNextGuidHob ( > + IN CONST EFI_GUID *Guid, > + IN CONST VOID *HobStart > + ) > +{ > + EFI_PEI_HOB_POINTERS GuidHob; > + > + GuidHob.Raw = (UINT8 *) HobStart; > + while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) { > + if (CompareGuid (Guid, &GuidHob.Guid->Name)) { > + break; > + } > + GuidHob.Raw = GET_NEXT_HOB (GuidHob); > + } > + return GuidHob.Raw; > +} > + > +/** > + Returns the first instance of the matched GUID HOB among the whole HOB list. > + > + This function searches the first instance of a HOB among the whole HOB list. > + Such HOB should satisfy two conditions: > + its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid. > + If such a HOB from the starting HOB pointer does not exist, it will return NULL. > + Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE () > + to extract the data section and its size information, respectively. > + > + If the pointer to the HOB list is NULL, then ASSERT(). > + If Guid is NULL, then ASSERT(). > + > + @param Guid The GUID to match with in the HOB list. > + > + @return The first instance of the matched GUID HOB among the whole HOB list. > + > +**/ > +VOID * > +EFIAPI > +GetFirstGuidHob ( > + IN CONST EFI_GUID *Guid > + ) > +{ > + VOID *HobList; > + > + HobList = GetHobList (); > + return GetNextGuidHob (Guid, HobList); > +} > + > +/** > + Get the system boot mode from the HOB list. > + > + This function returns the system boot mode information from the > + PHIT HOB in HOB list. > + > + If the pointer to the HOB list is NULL, then ASSERT(). > + > + @param VOID > + > + @return The Boot Mode. > + > +**/ > +EFI_BOOT_MODE > +EFIAPI > +GetBootModeHob ( > + VOID > + ) > +{ > + EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob; > + > + HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList (); > + > + return HandOffHob->BootMode; > +} > + > +VOID * > +CreateHob ( > + IN UINT16 HobType, > + IN UINT16 HobLength > + ) > +{ > + EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob; > + EFI_HOB_GENERIC_HEADER *HobEnd; > + EFI_PHYSICAL_ADDRESS FreeMemory; > + VOID *Hob; > + > + HandOffHob = GetHobList (); > + > + HobLength = (UINT16)((HobLength + 0x7) & (~0x7)); > + > + FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom; > + > + if (FreeMemory < HobLength) { > + return NULL; > + } > + > + Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength; > + ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0; > + > + HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength); > + HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd; > + > + HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST; > + HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER); > + HobEnd->Reserved = 0; > + HobEnd++; > + HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd; > + > + return Hob; > +} > + > +/** > + Builds a HOB for a loaded PE32 module. > + > + This function builds a HOB for a loaded PE32 module. > + If ModuleName is NULL, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param ModuleName The GUID File Name of the module. > + @param MemoryAllocationModule The 64 bit physical address of the module. > + @param ModuleLength The length of the module in bytes. > + @param EntryPoint The 64 bit physical address of the module entry point. > + > +**/ > +VOID > +EFIAPI > +BuildModuleHob ( > + IN CONST EFI_GUID *ModuleName, > + IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule, > + IN UINT64 ModuleLength, > + IN EFI_PHYSICAL_ADDRESS EntryPoint > + ) > +{ > + EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob; > + > + ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) && > + ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0)); > + > + Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE)); > + > + CopyGuid (&(Hob->MemoryAllocationHeader.Name), &gEfiHobMemoryAllocModuleGuid); > + Hob->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule; > + Hob->MemoryAllocationHeader.MemoryLength = ModuleLength; > + Hob->MemoryAllocationHeader.MemoryType = EfiBootServicesCode; > + > + // > + // Zero the reserved space to match HOB spec > + // > + ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof (Hob->MemoryAllocationHeader.Reserved)); > + > + CopyGuid (&Hob->ModuleName, ModuleName); > + Hob->EntryPoint = EntryPoint; > +} > + > +/** > + Builds a HOB that describes a chunk of system memory. > + > + This function builds a HOB that describes a chunk of system memory. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param ResourceType The type of resource described by this HOB. > + @param ResourceAttribute The resource attributes of the memory described by this HOB. > + @param PhysicalStart The 64 bit physical address of memory described by this HOB. > + @param NumberOfBytes The length of the memory described by this HOB in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildResourceDescriptorHob ( > + IN EFI_RESOURCE_TYPE ResourceType, > + IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute, > + IN EFI_PHYSICAL_ADDRESS PhysicalStart, > + IN UINT64 NumberOfBytes > + ) > +{ > + EFI_HOB_RESOURCE_DESCRIPTOR *Hob; > + > + Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR)); > + ASSERT(Hob != NULL); > + > + Hob->ResourceType = ResourceType; > + Hob->ResourceAttribute = ResourceAttribute; > + Hob->PhysicalStart = PhysicalStart; > + Hob->ResourceLength = NumberOfBytes; > +} > + > +/** > + Builds a GUID HOB with a certain data length. > + > + This function builds a customized HOB tagged with a GUID for identification > + and returns the start address of GUID HOB data so that caller can fill the customized data. > + The HOB Header and Name field is already stripped. > + If Guid is NULL, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT(). > + > + @param Guid The GUID to tag the customized HOB. > + @param DataLength The size of the data payload for the GUID HOB. > + > + @return The start address of GUID HOB data. > + > +**/ > +VOID * > +EFIAPI > +BuildGuidHob ( > + IN CONST EFI_GUID *Guid, > + IN UINTN DataLength > + ) > +{ > + EFI_HOB_GUID_TYPE *Hob; > + > + // > + // Make sure that data length is not too long. > + // > + ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE))); > + > + Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength)); > + CopyGuid (&Hob->Name, Guid); > + return Hob + 1; > +} > + > + > +/** > + Copies a data buffer to a newly-built HOB. > + > + This function builds a customized HOB tagged with a GUID for identification, > + copies the input data to the HOB data field and returns the start address of the GUID HOB data. > + The HOB Header and Name field is already stripped. > + If Guid is NULL, then ASSERT(). > + If Data is NULL and DataLength > 0, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT(). > + > + @param Guid The GUID to tag the customized HOB. > + @param Data The data to be copied into the data field of the GUID HOB. > + @param DataLength The size of the data payload for the GUID HOB. > + > + @return The start address of GUID HOB data. > + > +**/ > +VOID * > +EFIAPI > +BuildGuidDataHob ( > + IN CONST EFI_GUID *Guid, > + IN VOID *Data, > + IN UINTN DataLength > + ) > +{ > + VOID *HobData; > + > + ASSERT (Data != NULL || DataLength == 0); > + > + HobData = BuildGuidHob (Guid, DataLength); > + > + return CopyMem (HobData, Data, DataLength); > +} > + > +/** > + Builds a Firmware Volume HOB. > + > + This function builds a Firmware Volume HOB. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The base address of the Firmware Volume. > + @param Length The size of the Firmware Volume in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildFvHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + EFI_HOB_FIRMWARE_VOLUME *Hob; > + > + Hob = CreateHob (EFI_HOB_TYPE_FV, sizeof (EFI_HOB_FIRMWARE_VOLUME)); > + > + Hob->BaseAddress = BaseAddress; > + Hob->Length = Length; > +} > + > + > +/** > + Builds a EFI_HOB_TYPE_FV2 HOB. > + > + This function builds a EFI_HOB_TYPE_FV2 HOB. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The base address of the Firmware Volume. > + @param Length The size of the Firmware Volume in bytes. > + @param FvName The name of the Firmware Volume. > + @param FileName The name of the file. > + > +**/ > +VOID > +EFIAPI > +BuildFv2Hob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN CONST EFI_GUID *FvName, > + IN CONST EFI_GUID *FileName > + ) > +{ > + EFI_HOB_FIRMWARE_VOLUME2 *Hob; > + > + Hob = CreateHob (EFI_HOB_TYPE_FV2, sizeof (EFI_HOB_FIRMWARE_VOLUME2)); > + > + Hob->BaseAddress = BaseAddress; > + Hob->Length = Length; > + CopyGuid (&Hob->FvName, FvName); > + CopyGuid (&Hob->FileName, FileName); > +} > + > + > +/** > + Builds a HOB for the CPU. > + > + This function builds a HOB for the CPU. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param SizeOfMemorySpace The maximum physical memory addressability of the processor. > + @param SizeOfIoSpace The maximum physical I/O addressability of the processor. > + > +**/ > +VOID > +EFIAPI > +BuildCpuHob ( > + IN UINT8 SizeOfMemorySpace, > + IN UINT8 SizeOfIoSpace > + ) > +{ > + EFI_HOB_CPU *Hob; > + > + Hob = CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU)); > + > + Hob->SizeOfMemorySpace = SizeOfMemorySpace; > + Hob->SizeOfIoSpace = SizeOfIoSpace; > + > + // > + // Zero the reserved space to match HOB spec > + // > + ZeroMem (Hob->Reserved, sizeof (Hob->Reserved)); > +} > + > +/** > + Builds a HOB for the memory allocation. > + > + This function builds a HOB for the memory allocation. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the memory. > + @param Length The length of the memory allocation in bytes. > + @param MemoryType Type of memory allocated by this HOB. > + > +**/ > +VOID > +EFIAPI > +BuildMemoryAllocationHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN EFI_MEMORY_TYPE MemoryType > + ) > +{ > + EFI_HOB_MEMORY_ALLOCATION *Hob; > + > + ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) && > + ((Length & (EFI_PAGE_SIZE - 1)) == 0)); > + > + Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION)); > + > + ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID)); > + Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress; > + Hob->AllocDescriptor.MemoryLength = Length; > + Hob->AllocDescriptor.MemoryType = MemoryType; > + // > + // Zero the reserved space to match HOB spec > + // > + ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved)); > +} > + > +/** > + Builds a HOB that describes a chunk of system memory with Owner GUID. > + > + This function builds a HOB that describes a chunk of system memory. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param ResourceType The type of resource described by this HOB. > + @param ResourceAttribute The resource attributes of the memory described by this HOB. > + @param PhysicalStart The 64 bit physical address of memory described by this HOB. > + @param NumberOfBytes The length of the memory described by this HOB in bytes. > + @param OwnerGUID GUID for the owner of this resource. > + > +**/ > +VOID > +EFIAPI > +BuildResourceDescriptorWithOwnerHob ( > + IN EFI_RESOURCE_TYPE ResourceType, > + IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute, > + IN EFI_PHYSICAL_ADDRESS PhysicalStart, > + IN UINT64 NumberOfBytes, > + IN EFI_GUID *OwnerGUID > + ) > +{ > + ASSERT (FALSE); > +} > + > +/** > + Builds a Capsule Volume HOB. > + > + This function builds a Capsule Volume HOB. > + If the platform does not support Capsule Volume HOBs, then ASSERT(). > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The base address of the Capsule Volume. > + @param Length The size of the Capsule Volume in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildCvHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + ASSERT (FALSE); > +} > + > + > +/** > + Builds a HOB for the BSP store. > + > + This function builds a HOB for BSP store. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the BSP. > + @param Length The length of the BSP store in bytes. > + @param MemoryType Type of memory allocated by this HOB. > + > +**/ > +VOID > +EFIAPI > +BuildBspStoreHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length, > + IN EFI_MEMORY_TYPE MemoryType > + ) > +{ > + ASSERT (FALSE); > +} > + > +/** > + Builds a HOB for the Stack. > + > + This function builds a HOB for the stack. > + If there is no additional space for HOB creation, then ASSERT(). > + > + @param BaseAddress The 64 bit physical address of the Stack. > + @param Length The length of the stack in bytes. > + > +**/ > +VOID > +EFIAPI > +BuildStackHob ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ) > +{ > + ASSERT (FALSE); > +} > diff --git a/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf > new file mode 100644 > index 0000000..d73188e > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmHobLib/StandaloneMmHobLib.inf > @@ -0,0 +1,48 @@ > +## @file > +# Instance of HOB Library for Standalone MM Core. > +# > +# HOB Library implementation for the Standalone MM Core. Does not have a constructor. > +# Uses gHobList defined in the Standalone MM Core Entry Point Library. > +# > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> +# > +# 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 = HobLib > + FILE_GUID = 8262551B-AB2D-4E76-99FC-5EBB83F4988E > + MODULE_TYPE = MM_STANDALONE > + VERSION_STRING = 1.0 > + PI_SPECIFICATION_VERSION = 0x00010032 > + LIBRARY_CLASS = HobLib|MM_STANDALONE > + CONSTRUCTOR = HobLibConstructor > +# > +# VALID_ARCHITECTURES = AARCH64 > +# > +[Sources.Common] > + StandaloneMmHobLib.c > + > +[Sources.AARCH64] > + AArch64/StandaloneMmCoreHobLibInternal.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + MmServicesTableLib > + > +[Guids] > + gEfiHobListGuid ## CONSUMES ## SystemTable > diff --git a/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.c b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.c > new file mode 100644 > index 0000000..e989f27 > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.c > @@ -0,0 +1,824 @@ > +/** @file > + Support routines for memory allocation routines based on Standalone MM Core internal functions. > + > + Copyright (c) 2015, Intel Corporation. All rights reserved.
> + Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> + > + 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 > + > +#include > +#include > +#include > +#include > + > +extern EFI_MM_SYSTEM_TABLE *gMmst; > + > +/** > + Allocates one or more 4KB pages of a certain memory type. > + > + Allocates the number of 4KB pages of a certain memory type and returns a pointer to the allocated > + buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL is returned. > + If there is not enough memory remaining to satisfy the request, then NULL is returned. > + > + @param MemoryType The type of memory to allocate. > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocatePages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + > + if (Pages == 0) { > + return NULL; > + } > + > + Status = gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + return (VOID *) (UINTN) Memory; > +} > + > +/** > + Allocates one or more 4KB pages of type EfiBootServicesData. > + > + Allocates the number of 4KB pages of type EfiBootServicesData and returns a pointer to the > + allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL > + is returned. If there is not enough memory remaining to satisfy the request, then NULL is > + returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePages ( > + IN UINTN Pages > + ) > +{ > + return InternalAllocatePages (EfiRuntimeServicesData, Pages); This type is wrong > +} > + > +/** > + Allocates one or more 4KB pages of type EfiRuntimeServicesData. > + > + Allocates the number of 4KB pages of type EfiRuntimeServicesData and returns a pointer to the > + allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL > + is returned. If there is not enough memory remaining to satisfy the request, then NULL is > + returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimePages ( > + IN UINTN Pages > + ) > +{ > + return InternalAllocatePages (EfiRuntimeServicesData, Pages); > +} > + > +/** > + Allocates one or more 4KB pages of type EfiReservedMemoryType. > + > + Allocates the number of 4KB pages of type EfiReservedMemoryType and returns a pointer to the > + allocated buffer. The buffer returned is aligned on a 4KB boundary. If Pages is 0, then NULL > + is returned. If there is not enough memory remaining to satisfy the request, then NULL is > + returned. > + > + @param Pages The number of 4 KB pages to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedPages ( > + IN UINTN Pages > + ) > +{ > + return NULL; > +} > + > +/** > + Frees one or more 4KB pages that were previously allocated with one of the page allocation > + functions in the Memory Allocation Library. > + > + Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer > + must have been allocated on a previous call to the page allocation services of the Memory > + Allocation Library. If it is not possible to free allocated pages, then this function will > + perform no actions. > + > + If Buffer was not allocated with a page allocation function in the Memory Allocation Library, > + then ASSERT(). > + If Pages is zero, then ASSERT(). > + > + @param Buffer Pointer to the buffer of pages to free. > + @param Pages The number of 4 KB pages to free. > + > +**/ > +VOID > +EFIAPI > +FreePages ( > + IN VOID *Buffer, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + > + ASSERT (Pages != 0); > + Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages); > + ASSERT_EFI_ERROR (Status); > +} > + > +/** > + Allocates one or more 4KB pages of a certain memory type at a specified alignment. > + > + Allocates the number of 4KB pages specified by Pages of a certain memory type with an alignment > + specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is returned. > + If there is not enough memory at the specified alignment remaining to satisfy the request, then > + NULL is returned. > + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param MemoryType The type of memory to allocate. > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocation. Must be a power of two. > + If Alignment is zero, then byte alignment is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateAlignedPages ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + EFI_STATUS Status; > + EFI_PHYSICAL_ADDRESS Memory; > + UINTN AlignedMemory; > + UINTN AlignmentMask; > + UINTN UnalignedPages; > + UINTN RealPages; > + > + // > + // Alignment must be a power of two or zero. > + // > + ASSERT ((Alignment & (Alignment - 1)) == 0); > + > + if (Pages == 0) { > + return NULL; > + } > + if (Alignment > EFI_PAGE_SIZE) { > + // > + // Calculate the total number of pages since alignment is larger than page size. > + // > + AlignmentMask = Alignment - 1; > + RealPages = Pages + EFI_SIZE_TO_PAGES (Alignment); > + // > + // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow. > + // > + ASSERT (RealPages > Pages); > + > + Status = gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, RealPages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + AlignedMemory = ((UINTN) Memory + AlignmentMask) & ~AlignmentMask; > + UnalignedPages = EFI_SIZE_TO_PAGES (AlignedMemory - (UINTN) Memory); > + if (UnalignedPages > 0) { > + // > + // Free first unaligned page(s). > + // > + Status = gMmst->MmFreePages (Memory, UnalignedPages); > + ASSERT_EFI_ERROR (Status); > + } > + Memory = (EFI_PHYSICAL_ADDRESS) (AlignedMemory + EFI_PAGES_TO_SIZE (Pages)); > + UnalignedPages = RealPages - Pages - UnalignedPages; > + if (UnalignedPages > 0) { > + // > + // Free last unaligned page(s). > + // > + Status = gMmst->MmFreePages (Memory, UnalignedPages); > + ASSERT_EFI_ERROR (Status); > + } > + } else { > + // > + // Do not over-allocate pages in this case. > + // > + Status = gMmst->MmAllocatePages (AllocateAnyPages, MemoryType, Pages, &Memory); > + if (EFI_ERROR (Status)) { > + return NULL; > + } > + AlignedMemory = (UINTN) Memory; > + } > + return (VOID *) AlignedMemory; > +} > + > +/** > + Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment. > + > + Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an > + alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment remaining to satisfy the > + request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocation. Must be a power of two. > + If Alignment is zero, then byte alignment is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedPages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment); > +} > + > +/** > + Allocates one or more 4KB pages of type EfiRuntimeServicesData at a specified alignment. > + > + Allocates the number of 4KB pages specified by Pages of type EfiRuntimeServicesData with an > + alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment remaining to satisfy the > + request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocation. Must be a power of two. > + If Alignment is zero, then byte alignment is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedRuntimePages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return InternalAllocateAlignedPages (EfiRuntimeServicesData, Pages, Alignment); > +} > + > +/** > + Allocates one or more 4KB pages of type EfiReservedMemoryType at a specified alignment. > + > + Allocates the number of 4KB pages specified by Pages of type EfiReservedMemoryType with an > + alignment specified by Alignment. The allocated buffer is returned. If Pages is 0, then NULL is > + returned. If there is not enough memory at the specified alignment remaining to satisfy the > + request, then NULL is returned. > + > + If Alignment is not a power of two and Alignment is not zero, then ASSERT(). > + If Pages plus EFI_SIZE_TO_PAGES (Alignment) overflows, then ASSERT(). > + > + @param Pages The number of 4 KB pages to allocate. > + @param Alignment The requested alignment of the allocation. Must be a power of two. > + If Alignment is zero, then byte alignment is used. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateAlignedReservedPages ( > + IN UINTN Pages, > + IN UINTN Alignment > + ) > +{ > + return NULL; > +} > + > +/** > + Frees one or more 4KB pages that were previously allocated with one of the aligned page > + allocation functions in the Memory Allocation Library. > + > + Frees the number of 4KB pages specified by Pages from the buffer specified by Buffer. Buffer > + must have been allocated on a previous call to the aligned page allocation services of the Memory > + Allocation Library. If it is not possible to free allocated pages, then this function will > + perform no actions. > + > + If Buffer was not allocated with an aligned page allocation function in the Memory Allocation > + Library, then ASSERT(). > + If Pages is zero, then ASSERT(). > + > + @param Buffer Pointer to the buffer of pages to free. > + @param Pages The number of 4 KB pages to free. > + > +**/ > +VOID > +EFIAPI > +FreeAlignedPages ( > + IN VOID *Buffer, > + IN UINTN Pages > + ) > +{ > + EFI_STATUS Status; > + > + ASSERT (Pages != 0); > + Status = gMmst->MmFreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) Buffer, Pages); > + ASSERT_EFI_ERROR (Status); > +} > + > +/** > + Allocates a buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain pool type and returns a > + pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is > + returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. > + > + @param MemoryType The type of memory to allocate. > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocatePool ( > + IN EFI_MEMORY_TYPE MemoryType, > + IN UINTN AllocationSize > + ) > +{ > + EFI_STATUS Status; > + VOID *Memory; > + > + Memory = NULL; > + > + Status = gMmst->MmAllocatePool (MemoryType, AllocationSize, &Memory); > + if (EFI_ERROR (Status)) { > + Memory = NULL; > + } > + return Memory; > +} > + > +/** > + Allocates a buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a > + pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is > + returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocatePool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocatePool (EfiRuntimeServicesData, AllocationSize); > +} > + > +/** > + Allocates a buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData and returns > + a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is > + returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimePool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocatePool (EfiRuntimeServicesData, AllocationSize); > +} > + > +/** > + Allocates a buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType and returns > + a pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is > + returned. If there is not enough memory remaining to satisfy the request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedPool ( > + IN UINTN AllocationSize > + ) > +{ > + return NULL; > +} > + > +/** > + Allocates and zeros a buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain pool type, clears the buffer > + with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a valid > + buffer of 0 size is returned. If there is not enough memory remaining to satisfy the request, > + then NULL is returned. > + > + @param PoolType The type of memory to allocate. > + @param AllocationSize The number of bytes to allocate and zero. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateZeroPool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN AllocationSize > + ) > +{ > + VOID *Memory; > + > + Memory = InternalAllocatePool (PoolType, AllocationSize); > + if (Memory != NULL) { > + Memory = ZeroMem (Memory, AllocationSize); > + } > + return Memory; > +} > + > +/** > + Allocates and zeros a buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the > + buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the > + request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize); > +} > + > +/** > + Allocates and zeros a buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, clears the > + buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the > + request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimeZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return InternalAllocateZeroPool (EfiRuntimeServicesData, AllocationSize); > +} > + > +/** > + Allocates and zeros a buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, clears the > + buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a > + valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the > + request, then NULL is returned. > + > + @param AllocationSize The number of bytes to allocate and zero. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedZeroPool ( > + IN UINTN AllocationSize > + ) > +{ > + return NULL; > +} > + > +/** > + Copies a buffer to an allocated buffer of a certain pool type. > + > + Allocates the number bytes specified by AllocationSize of a certain pool type, copies > + AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the > + allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there > + is not enough memory remaining to satisfy the request, then NULL is returned. > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). > + > + @param PoolType The type of pool to allocate. > + @param AllocationSize The number of bytes to allocate and zero. > + @param Buffer The buffer to copy to the allocated buffer. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalAllocateCopyPool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + VOID *Memory; > + > + ASSERT (Buffer != NULL); > + ASSERT (AllocationSize <= (MAX_ADDRESS - (UINTN) Buffer + 1)); > + > + Memory = InternalAllocatePool (PoolType, AllocationSize); > + if (Memory != NULL) { > + Memory = CopyMem (Memory, Buffer, AllocationSize); > + } > + return Memory; > +} > + > +/** > + Copies a buffer to an allocated buffer of type EfiBootServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, copies > + AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the > + allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there > + is not enough memory remaining to satisfy the request, then NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). > + > + @param AllocationSize The number of bytes to allocate and zero. > + @param Buffer The buffer to copy to the allocated buffer. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer); > +} > + > +/** > + Copies a buffer to an allocated buffer of type EfiRuntimeServicesData. > + > + Allocates the number bytes specified by AllocationSize of type EfiRuntimeServicesData, copies > + AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the > + allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there > + is not enough memory remaining to satisfy the request, then NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). > + > + @param AllocationSize The number of bytes to allocate and zero. > + @param Buffer The buffer to copy to the allocated buffer. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateRuntimeCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return InternalAllocateCopyPool (EfiRuntimeServicesData, AllocationSize, Buffer); > +} > + > +/** > + Copies a buffer to an allocated buffer of type EfiReservedMemoryType. > + > + Allocates the number bytes specified by AllocationSize of type EfiReservedMemoryType, copies > + AllocationSize bytes from Buffer to the newly allocated buffer, and returns a pointer to the > + allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is returned. If there > + is not enough memory remaining to satisfy the request, then NULL is returned. > + > + If Buffer is NULL, then ASSERT(). > + If AllocationSize is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). > + > + @param AllocationSize The number of bytes to allocate and zero. > + @param Buffer The buffer to copy to the allocated buffer. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +AllocateReservedCopyPool ( > + IN UINTN AllocationSize, > + IN CONST VOID *Buffer > + ) > +{ > + return NULL; > +} > + > +/** > + Reallocates a buffer of a specified memory type. > + > + Allocates and zeros the number bytes specified by NewSize from memory of the type > + specified by PoolType. If OldBuffer is not NULL, then the smaller of OldSize and > + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and > + OldBuffer is freed. A pointer to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not > + enough memory remaining to satisfy the request, then NULL is returned. > + > + If the allocation of the new buffer is successful and the smaller of NewSize and OldSize > + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT(). > + > + @param PoolType The type of pool to allocate. > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate. > + @param OldBuffer The buffer to copy to the allocated buffer. This is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +InternalReallocatePool ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + VOID *NewBuffer; > + > + NewBuffer = InternalAllocateZeroPool (PoolType, NewSize); > + if (NewBuffer != NULL && OldBuffer != NULL) { > + CopyMem (NewBuffer, OldBuffer, MIN (OldSize, NewSize)); > + FreePool (OldBuffer); > + } > + return NewBuffer; > +} > + > +/** > + Reallocates a buffer of type EfiBootServicesData. > + > + Allocates and zeros the number bytes specified by NewSize from memory of type > + EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and > + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and > + OldBuffer is freed. A pointer to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not > + enough memory remaining to satisfy the request, then NULL is returned. > + > + If the allocation of the new buffer is successful and the smaller of NewSize and OldSize > + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate. > + @param OldBuffer The buffer to copy to the allocated buffer. This is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocatePool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer); Same here > +} > + > +/** > + Reallocates a buffer of type EfiRuntimeServicesData. > + > + Allocates and zeros the number bytes specified by NewSize from memory of type > + EfiRuntimeServicesData. If OldBuffer is not NULL, then the smaller of OldSize and > + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and > + OldBuffer is freed. A pointer to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not > + enough memory remaining to satisfy the request, then NULL is returned. > + > + If the allocation of the new buffer is successful and the smaller of NewSize and OldSize > + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate. > + @param OldBuffer The buffer to copy to the allocated buffer. This is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocateRuntimePool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return InternalReallocatePool (EfiRuntimeServicesData, OldSize, NewSize, OldBuffer); > +} > + > +/** > + Reallocates a buffer of type EfiReservedMemoryType. > + > + Allocates and zeros the number bytes specified by NewSize from memory of type > + EfiReservedMemoryType. If OldBuffer is not NULL, then the smaller of OldSize and > + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and > + OldBuffer is freed. A pointer to the newly allocated buffer is returned. > + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not > + enough memory remaining to satisfy the request, then NULL is returned. > + > + If the allocation of the new buffer is successful and the smaller of NewSize and OldSize > + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT(). > + > + @param OldSize The size, in bytes, of OldBuffer. > + @param NewSize The size, in bytes, of the buffer to reallocate. > + @param OldBuffer The buffer to copy to the allocated buffer. This is an optional > + parameter that may be NULL. > + > + @return A pointer to the allocated buffer or NULL if allocation fails. > + > +**/ > +VOID * > +EFIAPI > +ReallocateReservedPool ( > + IN UINTN OldSize, > + IN UINTN NewSize, > + IN VOID *OldBuffer OPTIONAL > + ) > +{ > + return NULL; > +} > + > +/** > + Frees a buffer that was previously allocated with one of the pool allocation functions in the > + Memory Allocation Library. > + > + Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the > + pool allocation services of the Memory Allocation Library. If it is not possible to free pool > + resources, then this function will perform no actions. > + > + If Buffer was not allocated with a pool allocation function in the Memory Allocation Library, > + then ASSERT(). > + > + @param Buffer Pointer to the buffer to free. > + > +**/ > +VOID > +EFIAPI > +FreePool ( > + IN VOID *Buffer > + ) > +{ > + EFI_STATUS Status; > + > + Status = gMmst->MmFreePool (Buffer); > + ASSERT_EFI_ERROR (Status); > +} > + > diff --git a/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf > new file mode 100644 > index 0000000..9ac03df > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmMemoryAllocationLib/StandaloneMmMemoryAllocationLib.inf > @@ -0,0 +1,45 @@ > +## @file > +# Memory Allocation Library instance dedicated to MM Core. > +# The implementation borrows the MM Core Memory Allocation services as the primitive > +# for memory allocation instead of using MM System Table servces in an indirect way. > +# It is assumed that this library instance must be linked with MM Core in this package. > +# > +# Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> +# > +# 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 = MemoryAllocationLib > + FILE_GUID = 54646378-A9DC-473F-9BE1-BD027C4C76DE > + MODULE_TYPE = MM_CORE_STANDALONE Should this be BASE? > + VERSION_STRING = 1.0 > + PI_SPECIFICATION_VERSION = 0x00010032 > + LIBRARY_CLASS = MemoryAllocationLib|MM_STANDALONE > + > +# > +# The following information is for reference only and not required by the build tools. > +# > +# VALID_ARCHITECTURES = IA32 X64 AARCH64 > +# > + > +[Sources] > + StandaloneMmMemoryAllocationLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + StandaloneMmPkg/StandaloneMmPkg.dec > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + MmServicesTableLib > + HobLib > diff --git a/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.c b/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.c > new file mode 100644 > index 0000000..e0e0044 > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.c > @@ -0,0 +1,64 @@ > +/** @file > + MM Core MM Services Table Library. > + > + Copyright (c) 2015, Intel Corporation. All rights reserved.
> + Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> + > + 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 > +#include > + > +extern EFI_MM_SYSTEM_TABLE *gMmst; > + > +/** > + The constructor function caches the pointer of MM Services Table. > + > + @param ImageHandle The firmware allocated handle for the EFI image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. > + > +**/ > +EFI_STATUS > +EFIAPI > +StandaloneMmServicesTableLibConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_MM_SYSTEM_TABLE *MmSystemTable > + ) > +{ > + gMmst = MmSystemTable; > + return EFI_SUCCESS; > +} > + > +/** > + This function allows the caller to determine if the driver is executing in > + Standalone Management Mode(SMM). > + > + This function returns TRUE if the driver is executing in SMM and FALSE if the > + driver is not executing in SMM. > + > + @retval TRUE The driver is executing in Standalone Management Mode (SMM). > + @retval FALSE The driver is not executing in Standalone Management Mode (SMM). > + > +**/ > +BOOLEAN > +EFIAPI > +InMm ( > + VOID > + ) > +{ > + // > + // We are already in Standalone MM > + // > + return TRUE; > +} > + > diff --git a/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf b/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf > new file mode 100644 > index 0000000..c362429 > --- /dev/null > +++ b/StandaloneMmPkg/Library/StandaloneMmServicesTableLib/StandaloneMmServicesTableLib.inf > @@ -0,0 +1,36 @@ > +## @file > +# MM Core MM Services Table Library. > +# > +# Copyright (c) 2015, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
> +# > +# 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 = 0x00010005 > + BASE_NAME = StandaloneMmServicesTableLib > + FILE_GUID = BEE33A2F-F49D-4B71-AF3E-FFCCB9885DEA > + MODULE_TYPE = MM_STANDALONE > + VERSION_STRING = 1.0 > + PI_SPECIFICATION_VERSION = 0x00010032 > + LIBRARY_CLASS = MmServicesTableLib|MM_STANDALONE > + CONSTRUCTOR = StandaloneMmServicesTableLibConstructor > + > +# > +# VALID_ARCHITECTURES = IA32 X64 AARCH64 > +# > + > +[Sources] > + StandaloneMmServicesTableLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > -- > 2.7.4 >