From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web09.1605.1659591463261134341 for ; Wed, 03 Aug 2022 22:37:43 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=AAQN09TY; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: ray.ni@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659591463; x=1691127463; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=ZMbDcplZJ8RUid9ZuyroDHECL0NrB1l3YliMT8Mt/xU=; b=AAQN09TYWSZPbPD7Kqn56efAg8Cn6oQjZN5MaHiYXEVoPYG/YSPUyBYQ VY1rJyBTw6z1ik64PsFrbJyqUC6+9Z578hTP2IecvETpzFUFVy3PJ7ItB 8FOGByaMkA+8FJDByH+nLrfH2BPIyIHGLBIdYbLXqNVx1TI+me/E8c318 9L08tnkfwitM0v9XvOeMKIazuOAMZQn2PgT1oj0RVdl5Kis0Hxatiee02 nyvzFF9XrU2hv4NXcvGvpiGV7GNh9syt7Ax3jOvY9COyzJV+xItqSTqRU kLEec5EDb9UY85yokospN50Ej0Ux7P7P8p42fCE1XEXl3fXsbkY+2uJdg Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10428"; a="315716453" X-IronPort-AV: E=Sophos;i="5.93,214,1654585200"; d="scan'208";a="315716453" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2022 22:37:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,214,1654585200"; d="scan'208";a="745331219" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by fmsmga001.fm.intel.com with ESMTP; 03 Aug 2022 22:37:27 -0700 Received: from orsmsx611.amr.corp.intel.com (10.22.229.24) by ORSMSX601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Wed, 3 Aug 2022 22:37:27 -0700 Received: from orsmsx607.amr.corp.intel.com (10.22.229.20) by ORSMSX611.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28; Wed, 3 Aug 2022 22:37:26 -0700 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx607.amr.corp.intel.com (10.22.229.20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.28 via Frontend Transport; Wed, 3 Aug 2022 22:37:26 -0700 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.48) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2375.28; Wed, 3 Aug 2022 22:37:26 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FBmfQQSglbOj3sTrE4KlLcrbJqdzWEq4QurObkIURtDGrHPYMRcIfOUueJllJR7lIXLZ1lcjOTxfB97w0kECWM3kPYCuX8OyA+dvvMYVet4s5kd0VvR1i0zk3qJILurm0UJvnFEMH339NBWF8GJNkW+DfS3UkLxm0o+3Hc1b7r1Sa2AaWoOZag7jAFhafL70ikUlz+BMnfNvDoAmSAsvuAYuJSRpND0WUHUZLA44pYpR9fX63veerxH/A0l9gL2o7fx0ca62U5YD0C8Eh6j34GXT1lfghP0EACuz9noi2ko7UcxD8+/FRyevB7WgSHURbJyPSs7fEwilu5n6rpQOsA== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c0ZyqR06B07txatiAcT7/lyB0jU2kk+mVQpKD1MeICg=; b=DydhI4mFCh5h55FyKXdtI31TszSWwuwVr4nsdwHV7E50VxGRu1dBkSfpu9ateoaYl8Eq/Pa0Pioz+m/leviKaOQjS1LgdNQ0ynikmSo3whE2YwKLqhBDGY+Wx+vrqCqhIa6Jy5OGLDXWenJvF/42jv7YdV1QlNS6m5AyrvIj+vztx9m262Rnp3tOmLw5Mn3J01zmsu6nx5FFqqiOfwNlHf7X9h5X3k/ePGkPBVuFbkhox/Z9jSPHHQuJiImKfQlNnZJ7OYw/GqsaAkXNigbnp1dTVh9rsGrX6w6xzLq+OWFXy9+LFSRkxm34bTg0Gj1/7Aiz86Wkuy46anQQIEy0ZA== 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 Received: from MWHPR11MB1631.namprd11.prod.outlook.com (2603:10b6:301:10::10) by SJ0PR11MB4894.namprd11.prod.outlook.com (2603:10b6:a03:2d4::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5482.11; Thu, 4 Aug 2022 05:37:19 +0000 Received: from MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::991b:97a0:7836:5174]) by MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::991b:97a0:7836:5174%10]) with mapi id 15.20.5482.013; Thu, 4 Aug 2022 05:37:19 +0000 From: "Ni, Ray" To: "Liu, Zhiguang" , "devel@edk2.groups.io" CC: "Dong, Eric" , "Kumar, Rahul R" , Leif Lindholm , "Bi, Dandan" , "Gao, Liming" , "Wang, Jian J" , Ard Biesheuvel , Sami Mujawar Subject: Re: [PATCH 1/2] UefiCpuPkg: Simplify InitializeSeparateExceptionStacks Thread-Topic: [PATCH 1/2] UefiCpuPkg: Simplify InitializeSeparateExceptionStacks Thread-Index: AQHYnaDFjJGAPVeGCU+YP4jKgTU7762eRw5g Date: Thu, 4 Aug 2022 05:37:19 +0000 Message-ID: References: <20220722075737.897-1-zhiguang.liu@intel.com> <20220722075737.897-2-zhiguang.liu@intel.com> In-Reply-To: <20220722075737.897-2-zhiguang.liu@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: d0a23f2a-2397-4a97-c7d3-08da75db65c0 x-ms-traffictypediagnostic: SJ0PR11MB4894:EE_ x-ld-processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: kTyaEQX/r7TmHM9wpa/JOMkzTChu1w4iytJbpV4jSeyvrDmke3kZ51sqb7aARBQtnPZHEuFXXTfBQamWh0FcpEWsRSBTG6Z360A7rHRmC5Xxu+27vkQ+LOSVKnInw9FCNavEpiH5iIV3qMny/RkJBFlfadMzJZrtSSAMG1zkTRpXzYY9p2l2isd7umfLglBwiWeDdwHVJ2TJwhlRS3kA1ec97/Yg0lBMju3gbLp5XrH43J31c8eS2wa+RdxzxOGcO1TuTA0EOTw6PN1IjIDqK8ny6V6z1BDDqvgAEgXgKLQqxYDna/wh4CYx20BgYR+nLtf5ulWEsGFhLIN6JPZqf1zfFSPt/dsP5VKYlP+yKcQmuLmizL+W0STQocWpdZ3iW79Fi2pw12iKnvurwdekLjuhiC3AFttKYE9NIDmmmOZPWHR35SL7lfkTR0Xkq4rJ40g0/uzcNJ5CPEUxB4//OHdZTP6AO57tArjn6Q51fp/sDKjPoX6pVovZ35HGLotNflTCAYGJOLg0XmoTYOfiLxuex7vQZnLTDvcr/VcydDLiC6B28j/H+mf8FmySwsUKw8Bkck1NHFRPabW2AMAy0++60249ogcrWfJeKdvUmulxLR9ZtBhu+gc00s4BaGSInG9Gh7zYw0EBQnLQE6AZJGwcExz1bmu0K19+mDkq8QFv8fBEKTd4H+LZffXqyJAkE4qT5E+cdoYcTeZ0qI9D/9AgiZmyWaDv41PUT8+sSkXrc/p3RDXLaYEXS2TC2hSIWuDkyFXdmLJm1GQr1mHouoUFJn2LWXgZJe/kHMHYOnnfk7Ml2PdYYNOm29dLglFl x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MWHPR11MB1631.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230016)(396003)(39860400002)(366004)(136003)(346002)(376002)(8936002)(2906002)(30864003)(186003)(83380400001)(66476007)(5660300002)(4326008)(8676002)(64756008)(52536014)(66946007)(66556008)(66446008)(9686003)(71200400001)(55016003)(110136005)(478600001)(41300700001)(7696005)(53546011)(6506007)(76116006)(54906003)(26005)(19627235002)(316002)(33656002)(86362001)(38100700002)(82960400001)(38070700005)(122000001)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?3YtR3ZUmJIJBJ91Fo8q7vJjbopHzY6Tc2CCWDA67rlZ0ZVjhxRudVg5843Cj?= =?us-ascii?Q?XBmiKyuXCCvPiB/gx4gg76uieHJB/mbHYD7iMXQgTkIE2LG2Mk/83GAXTipS?= =?us-ascii?Q?JFCepdDvMFhkPMCKvc1k4yUjoiBOWQ3QvUgi2EwNhAmh3d8Q85jVIgSNfApq?= =?us-ascii?Q?HNFAVb0xKVB82713wFxb5BNHMAELkHjNWGD0ypp0SITVOFG7BmJX/4aC/8aF?= =?us-ascii?Q?uV8HZyJ8drFWpICttbWaWP+HZcttIFmkWcj57ni+DCQjm48YXXA8B93ItVi0?= =?us-ascii?Q?2EcIGInyp1F2j/vIAm1SfTwFMPy2LqHvhBjdJ5QdCeoFwPGy7W+DSNpGn5k4?= =?us-ascii?Q?wpHhJey7ugIGo5p74Pl/8qau9oQXt3ii9sEKBIJ5vwA5kM2eo68zXZzrrv24?= =?us-ascii?Q?moonG4XbrAN66H947Uvi7p/Uvw8ee/0AM14nFPsJyb8BRZi2e8Dste1DfQxr?= =?us-ascii?Q?k2ttXsRBTskXnrT8e5gWwIyJdx90pU4DKn3T4EUsMCeJ4f6N5FyRv3A+RkSU?= =?us-ascii?Q?fh2+RKlHPOQl8QfaSUK8ede7Pa9CjAbcD8UID3twbRpls8+ptfzcklubjkKk?= =?us-ascii?Q?K1jAbeK8n2kpAqphd8RfgAG0ys4V93mrET0BULJHWnFoCL71iDSpV/sN33Az?= =?us-ascii?Q?hhBDAkOo+Os0gGT0IfAAmnX7Hi3gnBDPwDkKcNIm07A8hQZ19Igzq77IcRCE?= =?us-ascii?Q?Iqn1o0nEwKjzIw+QWHoGKJmVvW4iI5hyb05akmmTQ+ZFK9dGaAmzMuNh6hNq?= =?us-ascii?Q?wLYi41qowwyUyqF0NfuOMrcpDdNIoORjaDX1hO+6CBsTTwyPk55DEnEWMlOT?= =?us-ascii?Q?B9oV316Q4BJep8XAgCeYNC/+Fwu4hCcY0baSgUtM2GtPjO5IgCNDTyCo/87w?= =?us-ascii?Q?9O3VCUx37sYkg2ULzWJTgwcy2zhzA2QUT7vGub8aD/FghWifxtXgFDuLAYQi?= =?us-ascii?Q?YHI/aViqguluS/WspjDrmrsEa9JDsUkX1wUiXJ3cfz08JGt03U5gq3wsor4K?= =?us-ascii?Q?e/d3WjSQzSYHKhxtAwC+Y0+1J84FdUKZ+nwavS5lDAIycyoi6c5pZ2xhtFAd?= =?us-ascii?Q?jDd50yZSRrwMp5XuqyXUBqTWKWxWq1axnkYeuq+HCnjX3JiBOvVmHW+tW0te?= =?us-ascii?Q?fXuRfS6phkibD4RbR1MIqEnYhUSh4QydFdrgpl/fDIf3F+T/+SQWnexZrk+h?= =?us-ascii?Q?+aOAON8hC8WuoLOMhWa5Yz1pwdvfhgbpLbM74MaQPIjlsMuSjjnaIXMiJgPZ?= =?us-ascii?Q?7SZg6L8BjRJCkHL3/PVlTsGdM3VG6FvtP7IUSz1wLv9MiLvR5cUkU8W1pWeX?= =?us-ascii?Q?qvb5GEDvOxg1pYKOGhlDPSXY69fVIUqwtrt6d2+8DERIh/HATJ6D5fbH58q3?= =?us-ascii?Q?RVQdJcrM1T4HH5o70bE8tbOyoxYfKCHbWNLQYTjkcSAJZaK3qm9ShBJrPwwS?= =?us-ascii?Q?JbCo5CvEO/MCvhpMMn1ZpeIcXjHOEWtJW4TBjjpvb4P5f5ZGJzwDqfD/Azui?= =?us-ascii?Q?dtFa2WC52fcDWnmVN4rw3juNq4tBqRs9X+TDOug3FfqJsRbCw3pIlMrYJXi2?= =?us-ascii?Q?N4g7QRcT13VrLRGcr0Q=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MWHPR11MB1631.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d0a23f2a-2397-4a97-c7d3-08da75db65c0 X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Aug 2022 05:37:19.1298 (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: 6Bgq0c5Gnz/HNc9aN4PsoE92gJHndpM7pcnF2XRvFarKcqV81bvzCYfd0fgkreMYxx8Cf+2at3cBCRz+yC0HTQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR11MB4894 Return-Path: ray.ni@intel.com X-OriginatorOrg: intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 1. Old code contains a picture that describes the buffer layout. It seems t= he picture disappears in new code. 2. When TSS is enabled, there is one descriptor in GDT that points to the T= SS. But TSS is not part of GDT. New code contains comments to treat TSS as = part of GDT. 3. Did you run ECC and uncrustify? I saw some coding style issues. 4. Assertion in below code is unnecessary. if (BufferSize =3D=3D 0 ) { continue; } ASSERT (BufferSize !=3D 0); 5. EDKII coding style doesn't allow single line code comments just after th= e code. 6. Is it possible to simplify the ESS_DATA structure further? For example, = are IdtTable/IdtTableSize needed in the structure? Please evaluate further = and simplify that in a separate patch. 7. "SWITCH_STACK_DATA" semes to support the stack switch. Can we use "EXCEP= TION_STACK_SWITCH_CONTEXT"? "EXCEPTION_" is used here to indicate it's not = for stack switch immediately but for exception handlers. 8. Is it possible to run the AP procedure in parallel instead of one-by-one= ? Such optimization can be done in a separate patch. Thanks, Ray > -----Original Message----- > From: Liu, Zhiguang > Sent: Friday, July 22, 2022 3:58 PM > To: devel@edk2.groups.io > Cc: Liu, Zhiguang ; Dong, Eric > ; Ni, Ray ; Kumar, Rahul1 > ; Leif Lindholm ; Bi, > Dandan ; Gao, Liming ; > Wang, Jian J ; Ard Biesheuvel > ; Sami Mujawar > Subject: [PATCH 1/2] UefiCpuPkg: Simplify InitializeSeparateExceptionStac= ks >=20 > Hide the Exception implementation details in CpuExcetionHandlerLib and > caller only need to provide buffer >=20 > Cc: Eric Dong > Cc: Ray Ni > Cc: Rahul Kumar > Cc: Leif Lindholm > Cc: Dandan Bi > Cc: Liming Gao > Cc: Jian J Wang > Cc: Ard Biesheuvel > Cc: Sami Mujawar > Signed-off-by: Zhiguang Liu > --- > .../Library/ArmExceptionLib/ArmExceptionLib.c | 15 +- > MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c | 4 +- > .../Include/Library/CpuExceptionHandlerLib.h | 15 +- > .../CpuExceptionHandlerLibNull.c | 15 +- > UefiCpuPkg/CpuDxe/CpuMp.c | 157 +++------------- > UefiCpuPkg/CpuDxe/CpuMp.h | 10 +- > UefiCpuPkg/CpuMpPei/CpuMpPei.c | 174 ++++-------------- > UefiCpuPkg/CpuMpPei/CpuMpPei.h | 10 +- > .../CpuExceptionHandlerLib/DxeException.c | 77 +++++--- > .../Ia32/ArchExceptionHandler.c | 3 +- > .../CpuExceptionHandlerLib/PeiCpuException.c | 62 ++++++- > .../PeiCpuExceptionHandlerLib.inf | 4 +- > .../SecPeiCpuException.c | 15 +- > .../CpuExceptionHandlerLib/SmmException.c | 15 +- > .../X64/ArchExceptionHandler.c | 3 +- > 15 files changed, 231 insertions(+), 348 deletions(-) >=20 > diff --git a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c > b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c > index 2c7bc66aa7..a521c33f32 100644 > --- a/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c > +++ b/ArmPkg/Library/ArmExceptionLib/ArmExceptionLib.c > @@ -288,20 +288,23 @@ CommonCExceptionHandler ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > return EFI_SUCCESS; > diff --git a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > index 0a1f3d79e2..5733f0c8ec 100644 > --- a/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > +++ b/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c > @@ -1,7 +1,7 @@ > /** @file > DXE Core Main Entry Point >=20 > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> +Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -260,7 +260,7 @@ DxeMain ( > // Setup Stack Guard > // > if (PcdGetBool (PcdCpuStackGuard)) { > - Status =3D InitializeSeparateExceptionStacks (NULL); > + Status =3D InitializeSeparateExceptionStacks (NULL, NULL); > ASSERT_EFI_ERROR (Status); > } >=20 > diff --git a/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h > b/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h > index 9a495081f7..8d44ed916a 100644 > --- a/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h > +++ b/MdeModulePkg/Include/Library/CpuExceptionHandlerLib.h > @@ -104,20 +104,23 @@ InitializeCpuExceptionHandlers ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ); >=20 > /** > diff --git > a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandl > erLibNull.c > b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandl > erLibNull.c > index 8aeedcb4d1..74908a379b 100644 > --- > a/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandl > erLibNull.c > +++ > b/MdeModulePkg/Library/CpuExceptionHandlerLibNull/CpuExceptionHandl > erLibNull.c > @@ -83,20 +83,23 @@ DumpCpuContext ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > return EFI_UNSUPPORTED; > diff --git a/UefiCpuPkg/CpuDxe/CpuMp.c b/UefiCpuPkg/CpuDxe/CpuMp.c > index e385f585c7..286ef2d3fd 100644 > --- a/UefiCpuPkg/CpuDxe/CpuMp.c > +++ b/UefiCpuPkg/CpuDxe/CpuMp.c > @@ -596,24 +596,6 @@ CollectBistDataFromHob ( > } > } >=20 > -/** > - Get GDT register value. > - > - This function is mainly for AP purpose because AP may have different G= DT > - table than BSP. > - > - @param[in,out] Buffer The pointer to private data buffer. > - > -**/ > -VOID > -EFIAPI > -GetGdtr ( > - IN OUT VOID *Buffer > - ) > -{ > - AsmReadGdtr ((IA32_DESCRIPTOR *)Buffer); > -} > - > /** > Initializes CPU exceptions handlers for the sake of stack switch requi= rement. >=20 > @@ -629,27 +611,17 @@ InitializeExceptionStackSwitchHandlers ( > IN OUT VOID *Buffer > ) > { > - CPU_EXCEPTION_INIT_DATA *EssData; > - IA32_DESCRIPTOR Idtr; > - EFI_STATUS Status; > + SWITCH_STACK_DATA *SwitchStackData; >=20 > - EssData =3D Buffer; > - // > - // We don't plan to replace IDT table with a new one, but we should no= t > assume > - // the AP's IDT is the same as BSP's IDT either. > - // > - AsmReadIdtr (&Idtr); > - EssData->Ia32.IdtTable =3D (VOID *)Idtr.Base; > - EssData->Ia32.IdtTableSize =3D Idtr.Limit + 1; > - Status =3D InitializeSeparateExceptionStacks (EssD= ata); > - ASSERT_EFI_ERROR (Status); > + SwitchStackData =3D (SWITCH_STACK_DATA *)Buffer; > + InitializeSeparateExceptionStacks (SwitchStackData->Buffer, > SwitchStackData->BufferSize); > } >=20 > /** > Initializes MP exceptions handlers for the sake of stack switch requir= ement. >=20 > This function will allocate required resources required to setup stack= switch > - and pass them through CPU_EXCEPTION_INIT_DATA to each logic > processor. > + and pass them through SwitchStackData to each logic processor. >=20 > **/ > VOID > @@ -657,129 +629,52 @@ InitializeMpExceptionStackSwitchHandlers ( > VOID > ) > { > - UINTN Index; > - UINTN Bsp; > - UINTN ExceptionNumber; > - UINTN OldGdtSize; > - UINTN NewGdtSize; > - UINTN NewStackSize; > - IA32_DESCRIPTOR Gdtr; > - CPU_EXCEPTION_INIT_DATA EssData; > - UINT8 *GdtBuffer; > - UINT8 *StackTop; > - > - ExceptionNumber =3D FixedPcdGetSize (PcdCpuStackSwitchExceptionList); > - NewStackSize =3D FixedPcdGet32 (PcdCpuKnownGoodStackSize) * > ExceptionNumber; > - > - StackTop =3D AllocateRuntimeZeroPool (NewStackSize * > mNumberOfProcessors); > - ASSERT (StackTop !=3D NULL); > - StackTop +=3D NewStackSize * mNumberOfProcessors; > + UINTN Index; > + UINTN Bsp; > + UINT8 *Buffer; > + SWITCH_STACK_DATA SwitchStackData; > + UINTN BufferSize; >=20 > - // > - // The default exception handlers must have been initialized. Let's ju= st skip > - // it in this method. > - // > - EssData.Ia32.Revision =3D CPU_EXCEPTION_INIT_DATA_REV; > - EssData.Ia32.InitDefaultHandlers =3D FALSE; > - > - EssData.Ia32.StackSwitchExceptions =3D FixedPcdGetPtr > (PcdCpuStackSwitchExceptionList); > - EssData.Ia32.StackSwitchExceptionNumber =3D ExceptionNumber; > - EssData.Ia32.KnownGoodStackSize =3D FixedPcdGet32 > (PcdCpuKnownGoodStackSize); > - > - // > - // Initialize Gdtr to suppress incorrect compiler/analyzer warnings. > - // > - Gdtr.Base =3D 0; > - Gdtr.Limit =3D 0; > + SwitchStackData.BufferSize =3D &BufferSize; > MpInitLibWhoAmI (&Bsp); > + > for (Index =3D 0; Index < mNumberOfProcessors; ++Index) { > - // > - // To support stack switch, we need to re-construct GDT but not IDT. > - // > + SwitchStackData.Buffer =3D NULL; > + BufferSize =3D 0; > + > if (Index =3D=3D Bsp) { > - GetGdtr (&Gdtr); > + InitializeExceptionStackSwitchHandlers (&SwitchStackData); > } else { > // > - // AP might have different size of GDT from BSP. > + // AP might need different buffer size from BSP. > // > - MpInitLibStartupThisAP (GetGdtr, Index, NULL, 0, (VOID *)&Gdtr, NU= LL); > + MpInitLibStartupThisAP (InitializeExceptionStackSwitchHandlers, In= dex, > NULL, 0, (VOID *)&SwitchStackData, NULL); > } >=20 > - // > - // X64 needs only one TSS of current task working for all exceptions > - // because of its IST feature. IA32 needs one TSS for each exception > - // in addition to current task. Since AP is not supposed to allocate > - // memory, we have to do it in BSP. To simplify the code, we allocat= e > - // memory for IA32 case to cover both IA32 and X64 exception stack > - // switch. > - // > - // Layout of memory to allocate for each processor: > - // -------------------------------- > - // | Alignment | (just in case) > - // -------------------------------- > - // | | > - // | Original GDT | > - // | | > - // -------------------------------- > - // | Current task descriptor | > - // -------------------------------- > - // | | > - // | Exception task descriptors | X ExceptionNumber > - // | | > - // -------------------------------- > - // | Current task-state segment | > - // -------------------------------- > - // | | > - // | Exception task-state segment | X ExceptionNumber > - // | | > - // -------------------------------- > - // > - OldGdtSize =3D Gdtr.Limit + 1; > - EssData.Ia32.ExceptionTssDescSize =3D sizeof (IA32_TSS_DESCRIPTOR) * > - (ExceptionNumber + 1); > - EssData.Ia32.ExceptionTssSize =3D sizeof (IA32_TASK_STATE_SEGMENT) * > - (ExceptionNumber + 1); > - NewGdtSize =3D sizeof (IA32_TSS_DESCRIPTOR) + > - OldGdtSize + > - EssData.Ia32.ExceptionTssDescSize + > - EssData.Ia32.ExceptionTssSize; > - > - GdtBuffer =3D AllocateRuntimeZeroPool (NewGdtSize); > - ASSERT (GdtBuffer !=3D NULL); > - > - // > - // Make sure GDT table alignment > - // > - EssData.Ia32.GdtTable =3D ALIGN_POINTER (GdtBuffer, sizeof > (IA32_TSS_DESCRIPTOR)); > - NewGdtSize -=3D ((UINT8 *)EssData.Ia32.GdtTable - GdtB= uffer); > - EssData.Ia32.GdtTableSize =3D NewGdtSize; > - > - EssData.Ia32.ExceptionTssDesc =3D ((UINT8 *)EssData.Ia32.GdtTable + > OldGdtSize); > - EssData.Ia32.ExceptionTss =3D ((UINT8 *)EssData.Ia32.GdtTable + > OldGdtSize + > - EssData.Ia32.ExceptionTssDescSize); > - > - EssData.Ia32.KnownGoodStackTop =3D (UINTN)StackTop; > + ASSERT (BufferSize !=3D 0); > + Buffer =3D AllocateRuntimeZeroPool (BufferSize); > + ASSERT (Buffer !=3D NULL); > + SwitchStackData.Buffer =3D Buffer; > DEBUG (( > DEBUG_INFO, > - "Exception stack top[cpu%lu]: 0x%lX\n", > + "Buffer[cpu%lu] for InitializeExceptionStackSwitchHandlers: 0x%lX = with > size 0x%x\n", > (UINT64)(UINTN)Index, > - (UINT64)(UINTN)StackTop > + (UINT64)(UINTN)Buffer, > + (UINT32)BufferSize > )); >=20 > if (Index =3D=3D Bsp) { > - InitializeExceptionStackSwitchHandlers (&EssData); > + InitializeExceptionStackSwitchHandlers (&SwitchStackData); > } else { > MpInitLibStartupThisAP ( > InitializeExceptionStackSwitchHandlers, > Index, > NULL, > 0, > - (VOID *)&EssData, > + (VOID *)&SwitchStackData, > NULL > ); > } > - > - StackTop -=3D NewStackSize; > } > } >=20 > diff --git a/UefiCpuPkg/CpuDxe/CpuMp.h b/UefiCpuPkg/CpuDxe/CpuMp.h > index b461753510..c545a711b8 100644 > --- a/UefiCpuPkg/CpuDxe/CpuMp.h > +++ b/UefiCpuPkg/CpuDxe/CpuMp.h > @@ -1,7 +1,7 @@ > /** @file > CPU DXE MP support >=20 > - Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
> + Copyright (c) 2006 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -9,6 +9,14 @@ > #ifndef _CPU_MP_H_ > #define _CPU_MP_H_ >=20 > +// > +// Structure for InitializeSeparateExceptionStacks > +// > +typedef struct { > + VOID *Buffer; > + UINTN *BufferSize; > +} SWITCH_STACK_DATA; > + > /** > Initialize Multi-processor support. >=20 > diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.c > b/UefiCpuPkg/CpuMpPei/CpuMpPei.c > index d4786979fa..dfc0128361 100644 > --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.c > +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.c > @@ -1,7 +1,7 @@ > /** @file > CPU PEI Module installs CPU Multiple Processor PPI. >=20 > - Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> + Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -411,24 +411,6 @@ PeiWhoAmI ( > return MpInitLibWhoAmI (ProcessorNumber); > } >=20 > -/** > - Get GDT register value. > - > - This function is mainly for AP purpose because AP may have different G= DT > - table than BSP. > - > - @param[in,out] Buffer The pointer to private data buffer. > - > -**/ > -VOID > -EFIAPI > -GetGdtr ( > - IN OUT VOID *Buffer > - ) > -{ > - AsmReadGdtr ((IA32_DESCRIPTOR *)Buffer); > -} > - > /** > Initializes CPU exceptions handlers for the sake of stack switch requi= rement. >=20 > @@ -444,27 +426,17 @@ InitializeExceptionStackSwitchHandlers ( > IN OUT VOID *Buffer > ) > { > - CPU_EXCEPTION_INIT_DATA *EssData; > - IA32_DESCRIPTOR Idtr; > - EFI_STATUS Status; > + SWITCH_STACK_DATA *SwitchStackData; >=20 > - EssData =3D Buffer; > - // > - // We don't plan to replace IDT table with a new one, but we should no= t > assume > - // the AP's IDT is the same as BSP's IDT either. > - // > - AsmReadIdtr (&Idtr); > - EssData->Ia32.IdtTable =3D (VOID *)Idtr.Base; > - EssData->Ia32.IdtTableSize =3D Idtr.Limit + 1; > - Status =3D InitializeSeparateExceptionStacks (EssD= ata); > - ASSERT_EFI_ERROR (Status); > + SwitchStackData =3D (SWITCH_STACK_DATA *)Buffer; > + InitializeSeparateExceptionStacks (SwitchStackData->Buffer, > SwitchStackData->BufferSize); > } >=20 > /** > Initializes MP exceptions handlers for the sake of stack switch requir= ement. >=20 > This function will allocate required resources required to setup stack= switch > - and pass them through CPU_EXCEPTION_INIT_DATA to each logic > processor. > + and pass them through SwitchStackData to each logic processor. >=20 > **/ > VOID > @@ -472,18 +444,14 @@ InitializeMpExceptionStackSwitchHandlers ( > VOID > ) > { > - EFI_STATUS Status; > - UINTN Index; > - UINTN Bsp; > - UINTN ExceptionNumber; > - UINTN OldGdtSize; > - UINTN NewGdtSize; > - UINTN NewStackSize; > - IA32_DESCRIPTOR Gdtr; > - CPU_EXCEPTION_INIT_DATA EssData; > - UINT8 *GdtBuffer; > - UINT8 *StackTop; > - UINTN NumberOfProcessors; > + UINTN Index; > + UINTN Bsp; > + UINT8 *Buffer; > + SWITCH_STACK_DATA SwitchStackData; > + UINTN BufferSize; > + > + SwitchStackData.BufferSize =3D &BufferSize; > + UINTN NumberOfProcessors; >=20 > if (!PcdGetBool (PcdCpuStackGuard)) { > return; > @@ -492,128 +460,48 @@ InitializeMpExceptionStackSwitchHandlers ( > MpInitLibGetNumberOfProcessors (&NumberOfProcessors, NULL); > MpInitLibWhoAmI (&Bsp); >=20 > - ExceptionNumber =3D FixedPcdGetSize (PcdCpuStackSwitchExceptionList); > - NewStackSize =3D FixedPcdGet32 (PcdCpuKnownGoodStackSize) * > ExceptionNumber; > - > - StackTop =3D AllocatePages (EFI_SIZE_TO_PAGES (NewStackSize * > NumberOfProcessors)); > - ASSERT (StackTop !=3D NULL); > - if (StackTop =3D=3D NULL) { > - return; > - } > - > - StackTop +=3D NewStackSize * NumberOfProcessors; > - > - // > - // The default exception handlers must have been initialized. Let's ju= st skip > - // it in this method. > - // > - EssData.Ia32.Revision =3D CPU_EXCEPTION_INIT_DATA_REV; > - EssData.Ia32.InitDefaultHandlers =3D FALSE; > - > - EssData.Ia32.StackSwitchExceptions =3D FixedPcdGetPtr > (PcdCpuStackSwitchExceptionList); > - EssData.Ia32.StackSwitchExceptionNumber =3D ExceptionNumber; > - EssData.Ia32.KnownGoodStackSize =3D FixedPcdGet32 > (PcdCpuKnownGoodStackSize); > - > - // > - // Initialize Gdtr to suppress incorrect compiler/analyzer warnings. > - // > - Gdtr.Base =3D 0; > - Gdtr.Limit =3D 0; > for (Index =3D 0; Index < NumberOfProcessors; ++Index) { > - // > - // To support stack switch, we need to re-construct GDT but not IDT. > - // > + SwitchStackData.Buffer =3D NULL; > + BufferSize =3D 0; > + > if (Index =3D=3D Bsp) { > - GetGdtr (&Gdtr); > + InitializeExceptionStackSwitchHandlers (&SwitchStackData); > } else { > // > - // AP might have different size of GDT from BSP. > + // AP might need different buffer size from BSP. > // > - MpInitLibStartupThisAP (GetGdtr, Index, NULL, 0, (VOID *)&Gdtr, NU= LL); > + MpInitLibStartupThisAP (InitializeExceptionStackSwitchHandlers, In= dex, > NULL, 0, (VOID *)&SwitchStackData, NULL); > } >=20 > - // > - // X64 needs only one TSS of current task working for all exceptions > - // because of its IST feature. IA32 needs one TSS for each exception > - // in addition to current task. Since AP is not supposed to allocate > - // memory, we have to do it in BSP. To simplify the code, we allocat= e > - // memory for IA32 case to cover both IA32 and X64 exception stack > - // switch. > - // > - // Layout of memory to allocate for each processor: > - // -------------------------------- > - // | Alignment | (just in case) > - // -------------------------------- > - // | | > - // | Original GDT | > - // | | > - // -------------------------------- > - // | Current task descriptor | > - // -------------------------------- > - // | | > - // | Exception task descriptors | X ExceptionNumber > - // | | > - // -------------------------------- > - // | Current task-state segment | > - // -------------------------------- > - // | | > - // | Exception task-state segment | X ExceptionNumber > - // | | > - // -------------------------------- > - // > - OldGdtSize =3D Gdtr.Limit + 1; > - EssData.Ia32.ExceptionTssDescSize =3D sizeof (IA32_TSS_DESCRIPTOR) * > - (ExceptionNumber + 1); > - EssData.Ia32.ExceptionTssSize =3D sizeof (IA32_TASK_STATE_SEGMENT) * > - (ExceptionNumber + 1); > - NewGdtSize =3D sizeof (IA32_TSS_DESCRIPTOR) + > - OldGdtSize + > - EssData.Ia32.ExceptionTssDescSize + > - EssData.Ia32.ExceptionTssSize; > - > - Status =3D PeiServicesAllocatePool ( > - NewGdtSize, > - (VOID **)&GdtBuffer > - ); > - ASSERT (GdtBuffer !=3D NULL); > - if (EFI_ERROR (Status)) { > - ASSERT_EFI_ERROR (Status); > - return; > + if (BufferSize =3D=3D 0 ) { > + continue; > } >=20 > - // > - // Make sure GDT table alignment > - // > - EssData.Ia32.GdtTable =3D ALIGN_POINTER (GdtBuffer, sizeof > (IA32_TSS_DESCRIPTOR)); > - NewGdtSize -=3D ((UINT8 *)EssData.Ia32.GdtTable - GdtB= uffer); > - EssData.Ia32.GdtTableSize =3D NewGdtSize; > - > - EssData.Ia32.ExceptionTssDesc =3D ((UINT8 *)EssData.Ia32.GdtTable + > OldGdtSize); > - EssData.Ia32.ExceptionTss =3D ((UINT8 *)EssData.Ia32.GdtTable + > OldGdtSize + > - EssData.Ia32.ExceptionTssDescSize); > - > - EssData.Ia32.KnownGoodStackTop =3D (UINTN)StackTop; > + ASSERT (BufferSize !=3D 0); > + Buffer =3D AllocatePages (EFI_SIZE_TO_PAGES (BufferSize)); > + ASSERT (Buffer !=3D NULL); > + ZeroMem (Buffer, EFI_PAGES_TO_SIZE (EFI_SIZE_TO_PAGES > (BufferSize))); > + SwitchStackData.Buffer =3D Buffer; > DEBUG (( > DEBUG_INFO, > - "Exception stack top[cpu%lu]: 0x%lX\n", > + "Buffer[cpu%lu] for InitializeExceptionStackSwitchHandlers: 0x%lX = with > size 0x%x\n", > (UINT64)(UINTN)Index, > - (UINT64)(UINTN)StackTop > + (UINT64)(UINTN)Buffer, > + (UINT32)BufferSize > )); >=20 > if (Index =3D=3D Bsp) { > - InitializeExceptionStackSwitchHandlers (&EssData); > + InitializeExceptionStackSwitchHandlers (&SwitchStackData); > } else { > MpInitLibStartupThisAP ( > InitializeExceptionStackSwitchHandlers, > Index, > NULL, > 0, > - (VOID *)&EssData, > + (VOID *)&SwitchStackData, > NULL > ); > } > - > - StackTop -=3D NewStackSize; > } > } >=20 > diff --git a/UefiCpuPkg/CpuMpPei/CpuMpPei.h > b/UefiCpuPkg/CpuMpPei/CpuMpPei.h > index 0649c48d14..f4fe7a3d39 100644 > --- a/UefiCpuPkg/CpuMpPei/CpuMpPei.h > +++ b/UefiCpuPkg/CpuMpPei/CpuMpPei.h > @@ -1,7 +1,7 @@ > /** @file > Definitions to install Multiple Processor PPI. >=20 > - Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> + Copyright (c) 2015 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -31,6 +31,14 @@ >=20 > extern EFI_PEI_PPI_DESCRIPTOR mPeiCpuMpPpiDesc; >=20 > +// > +// Structure for InitializeSeparateExceptionStacks > +// > +typedef struct { > + VOID *Buffer; > + UINTN *BufferSize; > +} SWITCH_STACK_DATA; > + > /** > This service retrieves the number of logical processor in the platform > and the number of those logical processors that are enabled on this bo= ot. > diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c > index e62bb5e6c0..4b75c42f1e 100644 > --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c > +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeException.c > @@ -104,48 +104,71 @@ RegisterCpuInterruptHandler ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > CPU_EXCEPTION_INIT_DATA EssData; > IA32_DESCRIPTOR Idtr; > IA32_DESCRIPTOR Gdtr; > + UINTN NeedBufferSize; > + UINTN StackTop; > + UINT8 *NewGdtTable; >=20 > - if (InitData =3D=3D NULL) { > + AsmReadGdtr (&Gdtr); > + if ((Buffer =3D=3D NULL) && (BufferSize =3D=3D NULL)) { > SetMem (mNewGdt, sizeof (mNewGdt), 0); > - > - AsmReadIdtr (&Idtr); > - AsmReadGdtr (&Gdtr); > - > - EssData.X64.Revision =3D CPU_EXCEPTION_INIT_DATA_R= EV; > - EssData.X64.KnownGoodStackTop =3D (UINTN)mNewStack + sizeof > (mNewStack); > - EssData.X64.KnownGoodStackSize =3D > CPU_KNOWN_GOOD_STACK_SIZE; > - EssData.X64.StackSwitchExceptions =3D > CPU_STACK_SWITCH_EXCEPTION_LIST; > - EssData.X64.StackSwitchExceptionNumber =3D > CPU_STACK_SWITCH_EXCEPTION_NUMBER; > - EssData.X64.IdtTable =3D (VOID *)Idtr.Base; > - EssData.X64.IdtTableSize =3D Idtr.Limit + 1; > - EssData.X64.GdtTable =3D mNewGdt; > - EssData.X64.GdtTableSize =3D sizeof (mNewGdt); > - EssData.X64.ExceptionTssDesc =3D mNewGdt + Gdtr.Limit + 1; > - EssData.X64.ExceptionTssDescSize =3D CPU_TSS_DESC_SIZE; > - EssData.X64.ExceptionTss =3D mNewGdt + Gdtr.Limit + 1 = + > CPU_TSS_DESC_SIZE; > - EssData.X64.ExceptionTssSize =3D CPU_TSS_SIZE; > - > - InitData =3D &EssData; > + StackTop =3D (UINTN)mNewStack + sizeof (mNewStack); > + NewGdtTable =3D mNewGdt; > + } else { > + if (BufferSize =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + NeedBufferSize =3D CPU_STACK_SWITCH_EXCEPTION_NUMBER * > CPU_KNOWN_GOOD_STACK_SIZE + // Stack size > + CPU_TSS_DESC_SIZE + CPU_TSS_SIZE + Gdtr.Limit + 1 += // > GDT size > + sizeof (IA32_TSS_DESCRIPTOR); = // Make sure > GDT table alignment > + if (*BufferSize < NeedBufferSize) { > + *BufferSize =3D NeedBufferSize; > + return EFI_BUFFER_TOO_SMALL; > + } > + > + if (Buffer =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + StackTop =3D (UINTN)Buffer + > CPU_STACK_SWITCH_EXCEPTION_NUMBER * > CPU_KNOWN_GOOD_STACK_SIZE; > + NewGdtTable =3D ALIGN_POINTER (StackTop, sizeof > (IA32_TSS_DESCRIPTOR)); > } >=20 > - return ArchSetupExceptionStack (InitData); > + AsmReadIdtr (&Idtr); > + EssData.X64.KnownGoodStackTop =3D StackTop; > + EssData.X64.KnownGoodStackSize =3D > CPU_KNOWN_GOOD_STACK_SIZE; > + EssData.X64.StackSwitchExceptions =3D > CPU_STACK_SWITCH_EXCEPTION_LIST; > + EssData.X64.StackSwitchExceptionNumber =3D > CPU_STACK_SWITCH_EXCEPTION_NUMBER; > + EssData.X64.IdtTable =3D (VOID *)Idtr.Base; // Won't= change IDT > table in this function > + EssData.X64.IdtTableSize =3D Idtr.Limit + 1; > + EssData.X64.GdtTable =3D NewGdtTable; > + EssData.X64.GdtTableSize =3D CPU_TSS_DESC_SIZE + CPU_TSS= _SIZE + > Gdtr.Limit + 1; > + EssData.X64.ExceptionTssDesc =3D NewGdtTable + Gdtr.Limit + = 1; > + EssData.X64.ExceptionTssDescSize =3D CPU_TSS_DESC_SIZE; > + EssData.X64.ExceptionTss =3D NewGdtTable + Gdtr.Limit + = 1 + > CPU_TSS_DESC_SIZE; > + EssData.X64.ExceptionTssSize =3D CPU_TSS_SIZE; > + > + return ArchSetupExceptionStack (&EssData); > } > diff --git > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler. > c > index f13e8e7020..fa62074023 100644 > --- > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler.c > +++ > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/Ia32/ArchExceptionHandler. > c > @@ -1,7 +1,7 @@ > /** @file > IA32 CPU Exception Handler functons. >=20 > - Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.
> + Copyright (c) 2012 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -132,7 +132,6 @@ ArchSetupExceptionStack ( > EXCEPTION_HANDLER_TEMPLATE_MAP TemplateMap; >=20 > if ((StackSwitchData =3D=3D NULL) || > - (StackSwitchData->Ia32.Revision !=3D CPU_EXCEPTION_INIT_DATA_REV) > || > (StackSwitchData->Ia32.KnownGoodStackTop =3D=3D 0) || > (StackSwitchData->Ia32.KnownGoodStackSize =3D=3D 0) || > (StackSwitchData->Ia32.StackSwitchExceptions =3D=3D NULL) || > diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c > index 494c2ab433..2868560855 100644 > --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c > +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c > @@ -151,25 +151,71 @@ InitializeCpuExceptionHandlers ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > - if (InitData =3D=3D NULL) { > + CPU_EXCEPTION_INIT_DATA EssData; > + IA32_DESCRIPTOR Idtr; > + IA32_DESCRIPTOR Gdtr; > + UINTN NeedBufferSize; > + UINTN StackTop; > + UINT8 *NewGdtTable; > + > + if ((Buffer =3D=3D NULL) && (BufferSize =3D=3D NULL)) { > return EFI_UNSUPPORTED; > } >=20 > - return ArchSetupExceptionStack (InitData); > + if (BufferSize =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + AsmReadGdtr (&Gdtr); > + > + NeedBufferSize =3D CPU_STACK_SWITCH_EXCEPTION_NUMBER * > CPU_KNOWN_GOOD_STACK_SIZE + // Stack size > + CPU_TSS_DESC_SIZE + CPU_TSS_SIZE + Gdtr.Limit + 1 + = // > GDT size > + sizeof (IA32_TSS_DESCRIPTOR); = // Make sure > GDT table alignment > + > + if (*BufferSize < NeedBufferSize) { > + *BufferSize =3D NeedBufferSize; > + return EFI_BUFFER_TOO_SMALL; > + } > + > + if (Buffer =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + StackTop =3D (UINTN)Buffer + CPU_STACK_SWITCH_EXCEPTION_NUMBER > * CPU_KNOWN_GOOD_STACK_SIZE; > + NewGdtTable =3D ALIGN_POINTER (StackTop, sizeof > (IA32_TSS_DESCRIPTOR)); > + > + AsmReadIdtr (&Idtr); > + EssData.X64.KnownGoodStackTop =3D StackTop; > + EssData.X64.KnownGoodStackSize =3D > CPU_KNOWN_GOOD_STACK_SIZE; > + EssData.X64.StackSwitchExceptions =3D > CPU_STACK_SWITCH_EXCEPTION_LIST; > + EssData.X64.StackSwitchExceptionNumber =3D > CPU_STACK_SWITCH_EXCEPTION_NUMBER; > + EssData.X64.IdtTable =3D (VOID *)Idtr.Base; // Won't= change IDT > table in this function > + EssData.X64.IdtTableSize =3D Idtr.Limit + 1; > + EssData.X64.GdtTable =3D NewGdtTable; > + EssData.X64.GdtTableSize =3D CPU_TSS_DESC_SIZE + CPU_TSS= _SIZE + > Gdtr.Limit + 1; > + EssData.X64.ExceptionTssDesc =3D NewGdtTable + Gdtr.Limit + = 1; > + EssData.X64.ExceptionTssDescSize =3D CPU_TSS_DESC_SIZE; > + EssData.X64.ExceptionTss =3D NewGdtTable + Gdtr.Limit + = 1 + > CPU_TSS_DESC_SIZE; > + EssData.X64.ExceptionTssSize =3D CPU_TSS_SIZE; > + > + return ArchSetupExceptionStack (&EssData); > } > diff --git > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.i > nf > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.i > nf > index cf5bfe4083..7c2ec3b2db 100644 > --- > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.i > nf > +++ > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuExceptionHandlerLib.i > nf > @@ -1,7 +1,7 @@ > ## @file > # CPU Exception Handler library instance for PEI module. > # > -# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved. > +# Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved. > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > @@ -56,6 +56,8 @@ >=20 > [Pcd] > gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard # CONSUMES > + gUefiCpuPkgTokenSpaceGuid.PcdCpuKnownGoodStackSize > + gUefiCpuPkgTokenSpaceGuid.PcdCpuStackSwitchExceptionList >=20 > [FeaturePcd] > gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackGuard ## > CONSUMES > diff --git > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c > index 4313cc5582..ad5e0e9ed4 100644 > --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c > +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SecPeiCpuException.c > @@ -201,20 +201,23 @@ RegisterCpuInterruptHandler ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > return EFI_UNSUPPORTED; > diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c > index 1c97dab926..46a86ad2c6 100644 > --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c > +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmException.c > @@ -97,20 +97,23 @@ RegisterCpuInterruptHandler ( >=20 > /** > Setup separate stacks for certain exception handlers. > + If the input Buffer and BufferSize are both NULL, use global variable = if > possible. >=20 > - InitData is optional and processor arch dependent. > - > - @param[in] InitData Pointer to data optional for information abo= ut how > - to assign stacks for certain exception handl= ers. > + @param[in] Buffer Point to buffer used to separate except= ion stack. > + @param[in, out] BufferSize On input, it indicates the byte size of= Buffer. > + If the size is not enough, the return s= tatus will > + be EFI_BUFFER_TOO_SMALL, and output Buf= ferSize > + will be the size it needs. >=20 > @retval EFI_SUCCESS The stacks are assigned successfully. > @retval EFI_UNSUPPORTED This function is not supported. > - > + @retval EFI_BUFFER_TOO_SMALL This BufferSize is too small. > **/ > EFI_STATUS > EFIAPI > InitializeSeparateExceptionStacks ( > - IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL > + IN VOID *Buffer, > + IN OUT UINTN *BufferSize > ) > { > return EFI_UNSUPPORTED; > diff --git > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c > index cd7dccd481..ff0dde4f12 100644 > --- > a/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c > +++ > b/UefiCpuPkg/Library/CpuExceptionHandlerLib/X64/ArchExceptionHandler.c > @@ -1,7 +1,7 @@ > /** @file > x64 CPU Exception Handler. >=20 > - Copyright (c) 2012 - 2019, Intel Corporation. All rights reserved.
> + Copyright (c) 2012 - 2022, Intel Corporation. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent >=20 > **/ > @@ -136,7 +136,6 @@ ArchSetupExceptionStack ( > UINTN GdtSize; >=20 > if ((StackSwitchData =3D=3D NULL) || > - (StackSwitchData->Ia32.Revision !=3D CPU_EXCEPTION_INIT_DATA_REV) > || > (StackSwitchData->X64.KnownGoodStackTop =3D=3D 0) || > (StackSwitchData->X64.KnownGoodStackSize =3D=3D 0) || > (StackSwitchData->X64.StackSwitchExceptions =3D=3D NULL) || > -- > 2.26.2.windows.1