From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web10.499.1624402240025053822 for ; Tue, 22 Jun 2021 15:50:40 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@intel.onmicrosoft.com header.s=selector2-intel-onmicrosoft-com header.b=dzhimRkv; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: guo.dong@intel.com) IronPort-SDR: Hh36tCcpDoY6CITOi1mO36NWYgPmRsv27AkzBCKv3BuznSldgYhrMhlrCPQ9fcTaMNLZx+79WT 7dtM3Ddr9K3Q== X-IronPort-AV: E=McAfee;i="6200,9189,10023"; a="207197280" X-IronPort-AV: E=Sophos;i="5.83,292,1616482800"; d="scan'208";a="207197280" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2021 15:50:39 -0700 IronPort-SDR: OeaE3pG4AbCZtzOfhfwFIObHxDzambcwCJgYpnKk3WDyOt+GhB8AAonRNDraBchpkAjUbq3XhC oDDTVjx9EeDQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,292,1616482800"; d="scan'208";a="641796339" Received: from fmsmsx605.amr.corp.intel.com ([10.18.126.85]) by fmsmga005.fm.intel.com with ESMTP; 22 Jun 2021 15:50:39 -0700 Received: from fmsmsx609.amr.corp.intel.com (10.18.126.89) by fmsmsx605.amr.corp.intel.com (10.18.126.85) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Tue, 22 Jun 2021 15:50:39 -0700 Received: from fmsmsx605.amr.corp.intel.com (10.18.126.85) by fmsmsx609.amr.corp.intel.com (10.18.126.89) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4; Tue, 22 Jun 2021 15:50:38 -0700 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx605.amr.corp.intel.com (10.18.126.85) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.4 via Frontend Transport; Tue, 22 Jun 2021 15:50:38 -0700 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (104.47.56.46) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.4; Tue, 22 Jun 2021 15:50:38 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nvFpt7s59nqqMG+LMuH6ca3QagAtHtGdkgbFYyrzl2N+TUywOOYBi2q8RVsl69H3FE7OwBs8uVf0xJmJR1HMbmnNTODtXLUfOJ88D97LOU3iXak4rgfHwVScCp/QFXTM7UzwCbBD9KcdZXdXLQIn02Ab5fMQRS9d8UolJiTuEYPhYtf4gscnhYPJlCqccNS7yOkBWDgRvMrR8Dy5WfBBYJIfxfq6w62C/4XH30c48WBALbs5fbcdTigWaF0m+8oBZ3h2s7m+w1P/Phu0vb9FdLb6CnRbTOzvzG9ik/QjzHaVBEWop4tvg1WHQT4U/ZsVjuBQAO3mPdAMVe4bUcrLAw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=K+Xpd+MBER4tHIeaxV1ULV+XzEK1aba3lKKPKmKdUBQ=; b=HfGV5oLSVRRLGDL9xB4LlBIrdG+2P9aaJL+ti6NOgcoLgU5ZIUekuYR2VcdOimPRJkUMMtSLdMScf3yzagyab0yBdJ0C3qPEPO/syDQnYU/vThaW9GRFAX6iMB+kMP4nIUNDs2aeH/xXYybfeGQH1WlH8mh3FyiCzZ1VGPRwFGtW1WX5ajxCKH6nsX8XNQKld7U8maPYB9bBAwbAdz7vQOa/v8YmmLZvRiMSo+hubk2sVJhSjWSph4CP/2xSejqCN9tXv2EFIyJo3gTzGW3sfFiZhVW1IfWlF3vCPXbQ+mfl7/KCP59jbTbEpUhdUTmyYwUXvbhJA+nsFwWU/h1VGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=K+Xpd+MBER4tHIeaxV1ULV+XzEK1aba3lKKPKmKdUBQ=; b=dzhimRkvweYhRzp9MFZgKY8MheS34G6hBnDbsbKTWp7vFC+SnB7pmTnAyL6nsSCpuD83r7VVZKLK1HPgVszEbTufnMrf45toWTzIvzm5jAuSpvtwClXRJID5Pxsyi7vTWVW9pFrYeaeIzFiEOFOwbFk9yLg64dn85u0oUdvs1KY= Received: from BYAPR11MB3622.namprd11.prod.outlook.com (2603:10b6:a03:fe::30) by BYAPR11MB3445.namprd11.prod.outlook.com (2603:10b6:a03:77::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4242.23; Tue, 22 Jun 2021 22:50:34 +0000 Received: from BYAPR11MB3622.namprd11.prod.outlook.com ([fe80::247b:262c:b8da:710b]) by BYAPR11MB3622.namprd11.prod.outlook.com ([fe80::247b:262c:b8da:710b%7]) with mapi id 15.20.4242.023; Tue, 22 Jun 2021 22:50:33 +0000 From: "Guo Dong" To: "Liu, Zhiguang" , "devel@edk2.groups.io" CC: "Ma, Maurice" , "You, Benjamin" Subject: Re: [PATCH 05/12] UefiPayloadPkg: Create separate Payload Entry for UniversalPayload Thread-Topic: [PATCH 05/12] UefiPayloadPkg: Create separate Payload Entry for UniversalPayload Thread-Index: AQHXZeuTrW9sAPj3vEyZve4sEKmu1qsgpiUg Date: Tue, 22 Jun 2021 22:50:33 +0000 Message-ID: References: <20210620154702.2681-1-zhiguang.liu@intel.com> <20210620154702.2681-6-zhiguang.liu@intel.com> In-Reply-To: <20210620154702.2681-6-zhiguang.liu@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-reaction: no-action dlp-version: 11.5.1.3 authentication-results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=intel.com; x-originating-ip: [68.104.146.79] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: b334821a-793a-468f-36cc-08d935d02500 x-ms-traffictypediagnostic: BYAPR11MB3445: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:5236; x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: u30tFzQMzlN4k1wfbCo2gcwVKrsXNY/O7NPmfWh3qBuZYkfejjqRwmcW2mFHqYfMBoqVpxgtd6RWXWnKsuWipRRgRs1tdRycKi/xEeONPA77kwadYjDfxMkAstL+e0N2iaTHya8Pximh2T0Iiluqjr3696vIUOAZPlkBamrEkQM0z/vZHcbPDPRNIxhvSoRb1LFaebxfZBIVVXqbv1ekOciVUsLLeJa1CG+WOsYFyJAo7lu4/LeS95e8Gpt0q2LcSrv71FiF37e1yVVhu8WeCB0IaiZMIfiZW9GAwWhRwHA3Yag3GaCVwwvLGiKUdlZA7OykMREN/FIZQAKK4Hhy0EZjmE/wKZJweYVOp7CruP9BMHOwbZWcnFpt1lfzPivQIftjeVpu0Wr5t1OvaopJEi4UedZgqXRu2xrhEdPGA+/VYqXCvCyMJGFnP6id4kVqZcvD8OVX9RGLNMcUn2qEW3d7m6L7N59y+IM4K90XU+yBCnnlyWq9vaOJORSlEtrDKy5WI865N3zj75Ftv7rsK/SrQZp/na6Ml8McpW8YTT+pLwVocaSy84dhY4HQez6FOPu6jlQHzYFYxdyyE4MEiluyut2U6b04wbLDmtIijeQ= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BYAPR11MB3622.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(366004)(396003)(136003)(39860400002)(376002)(346002)(26005)(186003)(107886003)(66946007)(2906002)(30864003)(76116006)(9686003)(53546011)(71200400001)(4326008)(19627235002)(86362001)(478600001)(33656002)(66476007)(6506007)(7696005)(122000001)(38100700002)(64756008)(66556008)(52536014)(55016002)(66446008)(83380400001)(8936002)(110136005)(54906003)(8676002)(316002)(5660300002);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?jHMkktpnHpS8s1pw8kUYIk89EL2k6oao5bnvi+TonfBOwc0Tbxmy0S0WMeBt?= =?us-ascii?Q?3I7F9opwgtcB+URYfT1YKC9+A5Wa80II/dw/9CDoebjS7e/YW1oJ1XC+45nF?= =?us-ascii?Q?P3dNAd4H7k8A2cez+J8w9MrhR7kp2LCfW7vXGmIiaFsr61tJMyqYbRT1ylzk?= =?us-ascii?Q?tF26rIqSy+RMTbvwtiEqKA1+/UKekMKXmPWM/SzlH0eVuw+dqRhK/F4+pOlS?= =?us-ascii?Q?KoUZsUvrpXoAivad2L5yRFyG20Cos4HpnakbssT96mbKmm0r5yyMHDvEWagw?= =?us-ascii?Q?dCxN4H+2AF+fJzpBH370mPsv/2kDr5OVqvEGd0qkr55qTCAG3bKiRBrcTAU2?= =?us-ascii?Q?CPxe2v3uU5CotyMQRD02BMbWGOkgPMIL1iaYr4QDQu0zV+/4rKuz8QSetjgu?= =?us-ascii?Q?JetEIuii6Mrd+DN448QAP9VUq7/uRYB3EjQfcALaWCnbleWJKc6lVIqSKogn?= =?us-ascii?Q?uoByglGfv+OzkVHew+MFpoDURFk3n8uB5Ced4KCrLirvUJxLkMPB0Mu/IRXt?= =?us-ascii?Q?qmXY4fqCtHZrkFGv2mE/sZNimytd3qQ7rNZc0x5anVocba4+p7mZY757+++X?= =?us-ascii?Q?GUoyV91ajXc2fNI21No20OIYIzVEnMmusGQRNMQlyhF6JfzHD5iK22C2pR23?= =?us-ascii?Q?ekFZdDoqim5313jDpkDKjROesELoP/41MNjOw20I6rUFYddn50eJevit+QKw?= =?us-ascii?Q?XNe+BDIfT+y0yWMFA3/eFOaCsuFj6buJ1Whv8HTQBv6zo1OmDTBadvtg2t6T?= =?us-ascii?Q?R6Ti8LiXUsiOfyySkw4s5vS8AbJ0h4jf5LAB+e7iLHLdIlljQqZc3l8ghzd9?= =?us-ascii?Q?pEHo+BrOAN+YtKkt5a4UFhBOz3dzJ6Fy9V31YSVwdG8kL2XzZZrakunlcIj9?= =?us-ascii?Q?Pqy63RHTQRF2BX/nhbKdNmC+4NHsfl6m6TNQvOWc3NZJCJtxj0/8596Dd/RI?= =?us-ascii?Q?S1DVQlQNzkkRbTtn9wuhAOgshpDS87e0a4uClf8FsumtrywZ6+Ocgt/NAT5N?= =?us-ascii?Q?hitpqBKeDSkOQNq3bb3HlwL2Kq/C22hdSdGNwsY5yLQZN0bExz+96TcjbMt7?= =?us-ascii?Q?qHyHSVIYAIrqAnhXiXgSImE9tFGbm2izT1VLx00E4NJAzP8XRcNA6n4XfHZj?= =?us-ascii?Q?A6Dt/HN4MwtYDT6073yoJlOoxg7EJqThDxLdeeynpkijuiTUwWj00svdGUj9?= =?us-ascii?Q?eiYF0QZY5EiYtUI8lxZsHrLlVp8bh93bGZUYooc8bgPIiItXo9ZLyNmF+N5y?= =?us-ascii?Q?SSsW01ng3VmMHxIovB7E/OgOa78ghCSEkol5idN3mnERqufL7MptcFRw3ikN?= =?us-ascii?Q?/elxc2yMSORDUqvqdzCLnNIj?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BYAPR11MB3622.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: b334821a-793a-468f-36cc-08d935d02500 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Jun 2021 22:50:33.8617 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: LrLXxb0bJ4v46xEyf917ZcttGgiYgk8Ve56hTcb526T6CnmNJKarIJk3JzBqB9e32PZqlrqD+Ekp0xZk6w/x8Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR11MB3445 Return-Path: guo.dong@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Guo Dong > -----Original Message----- > From: Liu, Zhiguang > Sent: Sunday, June 20, 2021 8:47 AM > To: devel@edk2.groups.io > Cc: Ma, Maurice ; Dong, Guo > ; You, Benjamin > Subject: [PATCH 05/12] UefiPayloadPkg: Create separate Payload Entry for > UniversalPayload >=20 > This patch create the UniversalPayload Entry based on the UefiPayload > Entry. It implements the logic to find a proper memory range to create th= e > new Hob and migrate the Hobs from Bootloader. > To make the change history clear, the logic to get the DxeCore will be in > the next patch. >=20 > Cc: Maurice Ma > Cc: Guo Dong > Cc: Benjamin You > Signed-off-by: Zhiguang Liu > --- > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 311 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 91 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++ > 2 files changed, 402 insertions(+) >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > new file mode 100644 > index 0000000000..66e87bcb9b > --- /dev/null > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > @@ -0,0 +1,311 @@ > +/** @file >=20 > + >=20 > + Copyright (c) 2021, Intel Corporation. All rights reserved.
>=20 > + SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > + >=20 > +**/ >=20 > + >=20 > +#include "UefiPayloadEntry.h" >=20 > + >=20 > +#define MEMORY_ATTRIBUTE_MASK > (EFI_RESOURCE_ATTRIBUTE_PRESENT | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_INITIALIZE= D | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_TESTED = | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_READ_PROTE= CTED | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_WRITE_PROT= ECTED | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_EXECUTION_= PROTECTED | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_READ_ONLY_= PROTECTED | > \ >=20 > + EFI_RESOURCE_ATTRIBUTE_16_BIT_IO = | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_32_BIT_IO = | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_64_BIT_IO = | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_PERSISTENT= ) >=20 > + >=20 > +#define TESTED_MEMORY_ATTRIBUTES > (EFI_RESOURCE_ATTRIBUTE_PRESENT | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_INITIALIZE= D | \ >=20 > + EFI_RESOURCE_ATTRIBUTE_TESTED = ) >=20 > + >=20 > +extern VOID *mHobList; >=20 > + >=20 > +/** >=20 > + Add HOB into HOB list >=20 > + >=20 > + @param[in] Hob The HOB to be added into the HOB list. >=20 > +**/ >=20 > +VOID >=20 > +AddNewHob ( >=20 > + IN EFI_PEI_HOB_POINTERS *Hob >=20 > + ) >=20 > +{ >=20 > + EFI_PEI_HOB_POINTERS NewHob; >=20 > + >=20 > + if (Hob->Raw =3D=3D NULL) { >=20 > + return; >=20 > + } >=20 > + NewHob.Header =3D CreateHob (Hob->Header->HobType, Hob->Header- > >HobLength); >=20 > + >=20 > + if (NewHob.Header !=3D NULL) { >=20 > + CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header- > >HobLength - sizeof (EFI_HOB_GENERIC_HEADER)); >=20 > + } >=20 > +} >=20 > + >=20 > +/** >=20 > + Found the Resource Descriptor HOB that contains a range >=20 > + >=20 > + @param[in] Base Memory start address >=20 > + @param[in] Top Memory Top. >=20 > + >=20 > + @return The pointer to the Resource Descriptor HOB. >=20 > +**/ >=20 > +EFI_HOB_RESOURCE_DESCRIPTOR * >=20 > +FindResourceDescriptorByRange ( >=20 > + VOID *HobList, >=20 > + EFI_PHYSICAL_ADDRESS Base, >=20 > + EFI_PHYSICAL_ADDRESS Top >=20 > + ) >=20 > +{ >=20 > + EFI_PEI_HOB_POINTERS Hob; >=20 > + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; >=20 > + >=20 > + for (Hob.Raw =3D (UINT8 *) HobList; !END_OF_HOB_LIST(Hob); Hob.Raw =3D > GET_NEXT_HOB(Hob)) { >=20 > + // >=20 > + // Skip all HOBs except Resource Descriptor HOBs >=20 > + // >=20 > + if (GET_HOB_TYPE (Hob) !=3D EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { >=20 > + continue; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip Resource Descriptor HOBs that do not describe tested system > memory >=20 > + // >=20 > + ResourceHob =3D Hob.ResourceDescriptor; >=20 > + if (ResourceHob->ResourceType !=3D EFI_RESOURCE_SYSTEM_MEMORY) { >=20 > + continue; >=20 > + } >=20 > + if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=3D > TESTED_MEMORY_ATTRIBUTES) { >=20 > + continue; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip Resource Descriptor HOBs that do not contain the PHIT range > EfiFreeMemoryBottom..EfiFreeMemoryTop >=20 > + // >=20 > + if (Base < ResourceHob->PhysicalStart) { >=20 > + continue; >=20 > + } >=20 > + if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)= ) > { >=20 > + continue; >=20 > + } >=20 > + return ResourceHob; >=20 > + } >=20 > + return NULL; >=20 > +} >=20 > + >=20 > +/** >=20 > + Find the highest below 4G memory resource descriptor, except the input > Resource Descriptor. >=20 > + >=20 > + @param[in] HobList Hob start address >=20 > + @param[in] MinimalNeededSize Minimal needed size. >=20 > + @param[in] ExceptResourceHob Ignore this Resource Descriptor. >=20 > + >=20 > + @return The pointer to the Resource Descriptor HOB. >=20 > +**/ >=20 > +EFI_HOB_RESOURCE_DESCRIPTOR * >=20 > +FindAnotherHighestBelow4GResourceDescriptor ( >=20 > + IN VOID *HobList, >=20 > + IN UINTN MinimalNeededSize, >=20 > + IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob >=20 > + ) >=20 > +{ >=20 > + EFI_PEI_HOB_POINTERS Hob; >=20 > + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; >=20 > + EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob; >=20 > + ReturnResourceHob =3D NULL; >=20 > + >=20 > + for (Hob.Raw =3D (UINT8 *) HobList; !END_OF_HOB_LIST(Hob); Hob.Raw =3D > GET_NEXT_HOB(Hob)) { >=20 > + // >=20 > + // Skip all HOBs except Resource Descriptor HOBs >=20 > + // >=20 > + if (GET_HOB_TYPE (Hob) !=3D EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) { >=20 > + continue; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip Resource Descriptor HOBs that do not describe tested system > memory >=20 > + // >=20 > + ResourceHob =3D Hob.ResourceDescriptor; >=20 > + if (ResourceHob->ResourceType !=3D EFI_RESOURCE_SYSTEM_MEMORY) { >=20 > + continue; >=20 > + } >=20 > + if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=3D > TESTED_MEMORY_ATTRIBUTES) { >=20 > + continue; >=20 > + } >=20 > + >=20 > + // >=20 > + // Skip if the Resource Descriptor HOB equals to ExceptResourceHob >=20 > + // >=20 > + if (ResourceHob =3D=3D ExceptResourceHob) { >=20 > + continue; >=20 > + } >=20 > + // >=20 > + // Skip Resource Descriptor HOBs that are beyond 4G >=20 > + // >=20 > + if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > > BASE_4GB) { >=20 > + continue; >=20 > + } >=20 > + // >=20 > + // Skip Resource Descriptor HOBs that are too small >=20 > + // >=20 > + if (ResourceHob->ResourceLength < MinimalNeededSize) { >=20 > + continue; >=20 > + } >=20 > + >=20 > + // >=20 > + // Return the topest Resource Descriptor >=20 > + // >=20 > + if (ReturnResourceHob =3D=3D NULL) { >=20 > + ReturnResourceHob =3D ResourceHob; >=20 > + } else { >=20 > + if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart)= { >=20 > + ReturnResourceHob =3D ResourceHob; >=20 > + } >=20 > + } >=20 > + } >=20 > + return ReturnResourceHob; >=20 > +} >=20 > + >=20 > +/** >=20 > + It will build HOBs based on information from bootloaders. >=20 > + >=20 > + @retval EFI_SUCCESS If it completed successfully. >=20 > + @retval Others If it failed to build required HOBs. >=20 > +**/ >=20 > +EFI_STATUS >=20 > +BuildHobs ( >=20 > + IN UINTN BootloaderParameter >=20 > + ) >=20 > +{ >=20 > + EFI_PEI_HOB_POINTERS Hob; >=20 > + UINTN MinimalNeededSize; >=20 > + EFI_PHYSICAL_ADDRESS FreeMemoryBottom; >=20 > + EFI_PHYSICAL_ADDRESS FreeMemoryTop; >=20 > + EFI_PHYSICAL_ADDRESS MemoryBottom; >=20 > + EFI_PHYSICAL_ADDRESS MemoryTop; >=20 > + EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob; >=20 > + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; >=20 > + >=20 > + Hob.Raw =3D (UINT8 *) BootloaderParameter; >=20 > + MinimalNeededSize =3D FixedPcdGet32 (PcdSystemMemoryUefiRegionSize); >=20 > + >=20 > + ASSERT (Hob.Raw !=3D NULL); >=20 > + ASSERT ((UINTN) Hob.HandoffInformationTable->EfiFreeMemoryTop =3D=3D > Hob.HandoffInformationTable->EfiFreeMemoryTop); >=20 > + ASSERT ((UINTN) Hob.HandoffInformationTable->EfiMemoryTop =3D=3D > Hob.HandoffInformationTable->EfiMemoryTop); >=20 > + ASSERT ((UINTN) Hob.HandoffInformationTable->EfiFreeMemoryBottom > =3D=3D Hob.HandoffInformationTable->EfiFreeMemoryBottom); >=20 > + ASSERT ((UINTN) Hob.HandoffInformationTable->EfiMemoryBottom =3D=3D > Hob.HandoffInformationTable->EfiMemoryBottom); >=20 > + >=20 > + >=20 > + // >=20 > + // Try to find Resource Descriptor HOB that contains Hob range > EfiMemoryBottom..EfiMemoryTop >=20 > + // >=20 > + PhitResourceHob =3D FindResourceDescriptorByRange(Hob.Raw, > Hob.HandoffInformationTable->EfiMemoryBottom, > Hob.HandoffInformationTable->EfiMemoryTop); >=20 > + if (PhitResourceHob =3D=3D NULL) { >=20 > + // >=20 > + // Boot loader's Phit Hob is not in an available Resource Descriptor= , find > another Resource Descriptor for new Phit Hob >=20 > + // >=20 > + ResourceHob =3D > FindAnotherHighestBelow4GResourceDescriptor(Hob.Raw, > MinimalNeededSize, NULL); >=20 > + if (ResourceHob =3D=3D NULL) { >=20 > + return EFI_NOT_FOUND; >=20 > + } >=20 > + >=20 > + MemoryBottom =3D ResourceHob->PhysicalStart + ResourceHob- > >ResourceLength - MinimalNeededSize; >=20 > + FreeMemoryBottom =3D MemoryBottom; >=20 > + FreeMemoryTop =3D ResourceHob->PhysicalStart + ResourceHob- > >ResourceLength; >=20 > + MemoryTop =3D FreeMemoryTop; >=20 > + } else if (PhitResourceHob->PhysicalStart + PhitResourceHob- > >ResourceLength - Hob.HandoffInformationTable->EfiMemoryTop >=3D > MinimalNeededSize) { >=20 > + // >=20 > + // New availiable Memory range in new hob is right above memory top = in > old hob. >=20 > + // >=20 > + MemoryBottom =3D Hob.HandoffInformationTable->EfiFreeMemoryTop; >=20 > + FreeMemoryBottom =3D Hob.HandoffInformationTable->EfiMemoryTop; >=20 > + FreeMemoryTop =3D FreeMemoryBottom + MinimalNeededSize; >=20 > + MemoryTop =3D FreeMemoryTop; >=20 > + } else if (Hob.HandoffInformationTable->EfiMemoryBottom - > PhitResourceHob->PhysicalStart >=3D MinimalNeededSize) { >=20 > + // >=20 > + // New availiable Memory range in new hob is right below memory > bottom in old hob. >=20 > + // >=20 > + MemoryBottom =3D Hob.HandoffInformationTable->EfiMemoryBottom - > MinimalNeededSize; >=20 > + FreeMemoryBottom =3D MemoryBottom; >=20 > + FreeMemoryTop =3D Hob.HandoffInformationTable->EfiMemoryBottom; >=20 > + MemoryTop =3D Hob.HandoffInformationTable->EfiMemoryTop; >=20 > + } else { >=20 > + // >=20 > + // In the Resource Descriptor HOB contains boot loader Hob, there is= no > enough free memory size for payload hob >=20 > + // Find another Resource Descriptor Hob >=20 > + // >=20 > + ResourceHob =3D > FindAnotherHighestBelow4GResourceDescriptor(Hob.Raw, > MinimalNeededSize, PhitResourceHob); >=20 > + if (ResourceHob =3D=3D NULL) { >=20 > + return EFI_NOT_FOUND; >=20 > + } >=20 > + >=20 > + MemoryBottom =3D ResourceHob->PhysicalStart + ResourceHob- > >ResourceLength - MinimalNeededSize; >=20 > + FreeMemoryBottom =3D MemoryBottom; >=20 > + FreeMemoryTop =3D ResourceHob->PhysicalStart + ResourceHob- > >ResourceLength; >=20 > + MemoryTop =3D FreeMemoryTop; >=20 > + } >=20 > + HobConstructor ((VOID *) (UINTN) MemoryBottom, (VOID *) (UINTN) > MemoryTop, (VOID *) (UINTN) FreeMemoryBottom, (VOID *) (UINTN) > FreeMemoryTop); >=20 > + // >=20 > + // From now on, mHobList will point to the new Hob range. >=20 > + // >=20 > + >=20 > + // >=20 > + // Since payload created new Hob, move all hobs except PHIT from boot > loader hob list. >=20 > + // >=20 > + while (!END_OF_HOB_LIST (Hob)) { >=20 > + if (Hob.Header->HobType !=3D EFI_HOB_TYPE_HANDOFF) { >=20 > + // Add this hob to payload HOB >=20 > + AddNewHob (&Hob); >=20 > + } >=20 > + Hob.Raw =3D GET_NEXT_HOB (Hob); >=20 > + } >=20 > + >=20 > + return EFI_SUCCESS; >=20 > +} >=20 > + >=20 > +/** >=20 > + Entry point to the C language phase of UEFI payload. >=20 > + >=20 > + @retval It will not return if SUCCESS, and return error when pass= ing > bootloader parameter. >=20 > +**/ >=20 > +EFI_STATUS >=20 > +EFIAPI >=20 > +_ModuleEntryPoint ( >=20 > + IN UINTN BootloaderParameter >=20 > + ) >=20 > +{ >=20 > + EFI_STATUS Status; >=20 > + EFI_HOB_HANDOFF_INFO_TABLE *HandoffHobTable; >=20 > + EFI_PEI_HOB_POINTERS Hob; >=20 > + >=20 > + mHobList =3D (VOID *) BootloaderParameter; >=20 > + // Call constructor for all libraries >=20 > + ProcessLibraryConstructorList (); >=20 > + >=20 > + DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n")); >=20 > + DEBUG ((DEBUG_INFO, "sizeof(UINTN) =3D 0x%x\n", sizeof(UINTN))); >=20 > + >=20 > + // Initialize floating point operating environment to be compliant wit= h UEFI > spec. >=20 > + InitializeFloatingPointUnits (); >=20 > + >=20 > + // Build HOB based on information from Bootloader >=20 > + Status =3D BuildHobs (BootloaderParameter); >=20 > + >=20 > + // >=20 > + // Mask off all legacy 8259 interrupt sources >=20 > + // >=20 > + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF); >=20 > + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF); >=20 > + >=20 > + HandoffHobTable =3D (EFI_HOB_HANDOFF_INFO_TABLE *) > GetFirstHob(EFI_HOB_TYPE_HANDOFF); >=20 > + Hob.HandoffInformationTable =3D HandoffHobTable; >=20 > + >=20 > + // Should not get here >=20 > + CpuDeadLoop (); >=20 > + return EFI_SUCCESS; >=20 > +} >=20 > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > new file mode 100644 > index 0000000000..58ff87d969 > --- /dev/null > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > @@ -0,0 +1,91 @@ > +## @file >=20 > +# This is the first module for UEFI payload. >=20 > +# >=20 > +# Copyright (c) 2021, Intel Corporation. All rights reserved.
>=20 > +# >=20 > +# SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > +# >=20 > +## >=20 > + >=20 > +[Defines] >=20 > + INF_VERSION =3D 0x00010005 >=20 > + BASE_NAME =3D UniversalPayloadEntry >=20 > + FILE_GUID =3D D4F0F269-1209-4A66-8039-C4D5A700EA4= E >=20 > + MODULE_TYPE =3D SEC >=20 > + VERSION_STRING =3D 1.0 >=20 > + >=20 > +# >=20 > +# The following information is for reference only and not required by th= e > build tools. >=20 > +# >=20 > +# VALID_ARCHITECTURES =3D IA32 X64 >=20 > +# >=20 > + >=20 > +[Sources] >=20 > + UniversalPayloadEntry.c >=20 > + LoadDxeCore.c >=20 > + MemoryAllocation.c >=20 > + >=20 > +[Sources.Ia32] >=20 > + X64/VirtualMemory.h >=20 > + X64/VirtualMemory.c >=20 > + Ia32/DxeLoadFunc.c >=20 > + Ia32/IdtVectorAsm.nasm >=20 > + >=20 > +[Sources.X64] >=20 > + X64/VirtualMemory.h >=20 > + X64/VirtualMemory.c >=20 > + X64/DxeLoadFunc.c >=20 > + >=20 > +[Packages] >=20 > + MdePkg/MdePkg.dec >=20 > + MdeModulePkg/MdeModulePkg.dec >=20 > + UefiCpuPkg/UefiCpuPkg.dec >=20 > + UefiPayloadPkg/UefiPayloadPkg.dec >=20 > + >=20 > +[LibraryClasses] >=20 > + BaseMemoryLib >=20 > + DebugLib >=20 > + BaseLib >=20 > + SerialPortLib >=20 > + IoLib >=20 > + HobLib >=20 > + PeCoffLib >=20 > + UefiCpuLib >=20 > + >=20 > +[Guids] >=20 > + gEfiMemoryTypeInformationGuid >=20 > + gEfiFirmwareFileSystem2Guid >=20 > + gUefiSystemTableInfoGuid >=20 > + gEfiGraphicsInfoHobGuid >=20 > + gEfiGraphicsDeviceInfoHobGuid >=20 > + gUefiAcpiBoardInfoGuid >=20 > + gEfiSmbiosTableGuid >=20 > + gEfiAcpiTableGuid >=20 > + gUefiSerialPortInfoGuid >=20 > + >=20 > +[FeaturePcd.IA32] >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## > CONSUMES >=20 > + >=20 > +[FeaturePcd.X64] >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## > CONSUMES >=20 > + >=20 > + >=20 > +[Pcd.IA32,Pcd.X64] >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable = ## > SOMETIMES_CONSUMES >=20 > + > gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM > ask ## CONSUMES >=20 > + > gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask > ## CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask > ## CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard = ## > CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdUse5LevelPageTable = ## > SOMETIMES_CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase = ## > CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize = ## > CONSUMES >=20 > + >=20 > + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase >=20 > + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize >=20 > + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadStackTop >=20 > + gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize >=20 > + >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## > SOMETIMES_CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy > ## SOMETIMES_CONSUMES >=20 > + gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## > SOMETIMES_CONSUMES >=20 > + >=20 > -- > 2.16.2.windows.1