From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Supreeth.Venkatesh@arm.com>
Received-SPF: Pass (sender SPF authorized) identity=mailfrom;
 client-ip=104.47.1.82; helo=eur01-ve1-obe.outbound.protection.outlook.com;
 envelope-from=supreeth.venkatesh@arm.com; receiver=edk2-devel@lists.01.org 
Received: from EUR01-VE1-obe.outbound.protection.outlook.com
 (mail-ve1eur01on0082.outbound.protection.outlook.com [104.47.1.82])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits))
 (No client certificate requested)
 by ml01.01.org (Postfix) with ESMTPS id 4B054203BEA3F
 for <edk2-devel@lists.01.org>; Fri,  4 May 2018 16:22:23 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; 
 s=selector1-arm-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version;
 bh=MDaEgEb/BxlLOHRLjLR3VDlrYqQJ4MgcPc/ackj6f2M=;
 b=Lwkp/ojTYZti7n6Es08A4KQq/6dFoBHfQra0qnFwb7fcPSW+1f+kWjpZ15WtaILQBOaUcloXu6a8xDo7QkbGao7nPwA9aE5jEw76zNnotH+SGuk4GJHL3t135W3EUZbfAjWm3C3pWEyDEJfNxY2XVXAOZBUVC1otGfY5Vg2yvOI=
Received: from AM4PR0802MB2306.eurprd08.prod.outlook.com (10.172.218.15) by
 AM4PR0802MB2276.eurprd08.prod.outlook.com (10.172.218.9) with Microsoft SMTP
 Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.735.16; Fri, 4 May 2018 23:22:19 +0000
Received: from AM4PR0802MB2306.eurprd08.prod.outlook.com
 ([fe80::e117:6f62:6a9b:6be4]) by AM4PR0802MB2306.eurprd08.prod.outlook.com
 ([fe80::e117:6f62:6a9b:6be4%8]) with mapi id 15.20.0735.016; Fri, 4 May 2018
 23:22:19 +0000
From: Supreeth Venkatesh <Supreeth.Venkatesh@arm.com>
To: "Yao, Jiewen" <jiewen.yao@intel.com>, Achin Gupta <Achin.Gupta@arm.com>
CC: "edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Thread-Topic: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific
 HOB Library for management mode.
Thread-Index: AQHTzbWgGBqTRELvBEGsHj9vUWz2G6QRrf0AgAF0yYCACeOY0A==
Date: Fri, 4 May 2018 23:22:19 +0000
Message-ID: <AM4PR0802MB23060CF55DB59A2C8D87442E80860@AM4PR0802MB2306.eurprd08.prod.outlook.com>
References: <20180406144223.10931-1-supreeth.venkatesh@arm.com>
 <20180406144223.10931-11-supreeth.venkatesh@arm.com>
 <20180425145007.GP663@e104320-lin>
 <74D8A39837DF1E4DA445A8C0B3885C503AB81B1C@shsmsx102.ccr.corp.intel.com>
In-Reply-To: <74D8A39837DF1E4DA445A8C0B3885C503AB81B1C@shsmsx102.ccr.corp.intel.com>
Accept-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
authentication-results: spf=none (sender IP is )
 smtp.mailfrom=Supreeth.Venkatesh@arm.com; 
x-originating-ip: [217.140.111.135]
x-ms-publictraffictype: Email
x-microsoft-exchange-diagnostics: 1; AM4PR0802MB2276;
 7:mG0g08Xsz2xmh3Y08PD7ZsVyZChQKvkgKIDfRcvAQk+Mof56tDuqWeByBXbExnrL9BODHRBGn2QBYNTNCeuYa3pmh7O7CYeMjXpTTJE8oEb+REVLRE3PzL0x/K5eoEr/KA38Scw/EtRRAf8xYwuG09rwCftPxzarkkc74TOnn/7EQQdvbD8GoCr1zR9EY8DOeBAFhvRjVVWz7oIFognVxtRCLOkOqoPquUK5cGrgZ17iLzX2bVbYtg5vdnol1gja
x-ms-exchange-antispam-srfa-diagnostics: SOS;SOR;
x-ms-office365-filtering-ht: Tenant
x-microsoft-antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020);
 SRVR:AM4PR0802MB2276; 
x-ms-traffictypediagnostic: AM4PR0802MB2276:
x-microsoft-antispam-prvs: <AM4PR0802MB2276DD72E3E1B0FED79C2F7580860@AM4PR0802MB2276.eurprd08.prod.outlook.com>
x-exchange-antispam-report-test: UriScan:(180628864354917)(162533806227266)(228905959029699); 
x-exchange-antispam-report-cfa-test: BCL:0; PCL:0;
 RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3231254)(944501410)(52105095)(3002001)(6055026)(6041310)(20161123564045)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(6072148)(201708071742011);
 SRVR:AM4PR0802MB2276; BCL:0; PCL:0; RULEID:; SRVR:AM4PR0802MB2276; 
