From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mx.groups.io with SMTP id smtpd.web11.11438.1670233080211634944 for ; Mon, 05 Dec 2022 01:38:00 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=IN4rCfNo; spf=pass (domain: intel.com, ip: 192.55.52.43, 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=1670233080; x=1701769080; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=K1Uzg82NiuMNUf1vRbxNWsv80SImUYYN/t3J94hwqgQ=; b=IN4rCfNotNe6HpxTgHqq/jF4ThmWqEFDwGv/akohT5XIeKbwwAU28ZL/ xMI7dD1deEsCuH9VMohECZaKcb25I7kLzSwPJ5ywWSSyUgOJuWvvbs9aK iQ1qCWFwcv/I3n+8BRHQDOyMzqgn/E9CC2bdKONoiq77Rav76eYXwryi0 bg5FnigCVMRJGMMK9NC1pE5XR4L0j7kGZjmyIxYH3ngWb1L//S7xeJ+xT VZB4UAiANJHDrYPuzPguSLpLBIL78iUJEEjtXu8P7HZV3NvA1VG0KoVeJ dQxmbfUrmn0d0sKsy7NQ5pmpFC32cOWGdMnwG5AJ7UvFMJwPp7u+XnyUs w==; X-IronPort-AV: E=McAfee;i="6500,9779,10551"; a="402581029" X-IronPort-AV: E=Sophos;i="5.96,219,1665471600"; d="scan'208";a="402581029" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2022 01:37:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10551"; a="709195095" X-IronPort-AV: E=Sophos;i="5.96,219,1665471600"; d="scan'208";a="709195095" Received: from fmsmsx602.amr.corp.intel.com ([10.18.126.82]) by fmsmga008.fm.intel.com with ESMTP; 05 Dec 2022 01:37:59 -0800 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx602.amr.corp.intel.com (10.18.126.82) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16; Mon, 5 Dec 2022 01:37:59 -0800 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16 via Frontend Transport; Mon, 5 Dec 2022 01:37:59 -0800 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.16; Mon, 5 Dec 2022 01:37:59 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BqCuNETnkBw4B+tckiCDnqNJDD9kfOwKo6I3y+/MwENXxvf8OcvWyLENGRF7lgGicq1fyfFYpKOHSV90zID/8T5ZPdV2NM80aNRdjuAXw2b5GWNN3MLh0gbegGp7i8RBJYINwJw5HY/LOe7rhHK8GJUKjg8gSBzDZhlP0uFRq8hs+diQB+1+jMeT8lWvVBdMrHEsvogH6hcU9NOvcSYQIBaCocpHAO4Dl6bxk2G3i1FYpI6N3S7XfWnaxySR4CF7+p7F6Ki9Qx9/xexYkuIwPN4Nt7KmgUDHt3n1eTtBBkLtNIElFTldmySgumErkYhg6crLew+VeRmhGz5WdjveFw== 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=oS7DGNqCfsbjiDdL0ZfjzRhCtkVqhWbRQj4u+jL73V4=; b=FJ5bE1dr70h885MFPG05/GFB9nuyj0IqfLwSmH33RQRuhvBbZOkUpdaQqEBhrb7k6lEeExfYjsjdBoBOjW+3B9FcvQtKecLZI0dGMOyoAvbepKoDPWRziaHWnkdMr9Owk01yCzWPJRXOyL2esesPa+pnEB3BIwyp1uyi4yI1fBuK5gUEn7u+TCf/QE5VIVHWOMEOv9TJWmsXD6qeGOcUA+U/yaxvNtBoZQ662lhrVI2TyA2MruVioeMJqH8UX39EpBIXVi1x20Hj7jKrkw3ij3upHAcBU0vRNuAn7ZBOMl0lZfCXd+VwLdMTqmpnoOQd/dLo5yFdHH46v8zavGZBxQ== 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 IA0PR11MB7356.namprd11.prod.outlook.com (2603:10b6:208:432::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5880.14; Mon, 5 Dec 2022 09:37:57 +0000 Received: from MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::69c8:2676:4674:1d2e]) by MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::69c8:2676:4674:1d2e%12]) with mapi id 15.20.5880.014; Mon, 5 Dec 2022 09:37:57 +0000 From: "Ni, Ray" To: "Wu, Jiaxin" , "devel@edk2.groups.io" CC: "Dong, Eric" , "Zeng, Star" Subject: Re: [PATCH v3] UefiCpuPkg: Check SMM Delayed/Blocked AP Count Thread-Topic: [PATCH v3] UefiCpuPkg: Check SMM Delayed/Blocked AP Count Thread-Index: AQHZBHqSgxCjesgswEmvM/0VLVG1mK5fEaSQ Date: Mon, 5 Dec 2022 09:37:56 +0000 Message-ID: References: <20221130051356.13652-1-jiaxin.wu@intel.com> In-Reply-To: <20221130051356.13652-1-jiaxin.wu@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-traffictypediagnostic: MWHPR11MB1631:EE_|IA0PR11MB7356:EE_ x-ms-office365-filtering-correlation-id: 02e0b00e-73d8-4e46-e363-08dad6a46436 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Mxe8Gxi+P9T5nny+wfUmofMrsytd6/ZsYYTqWi4g5UD3yiMhh4iJ7iiW9kv9jz37kOOtAj0aM4IOF1o8/ZhgNgxTh6t1t3qU74wM6UuH/I0w5D1PmI/2aWfufxMlGoCGrwcelZg1fSsm5H1Zo5w8wldrTeE1XIx/LFANT2UrIgh2J8wTHPWG/pWfmoP90aQ6rVZPwDyELTmsI4pdAjqfve9l9cuAMEgbCW/CH/gqRguUZ1FeDgX58yV7QvBGymj477BaDhtEUFPwTOOOpFupugTJ8hVXt/b6xmfXNEkDtF5zIXDTGB0pnCc0ihfMaZczFs6f3EBoefJd2tmBtr5wJvyW5w+zgVu/2WWPbeCKuVJRncgTr5gvcZg8jo2FaV/G52AZ/sr+3Svz6G06qlRdOTJiOwsOiXIotJ6psUPl1gDdR2CB5kSWIzFbN7aDq21c7uqMH6DpY44gKmTw1twWUCzNt8Og//Q3LT5Ms1iX1xtFDWUkPxzGgupC3vN+aA802CuhllJJtenE6mq3bkMqD9Ig0pZNd4xr9Msi2vGibFxkEqlLbosRRO0uMvgjiGAbOlX4QkMI2aXOfTYYZneEEBaq/YpWFWCckIi8ZZDdKmdi05NTbWRDEWTcjmmmKvPXMM5ChslAVK8HynBe5ULIsrIyar8IUep6aH+2wEoBGBjWZsVktjhVwvN+/cQWXc+r62gbc/zWXDxX6TypFPjnZgSl05OGF6n/DMyIhoWDjy8vuOqE0oBNQLX9f2GBe/X+m7TNbWBe2zo3/9SAQzR6og== 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:(13230022)(346002)(39860400002)(396003)(366004)(136003)(376002)(451199015)(7696005)(6506007)(26005)(186003)(54906003)(53546011)(71200400001)(316002)(9686003)(966005)(107886003)(76116006)(478600001)(66446008)(64756008)(110136005)(4326008)(66476007)(66946007)(66556008)(8676002)(83380400001)(15650500001)(30864003)(8936002)(52536014)(5660300002)(2906002)(41300700001)(122000001)(82960400001)(38100700002)(38070700005)(33656002)(55016003)(86362001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?HYGwwS1fQZD4IHmfv/tntS3zzm687QzIgWo3CJUJjdCiyXmux+YrE2LJ7F+c?= =?us-ascii?Q?yxHc7hlM4SmKCkk33nEsIrF4m8B5FuVi9a9ntPqgDAYDXaYOpSABFLkmEXc7?= =?us-ascii?Q?KP/DBVgeI8NrqtcuxRrF2uosCUV+XdrwD/HQG4pYpvOFjoggxLl8DLaDSzng?= =?us-ascii?Q?V+9IJfbgOYwU3r2W89zGpKeF03HXkXc1+bf8XJQWiVlHEe5NT8UygsQu5pRm?= =?us-ascii?Q?4QejDgmp+ZHNr85zO4p9wte6wFvNZ7JN2qyyv0P1eNi2eZzH5QXnxfVHBxMD?= =?us-ascii?Q?DYgae55wXSoKHySzTURbz/e9fKgrd2hGvxjRSBwrZl+B0TFRNIPX4W5PuyO7?= =?us-ascii?Q?LUZf1qJeLHzkcDB6RzfmVcRzQdEuaas1Akqsz7qwmyv0OTzha7xVuoI00lUJ?= =?us-ascii?Q?l86IwVDxUG1i1K8lpm6jBagu8Jo7X6CT/Yc4H9yMNsFmsShkiWmqteV4ed5b?= =?us-ascii?Q?c/UKX6yYhy9rxYu4Gh32qp2ClgVe3PVT8x0NL+jCNHXD0itSA9Mjf5xJxVHL?= =?us-ascii?Q?KCv8y1z4PhaH4G/i1WCcZYnUFNKEKi1JUim0k8AfRlmrKIEaVpNmYTERKdKX?= =?us-ascii?Q?U3nce6teZYDfY7YzqwnQp99r6cJ6M9MLsEcg6SV4fTfMZdQHdDwHlvco9i9N?= =?us-ascii?Q?41nG6CxMD+s8XcQjX7sE0gKsD+gCJYuIap3VZ5IgY/grVdjGA0yWAQTe+EPt?= =?us-ascii?Q?Uk+GltymHFXraCCHJhWi/c2N75g8JNMSwx8oylk84rUsvNsjs+2GmRK7OHZ2?= =?us-ascii?Q?DwN7YpNWxYGn9QU6s/k50Drzr7sMxKnw/122AAm+x60Drhsx7Y82b1Q6o/Tg?= =?us-ascii?Q?52+xP9hjT3W4k4vDaazPqplN32gYq3/1y9F2QTWL8TcUw/fkxxO8KLyNq7Vr?= =?us-ascii?Q?/P6ZXQAHOSYfsngIQbIaj0KtgwzIK1ecLjxkW3UgOVfS0aaYlvF3bVGc9365?= =?us-ascii?Q?hm+MoLaDPiZ28msDKfkaOT7B1dRE5r6A/tIqS4enWaWmT/9OPOTnlFfUcT53?= =?us-ascii?Q?wYYfmzNqUbqiCbzWuqkGiHltlSx0BqShenXLBGg4qSD1CrHFUE7pXmwL/PpH?= =?us-ascii?Q?CtugImi8N3Jf6+4PhBCaitKf+S3lWEquUbZEt9AWcQE+qm5WRcSnts2qXVwX?= =?us-ascii?Q?jMHvl0zGg587bjEZ5j/C++wELEKrb/ma/jJpbw7ABgVhLsJTZ000pxQmCsau?= =?us-ascii?Q?az0KloYj5gi3HYOrseJeumpqPgo8Av1Z7olA0qLDhK+Dve9J6Ywgk7S09jhR?= =?us-ascii?Q?4t4OUlyg6pZXQPMpiPGOyy9NQWdoVJarDxEtRPaZhUd+ypCramQZbLNaOnR0?= =?us-ascii?Q?NjldldokK88Qcqffef8ZotilHwiui6KIqAgiSw3UA9wQZMtRYd6KtPPRtesp?= =?us-ascii?Q?QKC339mfSxYTj6fKhAk6CeIey+AtQuKtwsWWxIGPeFR1dL9adSUE3/Fk8JBT?= =?us-ascii?Q?jfStTs2HjetSAh97y+JPFFJODOXPKRJoj24D1/tVfQwQgg5jHFC8ajpo9Mtg?= =?us-ascii?Q?b/Rr7pQ3G+G2mR127Ydp1Wm6aaUQE8cz0KuNrLZTaZbI8MmaWpqR4uCIR8S8?= =?us-ascii?Q?mQW4kARlXc5wzUiqxhKKHV4uFlMMvz338XsjHHNj?= 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: 02e0b00e-73d8-4e46-e363-08dad6a46436 X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Dec 2022 09:37:57.0177 (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: a7/T9QGMiQPjjKdsyBFnyloQb6FM5s+DruwVMEq9OhXB6Sut3STouGo9OuNmZHh0Eg5lROKN5ce9hKXeF0h28A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR11MB7356 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 Reviewed-by: Ray Ni > -----Original Message----- > From: Wu, Jiaxin > Sent: Wednesday, November 30, 2022 1:14 PM > To: devel@edk2.groups.io > Cc: Dong, Eric ; Ni, Ray ; Zeng, S= tar > > Subject: [PATCH v3] UefiCpuPkg: Check SMM Delayed/Blocked AP Count >=20 > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4173 >=20 > Due to more core count increasement, it's hard to reflect all APs > state via AP bitvector support in the register. Actually, SMM CPU > driver doesn't need to check each AP state to know all CPUs in SMI > or not, one alternative method is to check the SMM Delayed & Blocked > AP Count number: >=20 > APs in SMI + Blocked Count + Disabled Count >=3D All supported Aps > (code comments explained why can be > All supported Aps) >=20 > With above change, the returned value of "SmmRegSmmEnable" & > "SmmRegSmmDelayed" & "SmmRegSmmBlocked" from SmmCpuFeaturesLib > should be the AP count number within the existing CPU package. >=20 > For register that return the bitvector state, require > SmmCpuFeaturesGetSmmRegister() returns count number of all bit per > logical processor within the same package. >=20 > For register that return the AP count, require > SmmCpuFeaturesGetSmmRegister() returns the register value directly. >=20 > v3: > - Refine the coding style >=20 > v2: > - Rename "mPackageBspInfo" to "mPackageFirstThreadIndex" > - Clarify the expected value of "SmmRegSmmEnable" & > "SmmRegSmmDelayed" & > "SmmRegSmmBlocked" returned from SmmCpuFeaturesLib. > - Thread: https://edk2.groups.io/g/devel/message/96722 >=20 > v1: > - Thread: https://edk2.groups.io/g/devel/message/96671 >=20 > Cc: Eric Dong > Cc: Ray Ni > Cc: Zeng Star > Signed-off-by: Jiaxin Wu > --- > UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c | 195 > +++++++++++++++++++++++++---- > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 5 + > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 16 ++- > 3 files changed, 184 insertions(+), 32 deletions(-) >=20 > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > index c79da418e3..a0967eb69c 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > @@ -22,10 +22,15 @@ UINTN mSemaphoreSize; > SPIN_LOCK *mPFLock =3D NULL; > SMM_CPU_SYNC_MODE mCpuSmmSyncMode; > BOOLEAN mMachineCheckSupported =3D FALSE; > MM_COMPLETION mSmmStartupThisApToken; >=20 > +// > +// Processor specified by mPackageFirstThreadIndex[PackageIndex] will do > the package-scope register check. > +// > +UINT32 *mPackageFirstThreadIndex =3D NULL; > + > extern UINTN mSmmShadowStackSize; >=20 > /** > Performs an atomic compare exchange operation to get semaphore. > The compare exchange operation must be performed using > @@ -155,54 +160,129 @@ ReleaseAllAPs ( > } > } > } >=20 > /** > - Checks if all CPUs (with certain exceptions) have checked in for this = SMI run > + Check whether the index of CPU perform the package level register > + programming during System Management Mode initialization. >=20 > - @param Exceptions CPU Arrival exception flags. > + The index of Processor specified by > mPackageFirstThreadIndex[PackageIndex] > + will do the package-scope register programming. >=20 > - @retval TRUE if all CPUs the have checked in. > - @retval FALSE if at least one Normal AP hasn't checked in. > + @param[in] CpuIndex Processor Index. > + > + @retval TRUE Perform the package level register programming. > + @retval FALSE Don't perform the package level register programming. >=20 > **/ > BOOLEAN > -AllCpusInSmmWithExceptions ( > - SMM_CPU_ARRIVAL_EXCEPTIONS Exceptions > +IsPackageFirstThread ( > + IN UINTN CpuIndex > ) > { > - UINTN Index; > - SMM_CPU_DATA_BLOCK *CpuData; > - EFI_PROCESSOR_INFORMATION *ProcessorInfo; > + UINT32 PackageIndex; >=20 > - ASSERT (*mSmmMpSyncData->Counter <=3D mNumberOfCpus); > + PackageIndex =3D gSmmCpuPrivate- > >ProcessorInfo[CpuIndex].Location.Package; >=20 > - if (*mSmmMpSyncData->Counter =3D=3D mNumberOfCpus) { > - return TRUE; > + ASSERT (mPackageFirstThreadIndex !=3D NULL); > + > + // > + // Set the value of mPackageFirstThreadIndex[PackageIndex]. > + // The package-scope register are checked by the first processor > (CpuIndex) in Package. > + // > + // If mPackageFirstThreadIndex[PackageIndex] equals to (UINT32)-1, the= n > update > + // to current CpuIndex. If it doesn't equal to (UINT32)-1, don't chang= e it. > + // > + if (mPackageFirstThreadIndex[PackageIndex] =3D=3D (UINT32)-1) { > + mPackageFirstThreadIndex[PackageIndex] =3D (UINT32)CpuIndex; > } >=20 > - CpuData =3D mSmmMpSyncData->CpuData; > - ProcessorInfo =3D gSmmCpuPrivate->ProcessorInfo; > - for (Index =3D 0; Index < mMaxNumberOfCpus; Index++) { > - if (!(*(CpuData[Index].Present)) && (ProcessorInfo[Index].ProcessorI= d !=3D > INVALID_APIC_ID)) { > - if (((Exceptions & ARRIVAL_EXCEPTION_DELAYED) !=3D 0) && > (SmmCpuFeaturesGetSmmRegister (Index, SmmRegSmmDelayed) !=3D 0)) { > - continue; > - } > + return (BOOLEAN)(mPackageFirstThreadIndex[PackageIndex] =3D=3D > CpuIndex); > +} > + > +/** > + Returns the Number of SMM Delayed & Blocked & Disabled Thread Count. > + > + @param[in,out] DelayedCount The Number of SMM Delayed Thread > Count. > + @param[in,out] BlockedCount The Number of SMM Blocked Thread > Count. > + @param[in,out] DisabledCount The Number of SMM Disabled Thread > Count. > + > +**/ > +VOID > +GetSmmDelayedBlockedDisabledCount ( > + IN OUT UINT32 *DelayedCount, > + IN OUT UINT32 *BlockedCount, > + IN OUT UINT32 *DisabledCount > + ) > +{ > + UINTN Index; >=20 > - if (((Exceptions & ARRIVAL_EXCEPTION_BLOCKED) !=3D 0) && > (SmmCpuFeaturesGetSmmRegister (Index, SmmRegSmmBlocked) !=3D 0)) { > - continue; > + for (Index =3D 0; Index < mNumberOfCpus; Index++) { > + if (IsPackageFirstThread (Index)) { > + if (DelayedCount !=3D NULL) { > + *DelayedCount +=3D (UINT32)SmmCpuFeaturesGetSmmRegister (Index, > SmmRegSmmDelayed); > } >=20 > - if (((Exceptions & ARRIVAL_EXCEPTION_SMI_DISABLED) !=3D 0) && > (SmmCpuFeaturesGetSmmRegister (Index, SmmRegSmmEnable) !=3D 0)) { > - continue; > + if (BlockedCount !=3D NULL) { > + *BlockedCount +=3D (UINT32)SmmCpuFeaturesGetSmmRegister (Index, > SmmRegSmmBlocked); > } >=20 > - return FALSE; > + if (DisabledCount !=3D NULL) { > + *DisabledCount +=3D (UINT32)SmmCpuFeaturesGetSmmRegister (Index, > SmmRegSmmEnable); > + } > } > } > +} >=20 > - return TRUE; > +/** > + Checks if all CPUs (except Blocked & Disabled) have checked in for thi= s SMI > run > + > + @retval TRUE if all CPUs the have checked in. > + @retval FALSE if at least one Normal AP hasn't checked in. > + > +**/ > +BOOLEAN > +AllCpusInSmmExceptBlockedDisabled ( > + VOID > + ) > +{ > + UINT32 BlockedCount; > + UINT32 DisabledCount; > + > + BlockedCount =3D 0; > + DisabledCount =3D 0; > + > + // > + // Check to make sure mSmmMpSyncData->Counter is valid and not > locked. > + // > + ASSERT (*mSmmMpSyncData->Counter <=3D mNumberOfCpus); > + > + // > + // Check whether all CPUs in SMM. > + // > + if (*mSmmMpSyncData->Counter =3D=3D mNumberOfCpus) { > + return TRUE; > + } > + > + // > + // Check for the Blocked & Disabled Exceptions Case. > + // > + GetSmmDelayedBlockedDisabledCount (NULL, &BlockedCount, > &DisabledCount); > + > + // > + // *mSmmMpSyncData->Counter might be updated by all APs > concurrently. The value > + // can be dynamic changed. If some Aps enter the SMI after the > BlockedCount & > + // DisabledCount check, then the *mSmmMpSyncData->Counter will be > increased, thus > + // leading the *mSmmMpSyncData->Counter + BlockedCount + > DisabledCount > mNumberOfCpus. > + // since the BlockedCount & DisabledCount are local variable, it's ok = here > only for > + // the checking of all CPUs In Smm. > + // > + if (*mSmmMpSyncData->Counter + BlockedCount + DisabledCount >=3D > mNumberOfCpus) { > + return TRUE; > + } > + > + return FALSE; > } >=20 > /** > Has OS enabled Lmce in the MSR_IA32_MCG_EXT_CTL >=20 > @@ -266,10 +346,15 @@ SmmWaitForApArrival ( > { > UINT64 Timer; > UINTN Index; > BOOLEAN LmceEn; > BOOLEAN LmceSignal; > + UINT32 DelayedCount; > + UINT32 BlockedCount; > + > + DelayedCount =3D 0; > + BlockedCount =3D 0; >=20 > ASSERT (*mSmmMpSyncData->Counter <=3D mNumberOfCpus); >=20 > LmceEn =3D FALSE; > LmceSignal =3D FALSE; > @@ -294,11 +379,11 @@ SmmWaitForApArrival ( > // > for (Timer =3D StartSyncTimer (); > !IsSyncTimerTimeout (Timer) && !(LmceEn && LmceSignal); > ) > { > - mSmmMpSyncData->AllApArrivedWithException =3D > AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | > ARRIVAL_EXCEPTION_SMI_DISABLED); > + mSmmMpSyncData->AllApArrivedWithException =3D > AllCpusInSmmExceptBlockedDisabled (); > if (mSmmMpSyncData->AllApArrivedWithException) { > break; > } >=20 > CpuPause (); > @@ -335,19 +420,27 @@ SmmWaitForApArrival ( > // > for (Timer =3D StartSyncTimer (); > !IsSyncTimerTimeout (Timer); > ) > { > - mSmmMpSyncData->AllApArrivedWithException =3D > AllCpusInSmmWithExceptions (ARRIVAL_EXCEPTION_BLOCKED | > ARRIVAL_EXCEPTION_SMI_DISABLED); > + mSmmMpSyncData->AllApArrivedWithException =3D > AllCpusInSmmExceptBlockedDisabled (); > if (mSmmMpSyncData->AllApArrivedWithException) { > break; > } >=20 > CpuPause (); > } > } >=20 > + if (!mSmmMpSyncData->AllApArrivedWithException) { > + // > + // Check for the Blocked & Delayed Case. > + // > + GetSmmDelayedBlockedDisabledCount (&DelayedCount, &BlockedCount, > NULL); > + DEBUG ((DEBUG_INFO, "SmmWaitForApArrival: Delayed AP Count =3D %d, > Blocked AP Count =3D %d\n", DelayedCount, BlockedCount)); > + } > + > return; > } >=20 > /** > Replace OS MTRR's with SMI MTRR's. > @@ -737,10 +830,11 @@ APHandler ( > // BSP timeout in the first round > // > if (mSmmMpSyncData->BspIndex !=3D -1) { > // > // BSP Index is known > + // Existing AP is in SMI now but BSP not in, so, try bring BSP in = SMM. > // > BspIndex =3D mSmmMpSyncData->BspIndex; > ASSERT (CpuIndex !=3D BspIndex); >=20 > // > @@ -761,16 +855,19 @@ APHandler ( >=20 > if (!(*mSmmMpSyncData->InsideSmm)) { > // > // Give up since BSP is unable to enter SMM > // and signal the completion of this AP > + // Reduce the mSmmMpSyncData->Counter! > + // > WaitForSemaphore (mSmmMpSyncData->Counter); > return; > } > } else { > // > // Don't know BSP index. Give up without sending IPI to BSP. > + // Reduce the mSmmMpSyncData->Counter! > // > WaitForSemaphore (mSmmMpSyncData->Counter); > return; > } > } > @@ -1666,14 +1763,17 @@ SmiRendezvous ( > // > goto Exit; > } else { > // > // Signal presence of this processor > + // mSmmMpSyncData->Counter is increased here! > + // "ReleaseSemaphore (mSmmMpSyncData->Counter) =3D=3D 0" means BSP > has already ended the synchronization. > // > if (ReleaseSemaphore (mSmmMpSyncData->Counter) =3D=3D 0) { > // > // BSP has already ended the synchronization, so QUIT!!! > + // Existing AP is too late now to enter SMI since BSP has already = ended > the synchronization!!! > // >=20 > // > // Wait for BSP's signal to finish SMI > // > @@ -1781,10 +1881,51 @@ Exit: > // Restore Cr2 > // > RestoreCr2 (Cr2); > } >=20 > +/** > + Initialize PackageBsp Info. Processor specified by > mPackageFirstThreadIndex[PackageIndex] > + will do the package-scope register programming. Set default CpuIndex t= o > (UINT32)-1, which > + means not specified yet. > + > +**/ > +VOID > +InitPackageFirstThreadIndexInfo ( > + VOID > + ) > +{ > + UINT32 Index; > + UINT32 PackageId; > + UINT32 PackageCount; > + > + PackageId =3D 0; > + PackageCount =3D 0; > + > + // > + // Count the number of package, set to max PackageId + 1 > + // > + for (Index =3D 0; Index < mNumberOfCpus; Index++) { > + if (PackageId < gSmmCpuPrivate->ProcessorInfo[Index].Location.Packag= e) > { > + PackageId =3D gSmmCpuPrivate->ProcessorInfo[Index].Location.Packag= e; > + } > + } > + > + PackageCount =3D PackageId + 1; > + > + mPackageFirstThreadIndex =3D (UINT32 *)AllocatePool (sizeof (UINT32) * > PackageCount); > + ASSERT (mPackageFirstThreadIndex !=3D NULL); > + if (mPackageFirstThreadIndex =3D=3D NULL) { > + return; > + } > + > + // > + // Set default CpuIndex to (UINT32)-1, which means not specified yet. > + // > + SetMem32 (mPackageFirstThreadIndex, sizeof (UINT32) * PackageCount, > (UINT32)-1); > +} > + > /** > Allocate buffer for SpinLock and Wrapper function buffer. >=20 > **/ > VOID > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c > index 40aabeda72..37e3cfc449 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c > @@ -1043,10 +1043,15 @@ PiCpuSmmEntry ( > // > // Initialize global buffer for MM MP. > // > InitializeDataForMmMp (); >=20 > + // > + // Initialize Package First Thread Index Info. > + // > + InitPackageFirstThreadIndexInfo (); > + > // > // Install the SMM Mp Protocol into SMM protocol database > // > Status =3D gSmst->SmmInstallProtocolInterface ( > &mSmmCpuHandle, > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > index ef8bf5947d..0bfba7e359 100644 > --- a/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > +++ b/UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h > @@ -192,15 +192,10 @@ typedef struct { >=20 > #define EXCEPTION_VECTOR_NUMBER 0x20 >=20 > #define INVALID_APIC_ID 0xFFFFFFFFFFFFFFFFULL >=20 > -typedef UINT32 SMM_CPU_ARRIVAL_EXCEPTIONS; > -#define ARRIVAL_EXCEPTION_BLOCKED 0x1 > -#define ARRIVAL_EXCEPTION_DELAYED 0x2 > -#define ARRIVAL_EXCEPTION_SMI_DISABLED 0x4 > - > // > // Wrapper used to convert EFI_AP_PROCEDURE2 and EFI_AP_PROCEDURE. > // > typedef struct { > EFI_AP_PROCEDURE Procedure; > @@ -1460,10 +1455,21 @@ EFI_STATUS > RegisterStartupProcedure ( > IN EFI_AP_PROCEDURE Procedure, > IN OUT VOID *ProcedureArguments OPTIONAL > ); >=20 > +/** > + Initialize PackageBsp Info. Processor specified by > mPackageFirstThreadIndex[PackageIndex] > + will do the package-scope register programming. Set default CpuIndex t= o > (UINT32)-1, which > + means not specified yet. > + > +**/ > +VOID > +InitPackageFirstThreadIndexInfo ( > + VOID > + ); > + > /** > Allocate buffer for SpinLock and Wrapper function buffer. >=20 > **/ > VOID > -- > 2.16.2.windows.1