From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mx.groups.io with SMTP id smtpd.web10.11197.1670233021271416636 for ; Mon, 05 Dec 2022 01:37:01 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=LD5Vli1Z; spf=pass (domain: intel.com, ip: 134.134.136.100, 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=1670233021; x=1701769021; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=sie/tJblO8Z35hPIhjgbnJiXZD82dMLzEaQ4emV7GIY=; b=LD5Vli1ZOkTDc+7B40CKvQ6P0I3p31A4lP/WzUic6yLzGiqYCuZQAGpr eZ8nev3gyHF1nhsRwIGgrIZeCKe+c1v0M8jxr238VMbunP9UmxlQ6NWV9 vqwJ1oQAxsAmWAk60Grsq7I+qREodBSosXwb73UxRUpXRtc9OcQTrRHAp L1jU5x1PxbA+sxEcR4sIfvspLLxcf4wOrM8iHiNYbJRTczu8jrsTYc2zA JZOqpPzLWnRjhdpeSSL3lX1eRd0s25c27TMYJj1TV6SwgwlJv3GBJfY3h MecSurG2eO4lYNs3pzQrQnhuwW+xsaWq+HKGbImE0KW42BRVod+x0AYtx g==; X-IronPort-AV: E=McAfee;i="6500,9779,10551"; a="380599636" X-IronPort-AV: E=Sophos;i="5.96,219,1665471600"; d="scan'208";a="380599636" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2022 01:37:00 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10551"; a="639424393" X-IronPort-AV: E=Sophos;i="5.96,219,1665471600"; d="scan'208";a="639424393" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orsmga007.jf.intel.com with ESMTP; 05 Dec 2022 01:36:58 -0800 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx603.amr.corp.intel.com (10.18.126.83) 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:36:54 -0800 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) 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; Mon, 5 Dec 2022 01:36:53 -0800 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx610.amr.corp.intel.com (10.18.126.90) 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:36:53 -0800 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169) 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.2507.16; Mon, 5 Dec 2022 01:36:51 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A+Iq9iovIalGbDrSJAvOez1Xz79eM7/2os06TIbsr5dKQMMLnO821rheDLqNRKyeitDGvMyeVYuBydTxY/K6j+y230dRlN3QVkS2Hoaz7l05TJPcPfi34bLEHZqVTrROqLw7vr4iVaBXDdpV4j76Ozk5udhdQj7mTqlx7XyIAxXgI5BHA+I91Kp559VQ7PdozrSKU8A2B8Sz8baMRQUoqnrJmh4akNF84IDVRy8BHsJsadWoTvNH2rYjxa3nRW0bsxbekF2XEdfmH6HZ6OQvCrZUqdfcHcF+yANkjCGh6bO7HP5GctMGL97K3kSEQc0ORnRsQqp3retJ6oQDm3aADw== 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=8n7BJpkMwwZqRAC7Dst89J1CUAw834Hwd5f9KCa4ZYA=; b=O/X2/Tbg9fwWgMXUe95/DdizL6PKT5lGgykgTbf91hr5URMSkKh30Qz2L/gTdXYB1aYh1RfVxzRSU9mmpb75fl2cxPRcdqvCdmWlaF2ayp2de6LaXQmjmRFR3bmFdYA9C6ocCjgRc3PMB71zEWUkz8Zn2j9x/f6BwGlIIVdaXq6g4IODwi7GlrGU7Mj719ppOvL4WlHkOknwCKGuuJLTVJJOJL1R0jHVIit6qCigNE/dm0dhyQpbjzRsRS8x7uNykoCD+k/wpkE2KRwJN4msvleIBQYN1ghG1uhJgc0iEKR1d9fOJze/zHUjDTZdXIqOMXB1Dr9Wlql92ilkkTiXFQ== 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:36:49 +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:36:49 +0000 From: "Ni, Ray" To: "Wu, Jiaxin" , "devel@edk2.groups.io" CC: "Dong, Eric" , "Zeng, Star" Subject: Re: [PATCH v2] UefiCpuPkg: Check SMM Delayed/Blocked AP Count Thread-Topic: [PATCH v2] UefiCpuPkg: Check SMM Delayed/Blocked AP Count Thread-Index: AQHZBGtqemZlPqq4V06BUKBWa9WXFK5fEVrQ Date: Mon, 5 Dec 2022 09:36:49 +0000 Message-ID: References: <20221130032523.5272-1-jiaxin.wu@intel.com> In-Reply-To: <20221130032523.5272-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: 9e68d14a-081b-45f5-24db-08dad6a43bb9 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: pX9JuYOm6SoTgRLGS/pE0k+A6PdZ4pHrU0nofy6hjTxfd0VuR/1G91J+GtdcIW6BtVv1DURTjj7W7IvBHi+aAkVjIiKOrj28UkvuHDFSm48vOiUrblTa6tl/s7AAkLLG+s+tTH+303+n2Y0s4zJ7j+vkG6FKgcpMinQGrmk8CkZsgGNxoGoVRUjLsjvspWxahsYeHgNwftkpeu/seUidyuZu6XKL6J6LXU317ki49n4XbA1VM7b5qfzXtVznjVakXXN1vq5BCiVgoDG2pT4U9hAUs9xw3mM6rnnWngUbfr6gDTLpJAzOJfrP2FCU+dPVe0kODqaRRa4tvIpkE6BEGyBNg8XEBNwI2f+VJdzT7EhryFtyNP7VLSNpf95iB0bIwvH7p1FohMaFuEHVIhdr7iWTWaOLVgERnKypws4OZCsOZhSBJEF3C0egADNJVZnKDieRvEO/6X/ARR71baaxbCKMmdgq/6oQZl2GfZ+6AKpy2W/doypHX3ZvL4/+p1CjTiXh/QlDnWlmYJj8RzhIWPWJFuPjdA4RauQi+Q3tGdqahLbB3Ccu+JNFFMpBjjx0ltXr7bxmuEwM9OnYRZhc1X3Jvji4zmrHe8Xc7dbhBeY4lu0n0iocB5aOKN06NpZG6OHNkhlM8I3gS036PMZGlVaVw1T9FUUl/L/YWgOTVmnsaiWID9RvBo5lL2nynpQ+mm3tA0zJ2d61sB5N9WtnfqsCuseCdHxbPjuVhM6NRew/FOnjMDTQgz0mgPFMQERpNUZvobgmvvBXGGCKJ2mAYg== 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?1wPINdr6Qpo2XIdfwkoj0apA3CahxeGZQgKQNrkvFPjXXoa90a9pIChMh3FM?= =?us-ascii?Q?prbzxvpePhELRyN0IwCgSWdAJTWClSIwKIrc/6a2gyNq3z9+Qr91cttKhB9q?= =?us-ascii?Q?Sedhdt21H27A5LGCUBprb0q4KdL1JaGkTjr0qcQQHNEH740HF0BbjqvUUYPw?= =?us-ascii?Q?HZOASX2LEnQ8gy2nQaG1slUGG5RF5z1B3HZxUr4bGf+BI9wrJOcBXxAfkglA?= =?us-ascii?Q?SxISVh23wtZl95plwtzosDUkx3b1djNhYBS8NjEbqWYnp0VftAiZUhJOQr79?= =?us-ascii?Q?ofgFco0XEpVZrUFY9C/+HRINc/K9OC2NCgUmDLo7GqxSlvUIyrVBuxgj/Jxs?= =?us-ascii?Q?fgW57M2Mf5ehuvSk0pp31Z3C6+tVZ/2RLC46evSuSnddxEXVZySa5gA0eLpp?= =?us-ascii?Q?V/wJWOz8Y0Yvyza/yai4S41wwRjjkubHSAn10O5t9og5jHCw77AWCye22WD1?= =?us-ascii?Q?sWWqkSIcwZGafMNs7bHqM2DEkGgImQj8OnZCJJY093GQ017/r7V+CApFRqIX?= =?us-ascii?Q?QfzONAGojIkQlw5brfGS+sq01Qd66yidGvca/Br2i2dCSOgbb0S+hfr4rVEq?= =?us-ascii?Q?yvZbWsUIzsN0NbgVGK9oYBOWchKAoTLtSD4tUpvz1GSq+y3GvEghkV0rmDKz?= =?us-ascii?Q?W9ZdhhXqXfymWZXnuQHvyddnROxx8ApaM8k0Wz6/dLDOA/ICDMB0nRf8ms0t?= =?us-ascii?Q?eL993mpj4Kh6Xbke3ReAcNpIDEzX0p/RPCkeOIYgTfnl7oQwu75fUdvGAoCl?= =?us-ascii?Q?8qqcWSgplArjj93WEH5mPPsCV8xitTgzNq9GKheWNE5xAYXw+0flQethYG55?= =?us-ascii?Q?0jD4WbhOsef0Fl66EuTLNvsupOPzW+Tt0WpTazYrLp8Ma+Thb2TanhG6Sov/?= =?us-ascii?Q?Vn39ev1iS9g8OJZlxCoD6/JmHp3SOdvWXFRGy9IgTqX4BsNECEaxDUF7eK7Q?= =?us-ascii?Q?tuTLRrl8gQWkWnF9w53/XtsXaX8GkU/birWOLZq1jL5x7ZqPXll/HPg+1xxs?= =?us-ascii?Q?Lwq3jAEZf+QTvEhC7gLo2VTK18WncYzgiaBSCCb91kmpA4z3vE6VxEf1FGeT?= =?us-ascii?Q?gKMO9rT/GhlZh/ky/LHAPiPGXQwzwmTwW5pr1jBXbuiUsVnh/7sZDqfg/AsW?= =?us-ascii?Q?LiL3jQJM3MWrA1Rlg7Ws5IyrgNJHDIUG5Zm+69vHY0SOU7YoYLnJCDgH8m/B?= =?us-ascii?Q?O9EZJ9myQKUBrSKrd4I0qwfImSMhp8w6EMFrT6dEgU8oR33uTxw6Q+l/CqvI?= =?us-ascii?Q?ga1yUqnvwP6X2Zq5XHtOe+mlNZcHKENzJvvCnJEv9bl+yiE0BuEqxTG2WJ9S?= =?us-ascii?Q?GYI45Tm+5vgrpus11QX45amjNpxItWMLCZC1aXrO3WoUte06RHmn+cCBSfAs?= =?us-ascii?Q?OmDNp0qdjqhefe8sLjPu0B8jB7utNQdY2wAzYNnK69WSKSftnL03b5PCz/cZ?= =?us-ascii?Q?yImNLrgrOwxo2iUeOl+ZzeQkeWXEambVPgyslwRz8tV62YOZmuJnorrRKFEV?= =?us-ascii?Q?1wlVCOyA7QmHjfUGFIEdi4w4mEAMIp4B+H2QeFjBSuDFhgsbmnDSqEN067CE?= =?us-ascii?Q?0llyhyjIU4PZ4gAOyyyN1ZYkePmInC9UNAJZqSmh?= 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: 9e68d14a-081b-45f5-24db-08dad6a43bb9 X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Dec 2022 09:36:49.0847 (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: N+V8jp8CBjwyvCFFL1/+1sEDhrhtUu0pSDycdLKwjy9vhro7jHHEBmWqD5jt7usbxFudI0eZnOYTonfgZbQbgQ== 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 11:25 AM > To: devel@edk2.groups.io > Cc: Dong, Eric ; Ni, Ray ; Zeng, S= tar > > Subject: [PATCH v2] 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 > v2: > - Rename "mPackageBspInfo" to "mPackageFirstThreadIndex" > - Clarify the expected value of "SmmRegSmmEnable" & > "SmmRegSmmDelayed" & > "SmmRegSmmBlocked" returned from SmmCpuFeaturesLib. >=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 | 193 > +++++++++++++++++++++++++---- > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.c | 5 + > UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.h | 16 ++- > 3 files changed, 182 insertions(+), 32 deletions(-) >=20 > diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > b/UefiCpuPkg/PiSmmCpuDxeSmm/MpService.c > index c79da418e3..c7c1e37d76 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,128 @@ 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. > + @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. >=20 > - if (((Exceptions & ARRIVAL_EXCEPTION_BLOCKED) !=3D 0) && > (SmmCpuFeaturesGetSmmRegister (Index, SmmRegSmmBlocked) !=3D 0)) { > - continue; > + @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; > + > + 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 +345,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 +378,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 +419,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 +829,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 +854,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 +1762,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 +1880,50 @@ 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