From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=40.107.3.75; helo=eur03-am5-obe.outbound.protection.outlook.com; envelope-from=achin.gupta@arm.com; receiver=edk2-devel@lists.01.org Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-eopbgr30075.outbound.protection.outlook.com [40.107.3.75]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 75E6E226612D5 for ; Wed, 25 Apr 2018 07:48:45 -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=8ddKBsv45VuLHQ3yOUbYvNU5HjgOgGwpMlB/ta5wRPo=; b=L6MB+cuYJGiSjS/vBNcjoJf9zg7Z8A9T1aPaIiHby92sYWphNX/2G9duh0xkJulTjQ6sURkEPFbex3rZDNeyHJgWhys/sFNR19OTF4ild+/wQ/lx2+e0jqssiBkBGYeG2jM+pWVYoR3ac+WcOaBGYgPX03+0mUzn7dTWCr5NgGs= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Achin.Gupta@arm.com; Received: from e104320-lin (217.140.96.140) by AM0PR08MB2980.eurprd08.prod.outlook.com (2603:10a6:208:5b::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.696.12; Wed, 25 Apr 2018 14:48:41 +0000 Date: Wed, 25 Apr 2018 15:50:08 +0100 From: Achin Gupta To: Supreeth Venkatesh Cc: edk2-devel@lists.01.org, michael.d.kinney@intel.com, liming.gao@intel.com, jiewen.yao@intel.com, leif.lindholm@linaro.org, ard.biesheuvel@linaro.org, nd@arm.com Message-ID: <20180425145007.GP663@e104320-lin> References: <20180406144223.10931-1-supreeth.venkatesh@arm.com> <20180406144223.10931-11-supreeth.venkatesh@arm.com> MIME-Version: 1.0 In-Reply-To: <20180406144223.10931-11-supreeth.venkatesh@arm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Originating-IP: [217.140.96.140] X-ClientProxiedBy: VI1PR07CA0221.eurprd07.prod.outlook.com (2603:10a6:802:58::24) To AM0PR08MB2980.eurprd08.prod.outlook.com (2603:10a6:208:5b::25) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(2017052603328)(7153060)(7193020); SRVR:AM0PR08MB2980; X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 3:HkQAf8sgrj+iaOgASgH6TVxsdxXeR7PMwYDJYuyOtMWNj0Kh7yRQ0x9ZCCGk8CsKLNhJ0TCh0DYvm0UJFriWYzUBRoc4Ufi4oMKBHimSOxqjiPS5QFiaNzd5cwbiQsncEC3lozt5BSAB8KUm6/Hqr4cdIKLlIhDJ2DIQVHsbZdfww2sXrPl7+6zuAxuaQtRJqPy6gD74kzFRkGNoOtBcnUVDuEpY0msPkYyIkqmXWoU2cR+rwfiw3qkjcuWDhcqe; 25:ekvpRggy3eawEGWxuBas3YIMzk/bn4spCihOZv//M4TEeBMGksgSyJL8TN8PiWWwl+3Bf/7/hBdoIJoa/sGEbNPWISxs65ywlHVSq/w3VRszDFCUqFSw0S+DICyp7cBObIuV18eP95/ige9Vq2p/+k3Ymj7if2ENVeeFOpyOeZl33GyYq2OlJlYFvEgtt33+y4mtVhbfsEb3daMGS4cltbVfAEljcDRh4yJTloxWfKq48OpSrtAWZEOOTkrE1zvxhNUbeu8v/3cHw2ZNaUTK/7U9xXVTaylQzgMU5Ex0nwCjNigroB7rwttwQJMpgybFdBqiJlgT4vVOxktsaWVRIQ==; 31:VV27/tuDf4gEMkYjnxYawqSRj71sXUsi2ijuNhZ9uRr/q0c0Yt0fKTPp5xWWObwDbhjCsiyCQ1Ivr8sFexRb49EXk0mktRHlWu04hKkvyb8pWy6tWP6xtJ6HUiYYERzwUzoyt4GIR+lMC2+3GLwkrYsHqY+608wbC0cDAOOdlmlpJjCQqn3MN2YPb6ttvM1o80Mws+4tOsfIGpUgUzG1mTIWEOsXTGX1nu4qhND7zPE= X-MS-TrafficTypeDiagnostic: AM0PR08MB2980: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 20:qsa7Pa5jfG5vWGO9SmZniVmkNHU9bX2w9eRyKZPXL1pCXufR6iFfrUQE/0uUiu3ouCGB7+7G14N8MClvDL0BsXyw72Pt64Y/NMZB44sRGM9kEa6R6KjwwlYxjwIAEuPLl6aZi4X49qRHWcD0Iu2EpsnL/b9qpeMCAPXIbU6L0iPU0n93bNCs9Oc3O3VW7WgVmRy2S+DAFH+jNUvFdpK/lmbklyXnTHpR0SFJ0ZtvUnXTZr0BV4aw/COnX7s00SWA; 4:lNaH+PGlZxjeIG1equb7zkwVkFr31RO82cQuKE4ZP3TgzXi+Mlnbnq4/vG52peD3g9hFZgN7pAEgSd+PnCb5YgSK13U1iChlexaQ2c7krLk8XQhfgaeht4CKwa/NcuQDScj1txylHnEvbXq98wsVN0HlXmKLLJ3Xacao0APp5feq4K274NFh3610m59mYNjF7tMXxx1hwlztPMGclak7PrCkkofdTuSG7+KdJTjsCHtczR8wK8DFroX97jezJ+8gcIBfiAhtUQey9AwhqjhmiKfQ9+gDR8uQMBgveVp0WZmWhyIGZ6eKOqArc6pkQQfU X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(10201501046)(3002001)(93006095)(93001095)(3231232)(944501410)(52105095)(6055026)(6041310)(20161123564045)(20161123560045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:AM0PR08MB2980; BCL:0; PCL:0; RULEID:; SRVR:AM0PR08MB2980; X-Forefront-PRVS: 06530126A4 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6029001)(366004)(376002)(39860400002)(346002)(396003)(39380400002)(189003)(199004)(16586007)(2906002)(6666003)(6116002)(1076002)(68736007)(97736004)(305945005)(105586002)(4326008)(9686003)(7736002)(106356001)(72206003)(33716001)(33656002)(6636002)(3846002)(229853002)(16526019)(50466002)(478600001)(6306002)(86362001)(386003)(956004)(476003)(53936002)(6246003)(52116002)(316002)(55016002)(26005)(8936002)(6862004)(25786009)(33896004)(53376002)(81156014)(47776003)(81166006)(11346002)(966005)(486006)(23726003)(66066001)(446003)(6496006)(5660300001)(8676002)(44832011)(58126008)(76176011)(18370500001)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR08MB2980; H:e104320-lin; 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-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR08MB2980; 23:3NWBJ17ABT7u4KAx9UiTjiyzLsgLbmkF4bg/q3hjm?= =?us-ascii?Q?hJGyWixUdsOSUv2Q+fMAGbmbsbw/rbK2vePz8jCCV+0XY1HolaAIyc8sxYie?= =?us-ascii?Q?P0Bdi0mq/wDYlwR61nRSNept/6PJt+zAseEfX6zmIIBfrK6okhk6d9m+wEgu?= =?us-ascii?Q?2lzkhAToCqEhfbxXVFor5xo8iklstZhTQRnNlqxUyYs+4TMrKJwdYLKLMYQX?= =?us-ascii?Q?MkZuvqbhimfP43bswPmgym2GpME3IcyGDnU/zJoysWPRse6c5AsdC505R/J6?= =?us-ascii?Q?i0zLpol+1VpO9frzSVq+4FBLAmAqmi0REaIz5OEBc2vOjiWDqF5IYJCNAOEX?= =?us-ascii?Q?GFogQyYxtsd7ftY3dKp9Y3DArzFIPf+3Q5weuPAXbgHTBhCEqjFjYH7lFZSe?= =?us-ascii?Q?EF9bgVfsjefKdg5s07iNUQNZcho0g73HZwTSI8Vs6wFgjKRZZcVzp1secLUM?= =?us-ascii?Q?NPHT5sn/ZjFm6QqkYe22pX2RbJpisRfRzXLMVb7cy957hb9ty8YLJNLyIeyX?= =?us-ascii?Q?9MNWMITOkmW688lolGWzW8BAGwh0U5/0mQIiFXIJIR5Vj02M7J5yQDipO5Ov?= =?us-ascii?Q?UbY6yA+TtvXIwkQuolqSvuwe1KNS1tCvNGI4LSIoMgndI3tIHm2sRoFZd5kc?= =?us-ascii?Q?xX/qKmJ3bG1DNbu6vFxoEg3whs1qzhtBpxJmMKyh1CY0W7GZCtoplwFM8Zba?= =?us-ascii?Q?2qVH6i9qGuJsi0O1+65Jg39eVHveyehFSb+dzFXuRNJ/7adpt10WYZEm8/Xi?= =?us-ascii?Q?K0EuL676MbTggv8U+/7wG7UJLVeprCQEWSsMWbEoh5NdG0WhMr/5ppW3jq++?= =?us-ascii?Q?BkB0422Z1vUeuyZRz78F7LaJnIYSmClVMxD+HjBvxo7pM8KPvI0Tes80BWbB?= =?us-ascii?Q?eHHrfIqGHV5HD6C+OjtOLIG8RLUytWZLp0AVuRD48s/7e0BtWLYwlPSeRf3K?= =?us-ascii?Q?cZPs9CM2BoVdrqTuDXpdu/9KkRroUfG3r8jF3GLxLFfBK66RiJgEopD1oxJL?= =?us-ascii?Q?ytkY5gbQ/ZkMWGsfAnCPZxoTbNNL3P0fZBQAu3TZ3TKqxBxsuczB1c5Zwgj9?= =?us-ascii?Q?RuifxYv7XCQQW4h8gK7KfKYJLajsO6f0Z3IhwIog9jNnIRi2ZQ3Yas0Q9e2U?= =?us-ascii?Q?WN+744msz45XNhoTr3aj1Dc07pbJq2/mY3Eziv8AYTbK0+5pYQQuWEjpdDrM?= =?us-ascii?Q?r3usryu3HBjT/6Y8sDCl8ep2IGduI6APBvvDgYL4iqCcgeU6xGf8+uCyxnzs?= =?us-ascii?Q?3DL/lNaMz6+xawN16vZH+WLdmhVmGHQGxd9Mr/y+jPQSFRYcDGLKpVNSh7oV?= =?us-ascii?Q?b7SGejRUKUxP/osNA9AOc1ouYXrKQmgFtPDTyH+/O7jPke2m9mgakOwf9qhX?= =?us-ascii?Q?YbNKn9Mu6GVD9D9hCsDI33MQnc/rC5cPdKhmY7IYBJWiKevd7VoCDgQ2dySF?= =?us-ascii?Q?nmxq+RKyg=3D=3D?= X-Microsoft-Antispam-Message-Info: q3wR8KMp++w3qQJSAJ0vLfodqdhDNW6qROLA85ktmb/wh+BJtPaXdRwNUH2ljRdJCDM9lAkQ82q6ozW5JmA/5ByYiYKwZUMTfWO1z1vxlL6jTDfbaiGZrjX3SXDUUdvq87eMzs26RVfjK2/Tv3iwz85kT4+Ewqxf3NDNaNA3nuvPFQJJe0dLbYXc7Y7+FZvI X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 6:V13dHd3zO+EQaBA2T2nRVj8OFgTuKyYdOpZaBXfHZ5VB5XYZZWY7gPKu1hAe3x33ueIXceDNtBADvdFZBnyFmcS1rGPhMIS8uHN58aS/DK1r5TCbDi/8Pl8vypK/vcH59aJCNF7fMj/lYx/kNsaKiunoopgjiW8CYWJ1Jjy452DkKIbhc7h0Mlbn9jSWYypig1c07om8bA9yaUwrvu5a73vU6O4ZX6HiCQAiop4xnz/3wd8xVQqrQkWe59LZxsrWsW1FX7uCRo4Kk6W7jMLlLILSixD8jSDo9Lmh47JvkPoOFddIAVLPhWPDfOh26Mleful/n4DJhL9iKRhTwSuipLcgbZlRGY7juHU38UdF4qHkz8zsJ6hELqwASzvJG8U6Y+Ovs/aviZ+EPEu+Y6o7WJyxdxMWkxv8BQIAIQbHu3rtiXn46tlo4B4ztZp6cY6KceQ0iqTULT5F5IVr5mOaLA==; 5:I5+0VPwMi7ZcEhNYO2vWvlpiS+KDqzQeP8frdAO8VpVWm2AbJINJdjd87NlvV0QmAlugP/H3vGyHigFanQuCBQmsC9HvVUiB1n/Zo/JBu0ajpqm7xCp0ZLZMavboR0LRkt5bAg4qcWNPprkMpRD9V1TdV6zB2TGqesB0w4oVZYM=; 24:P4OySjBMPpZamZk0jBj/K+aBRonS6FBQQG4VRVCYh3gGgFp+sJB0B+vRJUSjS7aR8zWCYf81R2d+dTW2fFOJYhIXPPgG99FYiuxLe36vI2k= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM0PR08MB2980; 7:pz7iRawcog5HVLIDcjZ/smBKeD4RqNIPnSqQ70zWZIerQuFrPfs6M/+AHGaSBlHzWQPyGRRDqx2IcTrVVL7IAH4cKYRe2sc1E3qs4QFn0P9w3qzWwTk+C9X3kiTq1Q22qz4NzkVvUSPZ3bnEBGyvslqrjpEZ/NGkMTagl45C7sXJU5bBJ9d0wxyMZMGvk+9xvw8uoQsyzLDcF9fiWeKY98n3Dh7weS70TZQW5C5Owz7/aF76tVWmBvufClaCMYUY X-MS-Office365-Filtering-Correlation-Id: 8b743ec8-cd37-4306-5e21-08d5aabba386 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2018 14:48:41.5641 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8b743ec8-cd37-4306-5e21-08d5aabba386 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB2980 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 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Apr 2018 14:48:46 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 consume 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 maintainers. Acked-by: Achin Gupta > > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Achin Gupta > Signed-off-by: Supreeth Venkatesh > --- > 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.
> +Copyright (c) 2017, 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; > + > +/** > + 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 != 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; > +} > + > + > +/** > + > + > +**/ > +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; > +} > + > +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. > + 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)) == 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. > + 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 = 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. > + 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 >= (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. > + 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 >= (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. > + 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 = 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. > + 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 = 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. > + 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 = 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. > + 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)) == 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. > + 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 constructor. > +# Uses gHobList defined in the DXE Core Entry Point Library. > +# > +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
> +# Copyright (c) 2016 - 2017, 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 = CF56EF2C-68D8-4BD5-9A8B-8A7BFCFF751C > + MODULE_TYPE = MM_CORE_STANDALONE > + VERSION_STRING = 1.0 > + PI_SPECIFICATION_VERSION = 0x00010032 > + LIBRARY_CLASS = HobLib|MM_CORE_STANDALONE MM_STANDALONE > + > +# > +# VALID_ARCHITECTURES = AARCH64 > +# > + > +[Sources.AARCH64] > + Arm/HobLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + > + > +[LibraryClasses] > + BaseMemoryLib > + DebugLib > + > +[Guids] > + gEfiHobListGuid ## CONSUMES ## SystemTable > -- > 2.16.2 >