x-forefront-prvs: 06628F7CA4
x-forefront-antispam-report: SFV:NSPM;
 SFS:(10009020)(6029001)(376002)(39380400002)(346002)(366004)(39860400002)(396003)(13464003)(40434004)(189003)(199004)(6506007)(11346002)(26005)(105586002)(102836004)(305945005)(66066001)(33656002)(76176011)(7696005)(6436002)(3280700002)(3660700001)(478600001)(59450400001)(106356001)(446003)(486006)(53946003)(2906002)(14454004)(5660300001)(110136005)(53546011)(16200700003)(476003)(316002)(99286004)(81156014)(74316002)(9686003)(6306002)(93886005)(2900100001)(3846002)(8936002)(6116002)(4326008)(53376002)(6636002)(53936002)(81166006)(7736002)(55016002)(8676002)(72206003)(86362001)(966005)(25786009)(229853002)(97736004)(5250100002)(186003)(5890100001)(6246003)(68736007)(569006);
 DIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR0802MB2276;
 H:AM4PR0802MB2306.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en;
 PTR:InfoNoRecords; MX:1; A:1; 
received-spf: None (protection.outlook.com: arm.com does not designate
 permitted sender hosts)
x-microsoft-antispam-message-info: QKSppHN+3RJgce1YJloTrnwWxNvEUMPhreMfPsA87EilRQ2yuP7LOYMbE7mwXQXY0duDsMDc65ktTDMOH7Kp9Et+aNTAVsTKBjCD12AQNX7i9PbXCFt8nRub0RQhzP6O3plItLvrXCJOYgj8HQv8kTzJ4yFFGX2FFLspAAUwXEQKWsjI1zPyr08AHfn4UGLK
spamdiagnosticoutput: 1:99
spamdiagnosticmetadata: NSPM
MIME-Version: 1.0
X-MS-Office365-Filtering-Correlation-Id: 2da73ee0-c0a4-40e0-b157-08d5b215e1d3
X-OriginatorOrg: arm.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 2da73ee0-c0a4-40e0-b157-08d5b215e1d3
X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2018 23:22:19.4660 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d
X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0802MB2276
Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific HOB Library for management mode.
X-BeenThere: edk2-devel@lists.01.org
X-Mailman-Version: 2.1.26
Precedence: list
List-Id: EDK II Development  <edk2-devel.lists.01.org>
List-Unsubscribe: <https://lists.01.org/mailman/options/edk2-devel>,
 <mailto:edk2-devel-request@lists.01.org?subject=unsubscribe>
List-Archive: <http://lists.01.org/pipermail/edk2-devel/>
List-Post: <mailto:edk2-devel@lists.01.org>
List-Help: <mailto:edk2-devel-request@lists.01.org?subject=help>
List-Subscribe: <https://lists.01.org/mailman/listinfo/edk2-devel>,
 <mailto:edk2-devel-request@lists.01.org?subject=subscribe>
X-List-Received-Date: Fri, 04 May 2018 23:22:24 -0000
Content-Language: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

My response inline.

-----Original Message-----
From: Yao, Jiewen <jiewen.yao@intel.com>
Sent: Thursday, April 26, 2018 8:04 AM
To: Achin Gupta <Achin.Gupta@arm.com>; Supreeth Venkatesh <Supreeth.Venkate=
sh@arm.com>
Cc: edk2-devel@lists.01.org; Kinney, Michael D <michael.d.kinney@intel.com>=
; Gao, Liming <liming.gao@intel.com>; leif.lindholm@linaro.org; ard.biesheu=
vel@linaro.org; nd <nd@arm.com>
Subject: RE: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64 Specific =
HOB Library for management mode.

Maybe we can use same layout as MmMemLib.

It seems only HobConstructor() is Arm specific. Other functions are quite g=
eneric.

[Supreeth] Ok. I made the changes. Please check version 2.

Thank you

> -----Original Message-----
> From: Achin Gupta [mailto:achin.gupta@arm.com]
> Sent: Wednesday, April 25, 2018 7:50 AM
> To: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
> Cc: edk2-devel@lists.01.org; Kinney, Michael D
> <michael.d.kinney@intel.com>; Gao, Liming <liming.gao@intel.com>; Yao,
> Jiewen <jiewen.yao@intel.com>; leif.lindholm@linaro.org;
> ard.biesheuvel@linaro.org; nd@arm.com
> Subject: Re: [PATCH v1 10/18] StandaloneMmPkg/HobLib: Add AARCH64
> Specific HOB Library for management mode.
>
> Hi Supreeth,
>
> On Fri, Apr 06, 2018 at 03:42:15PM +0100, Supreeth Venkatesh wrote:
> > The Standalone MM environment is initialized during the SEC phase on
> > ARM Standard Platforms. The MM Core driver implements an entry point
> > module which is architecture specific and runs prior to the generic
> > core driver code. The former creates a Hob list that the latter
> > consumes. This happens in the same phase.
> >
> > This patch implements a Hob library that can be used by the entry
> > point module to produce a Hob list and by the core driver code to consu=
me it.
>
> References to DXE core need to be removed and the copyright years
> needs to be updated.
>
> I think it is worth getting this hoblib reviewed by the ArmPkg maintainer=
s.
>
> Acked-by: Achin Gupta <achin.gupta@arm.com>
>
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Achin Gupta <achin.gupta@arm.com>
> > Signed-off-by: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
> > ---
> >  StandaloneMmPkg/Library/HobLib/Arm/HobLib.c | 697
> ++++++++++++++++++++++++++++
> >  StandaloneMmPkg/Library/HobLib/HobLib.inf   |  45 ++
> >  2 files changed, 742 insertions(+)
> >  create mode 100644 StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> >  create mode 100644 StandaloneMmPkg/Library/HobLib/HobLib.inf
> >
> > diff --git a/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> b/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> > new file mode 100644
> > index 0000000000..62abf47f95
> > --- /dev/null
> > +++ b/StandaloneMmPkg/Library/HobLib/Arm/HobLib.c
> > @@ -0,0 +1,697 @@
> > +/** @file
> > +  HOB Library implementation for DxeCore driver.
> > +
> > +Copyright (c) 2006 - 2014, Intel Corporation. All rights
> > +reserved.<BR> Copyright (c) 2017, ARM Limited. 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/HobLib.h>
> > +#include <Library/DebugLib.h>
> > +#include <Library/BaseMemoryLib.h>
> > +
> > +#include <Guid/MemoryAllocationHob.h>
> > +
> > +//
> > +// Cache copy of HobList pointer.
> > +//
> > +VOID *gHobList =3D NULL;
> > +
> > +/**
> > +  Returns the pointer to the HOB list.
> > +
> > +  This function returns the pointer to first HOB in the list.
> > +  For PEI phase, the PEI service GetHobList() can be used to
> > + retrieve the
> pointer
> > +  to the HOB list.  For the DXE phase, the HOB list pointer can be
> > + retrieved
> through
> > +  the EFI System Table by looking up theHOB list GUID in the System
> Configuration Table.
> > +  Since the System Configuration Table does not exist that the time
> > + the DXE
> Core is
> > +  launched, the DXE Core uses a global variable from the DXE Core
> > + Entry
> Point Library
> > +  to manage the pointer to the HOB list.
> > +
> > +  If the pointer to the HOB list is NULL, then ASSERT().
> > +
> > +  @return The pointer to the HOB list.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +GetHobList (
> > +  VOID
> > +  )
> > +{
> > +  ASSERT (gHobList !=3D 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 !=3D NULL);
> > +
> > +  Hob.Raw =3D (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 =3D=3D Type) {
> > +      return Hob.Raw;
> > +    }
> > +    Hob.Raw =3D 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 retur=
n 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 =3D 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 =3D (UINT8 *) HobStart;  while ((GuidHob.Raw =3D
> > + GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION,
> GuidHob.Raw)) !=3D NULL) {
> > +    if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
> > +      break;
> > +    }
> > +    GuidHob.Raw =3D 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 =3D 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 =3D (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();
> > +
> > +  return  HandOffHob->BootMode;
> > +}
> > +
> > +
> > +/**
> > +
> > +
> > +**/
> > +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    =3D EfiFreeMemoryBottom;
> > +  HobEnd =3D (EFI_HOB_GENERIC_HEADER *)(Hob+1);
> > +
> > +  Hob->Header.HobType     =3D EFI_HOB_TYPE_HANDOFF;
> > +  Hob->Header.HobLength   =3D sizeof(EFI_HOB_HANDOFF_INFO_TABLE);
> > +  Hob->Header.Reserved    =3D 0;
> > +
> > +  HobEnd->HobType     =3D EFI_HOB_TYPE_END_OF_HOB_LIST;
> > +  HobEnd->HobLength   =3D sizeof(EFI_HOB_GENERIC_HEADER);
> > +  HobEnd->Reserved    =3D 0;
> > +
> > +  Hob->Version             =3D EFI_HOB_HANDOFF_TABLE_VERSION;
> > +  Hob->BootMode            =3D BOOT_WITH_FULL_CONFIGURATION;
> > +
> > +  Hob->EfiMemoryTop        =3D (UINTN)EfiMemoryBegin +
> EfiMemoryLength;
> > +  Hob->EfiMemoryBottom     =3D (UINTN)EfiMemoryBegin;
> > +  Hob->EfiFreeMemoryTop    =3D (UINTN)EfiFreeMemoryTop;
> > +  Hob->EfiFreeMemoryBottom =3D
> (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1);
> > +  Hob->EfiEndOfHobList     =3D (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;
> > +
> > +  gHobList =3D Hob;
> > +
> > +  return Hob;
> > +}
> > +
> > +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 =3D GetHobList ();
> > +
> > +  HobLength =3D (UINT16)((HobLength + 0x7) & (~0x7));
> > +
> > +  FreeMemory =3D HandOffHob->EfiFreeMemoryTop -
> HandOffHob->EfiFreeMemoryBottom;
> > +
> > +  if (FreeMemory < HobLength) {
> > +      return NULL;
> > +  }
> > +
> > +  Hob =3D (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType =3D HobType;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength =3D HobLength;
> > +  ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved =3D 0;
> > +
> > +  HobEnd =3D (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);
> > + HandOffHob->EfiEndOfHobList =3D (EFI_PHYSICAL_ADDRESS) (UINTN)
> HobEnd;
> > +
> > +  HobEnd->HobType   =3D EFI_HOB_TYPE_END_OF_HOB_LIST;
> > +  HobEnd->HobLength =3D sizeof(EFI_HOB_GENERIC_HEADER);
> > + HobEnd->Reserved  =3D 0;  HobEnd++;  HandOffHob->EfiFreeMemoryBottom
> > + =3D (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.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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)) =3D=3D 0) &&
> > +          ((ModuleLength & (EFI_PAGE_SIZE - 1)) =3D=3D 0));
> > +
> > +  Hob =3D CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof
> (EFI_HOB_MEMORY_ALLOCATION_MODULE));
> > +
> > +  CopyGuid (&(Hob->MemoryAllocationHeader.Name),
> &gEfiHobMemoryAllocModuleGuid);
> > +  Hob->MemoryAllocationHeader.MemoryBaseAddress =3D
> MemoryAllocationModule;
> > +  Hob->MemoryAllocationHeader.MemoryLength      =3D ModuleLength;
> > +  Hob->MemoryAllocationHeader.MemoryType        =3D
> EfiBootServicesCode;
> > +
> > +  //
> > +  // Zero the reserved space to match HOB spec  //  ZeroMem
> > + (Hob->MemoryAllocationHeader.Reserved, sizeof
> (Hob->MemoryAllocationHeader.Reserved));
> > +
> > +  CopyGuid (&Hob->ModuleName, ModuleName);
> > +  Hob->EntryPoint =3D EntryPoint;
> > +}
> > +
> > +/**
> > +  Builds a HOB that describes a chunk of system memory.
> > +
> > +  This function builds a HOB that describes a chunk of system memory.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() because PEI HOB is read-only for DXE phase.
> > +
> > +  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 =3D CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof
> (EFI_HOB_RESOURCE_DESCRIPTOR));
> > +  ASSERT(Hob !=3D NULL);
> > +
> > +  Hob->ResourceType      =3D ResourceType;
> > +  Hob->ResourceAttribute =3D ResourceAttribute;
> > +  Hob->PhysicalStart     =3D PhysicalStart;
> > +  Hob->ResourceLength    =3D 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.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  If Guid is NULL, then ASSERT().
> > +  If there is no additional space for HOB creation, then ASSERT().
> > +  If DataLength >=3D (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSE=
RT().
> > +
> > +  @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 <=3D (0xffff - sizeof (EFI_HOB_GUID_TYPE)));
> > +
> > +  Hob =3D 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.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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 >=3D (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSE=
RT().
> > +
> > +  @param  Guid          The GUID to tag the customized HOB.
> > +  @param  Data          The data to be copied into the data field of t=
he
> 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 !=3D NULL || DataLength =3D=3D 0);
> > +
> > +  HobData =3D BuildGuidHob (Guid, DataLength);
> > +
> > +  return CopyMem (HobData, Data, DataLength); }
> > +
> > +/**
> > +  Builds a Firmware Volume HOB.
> > +
> > +  This function builds a Firmware Volume HOB.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() because PEI HOB is read-only for DXE phase.
> > +
> > +  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 =3D CreateHob (EFI_HOB_TYPE_FV, sizeof
> (EFI_HOB_FIRMWARE_VOLUME));
> > +
> > +  Hob->BaseAddress =3D BaseAddress;
> > +  Hob->Length      =3D Length;
> > +}
> > +
> > +
> > +/**
> > +  Builds a EFI_HOB_TYPE_FV2 HOB.
> > +
> > +  This function builds a EFI_HOB_TYPE_FV2 HOB.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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 =3D CreateHob (EFI_HOB_TYPE_FV2, sizeof
> (EFI_HOB_FIRMWARE_VOLUME2));
> > +
> > +  Hob->BaseAddress =3D BaseAddress;
> > +  Hob->Length      =3D Length;
> > +  CopyGuid (&Hob->FvName, FvName);
> > +  CopyGuid (&Hob->FileName, FileName); }
> > +
> > +
> > +/**
> > +  Builds a HOB for the CPU.
> > +
> > +  This function builds a HOB for the CPU.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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 =3D CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU));
> > +
> > +  Hob->SizeOfMemorySpace =3D SizeOfMemorySpace;
> > +  Hob->SizeOfIoSpace     =3D 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.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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)) =3D=3D 0) &&
> > +          ((Length & (EFI_PAGE_SIZE - 1)) =3D=3D 0));
> > +
> > +  Hob =3D CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof
> (EFI_HOB_MEMORY_ALLOCATION));
> > +
> > +  ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));
> > + Hob->AllocDescriptor.MemoryBaseAddress =3D BaseAddress;
> > +  Hob->AllocDescriptor.MemoryLength      =3D Length;
> > +  Hob->AllocDescriptor.MemoryType        =3D 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.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +
> > +  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
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +/**
> > +  Builds a Capsule Volume HOB.
> > +
> > +  This function builds a Capsule Volume HOB.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() because PEI HOB is read-only for DXE phase.
> > +
> > +  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
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +
> > +/**
> > +  Builds a HOB for the BSP store.
> > +
> > +  This function builds a HOB for BSP store.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() because PEI HOB is read-only for DXE phase.
> > +
> > +  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
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +/**
> > +  Builds a HOB for the Stack.
> > +
> > +  This function builds a HOB for the stack.
> > +  It can only be invoked during PEI phase;  for DXE phase, it will
> > + ASSERT() since PEI HOB is read-only for DXE phase.
> > +  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
> > +  )
> > +{
> > +  //
> > +  // PEI HOB is read only for DXE phase
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > diff --git a/StandaloneMmPkg/Library/HobLib/HobLib.inf
> b/StandaloneMmPkg/Library/HobLib/HobLib.inf
> > new file mode 100644
> > index 0000000000..42273b6d66
> > --- /dev/null
> > +++ b/StandaloneMmPkg/Library/HobLib/HobLib.inf
> > @@ -0,0 +1,45 @@
> > +## @file
> > +# Instance of HOB Library for DXE Core.
> > +#
> > +# HOB Library implementation for the DXE Core. Does not have a constru=
ctor.
> > +#  Uses gHobList defined in the DXE Core Entry Point Library.
> > +#
> > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights
> > +reserved.<BR> # Copyright (c) 2016 - 2017, ARM Limited. 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                    =3D 0x0001001A
> > +  BASE_NAME                      =3D HobLib
> > +  FILE_GUID                      =3D
> CF56EF2C-68D8-4BD5-9A8B-8A7BFCFF751C
> > +  MODULE_TYPE                    =3D MM_CORE_STANDALONE
> > +  VERSION_STRING                 =3D 1.0
> > +  PI_SPECIFICATION_VERSION       =3D 0x00010032
> > +  LIBRARY_CLASS                  =3D HobLib|MM_CORE_STANDALONE
> MM_STANDALONE
> > +
> > +#
> > +#  VALID_ARCHITECTURES           =3D AARCH64
> > +#
> > +
> > +[Sources.AARCH64]
> > +  Arm/HobLib.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +
> > +
> > +[LibraryClasses]
> > +  BaseMemoryLib
> > +  DebugLib
> > +
> > +[Guids]
> > +  gEfiHobListGuid                               ## CONSUMES  ##
> SystemTable
> > --
> > 2.16.2
> >
IMPORTANT NOTICE: The contents of this email and any attachments are confid=
ential and may also be privileged. If you are not the intended recipient, p=
lease notify the sender immediately and do not disclose the contents to any=
 other person, use it for any purpose, or store or copy the information in =
any medium. Thank you.