From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web12.21523.1661416086711650211 for ; Thu, 25 Aug 2022 01:28:07 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=Ep/ADBiY; spf=pass (domain: intel.com, ip: 192.55.52.136, 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=1661416086; x=1692952086; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=1CPy2s1u9ywdxKqYv+qcz4XCsBXxKHENbdlGX0m+wkA=; b=Ep/ADBiYSb58qABPjM3iPhTeXny6cRCvV3jXuQyfEJtFfIeW465k696G hgl5trEOEhJ4jmxDYxcryeb0bHsxSVCRLN7aPf/HuKgFMJ4EnnSNZ1+bK BzkzlS5eG9srInmbzpXxvmK5+a4OPApM+PWp5JazDthk0nAGrKatkuRed cBXVEZiB/yNQHcMYv8eYGCHBq7I0nB1jSXA+VSIHf7WmVUvEf47S/M/QG OKdT5mwjYcShGaHcG/0skONWDrm9WvC3C23XOH45I3na+kbuR6WHW8XwU AIAD3iysskEi0enxS4BRUUntI7Deiuddr6NPvOXOighLzttyCN437e/tC A==; X-IronPort-AV: E=McAfee;i="6500,9779,10449"; a="273935745" X-IronPort-AV: E=Sophos;i="5.93,262,1654585200"; d="scan'208";a="273935745" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Aug 2022 01:28:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,262,1654585200"; d="scan'208";a="643172038" Received: from fmsmsx601.amr.corp.intel.com ([10.18.126.81]) by orsmga001.jf.intel.com with ESMTP; 25 Aug 2022 01:28:03 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx601.amr.corp.intel.com (10.18.126.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 25 Aug 2022 01:28:03 -0700 Received: from fmsmsx607.amr.corp.intel.com (10.18.126.87) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Thu, 25 Aug 2022 01:28:02 -0700 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx607.amr.corp.intel.com (10.18.126.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31 via Frontend Transport; Thu, 25 Aug 2022 01:28:02 -0700 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.175) 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.2375.31; Thu, 25 Aug 2022 01:28:02 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dJ50qem8xuik13d7JOiuolxQQXbOXSTyxba05IlOzD8O+d+gyI6+1C5nDj1gJg7oHfmhrCo3PYdxaaI1huVNRJUYl4Pj2d67yqAd6AtFtFACOdDKALJNhdhMJw8h8ZixEWMgGi3Z2yClD2hqu8pDsfkOBUH2vRyHm5BpyJPHD/AkgviWy/d1VOXwesoAtArCzb0ieqzZYSbE+nM0HS3FQ1UWBuSn+nIRPQ7jpIpsnRxhLjZL9UtuhoQ6vjV3ur6V+WdqPpbjNycilUUkdb9T+p40+/2cpekKkbALd4WU848ZM7VD+CdRV/vm/alfmk/sPidilZ+uJ85XAGIoRB8ATg== 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=VPq2LkYtulvy06+EBx+jBsVuGtDvvq7dwLFgEq90NBw=; b=MglMDJKq6Cxk8tcLx3yRwDENNoLmcxPjticPajzqHHF0YlaH9hoc7PWPaST0AHjWCH4UdgGzJvSspKK/bc6fzocA8ooP2LSERh3vf9T4mez6yYXCQjNNLAUZJVCpAd1ea8FegT2zUGgrAFWaAupm/WvoFWEQ0hMS8wDS/LdIurQpScXhjJMXBreZqwryZDsLBlp33691VPnyV38YaokoAUzh6vP+tlNSt5kuKOf0JIavJWR4WQM1FdbdhpcFp/dZ79CHkcGkRvNYB3eyfSoiPkaMYk+XrNYpQLhsbPdSARDhCcSOfU1ASW7ILphJaUHTJ0EFCiwf5C4r/0BQ5ilyNw== 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 MWHPR11MB1774.namprd11.prod.outlook.com (2603:10b6:300:10a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5566.15; Thu, 25 Aug 2022 08:28:00 +0000 Received: from MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::958b:cc9d:ac3:288a]) by MWHPR11MB1631.namprd11.prod.outlook.com ([fe80::958b:cc9d:ac3:288a%10]) with mapi id 15.20.5566.015; Thu, 25 Aug 2022 08:28:00 +0000 From: "Ni, Ray" To: "Xie, Yuanhao" , "devel@edk2.groups.io" CC: "Dong, Eric" , "Kumar, Rahul R" Subject: Re: [Patch V2] UefiCpuPkg: Use Top of each AP's stack to save CpuMpData Thread-Topic: [Patch V2] UefiCpuPkg: Use Top of each AP's stack to save CpuMpData Thread-Index: AQHYs5Nl8/yS+3yHS0edYCvTbLgyHq2/UZSA Date: Thu, 25 Aug 2022 08:28:00 +0000 Message-ID: References: <20220819061728.389-1-yuanhao.xie@intel.com> In-Reply-To: <20220819061728.389-1-yuanhao.xie@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: 4e28a6fb-1d5b-46fb-aacc-08da8673b8bd x-ms-traffictypediagnostic: MWHPR11MB1774:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: Opx1nk3fMJ8LUp4g8daa/4BE4KI7kdjO0XrTkihhoEMIR7gf6FK0TL8d/PnLKDE+SO5EJzYEDaqnofa8dZgSS6dFPEEiEJmImGbu14T2wepQGmCIOb8IAD2e+smzUP1qLwmPc9HwJHD8OPdzJzOhgy0oc9NiXzUgp511E13YkKsb0uhvwc7cxao6Nb0+b4dqQ/KB0JVux+k8/e5Lldzunxwofv+mCV5LQOYZ63Ca5nH7M6GLLNEbJ27I9X96pD6XABB/w0pfiVpbUUpuw851/8KdIoaZTwf+dUQ27PtAi205pGVv1pywBjak1f6ipOjtDBiiw9tlwJqsHhwp3orBpGOPDgm34j1Bqc3ghv1mnwEQIDpBQxtEnjBBnjvcTcxtR11t38/YbrvilGabLn+z8roLH3f80y7oogtL0WzFQ1K7veTEcwJ8UmylGDHdSOf5nP/9GKIwoQ6hCH6FuSI4txQ3uyiVinxkPnMRKJDufSLdc+TB/B/Gj9b8TM2u/BvsMSymetc2nIblIClkK1/eJ1ydZAHaqKYf0fZpS1cKQikn63HD4MVvPcmeMc6/V+ujKXImYvsLAgz7i2d/MJebjWrwbN+gJZAmCiyP/wPNNM3ODCDNeekEmk0XkNK4Bpqh70Z0VcOddsCf/rVnxFk5z73UblFukdyV1Ka2hJ+fj8vowwniIg/95D7qbncfbnQVgYpSHHDHAbB142o4hRs53RQPRp+1nyORXUZbLkaYExPXuvVfzdCdWNSCEASkY6Gct0Z3+vRZPxUWOhOtgzc03g== 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)(6029001)(39860400002)(396003)(346002)(136003)(376002)(366004)(71200400001)(478600001)(66556008)(4326008)(64756008)(8676002)(66946007)(76116006)(66476007)(33656002)(66446008)(8936002)(5660300002)(38070700005)(86362001)(41300700001)(52536014)(107886003)(54906003)(110136005)(316002)(19627235002)(82960400001)(6506007)(2906002)(9686003)(26005)(53546011)(7696005)(38100700002)(122000001)(186003)(55016003)(83380400001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?aY48i1/OiCKnMg4FUE/exkn51XTVGeSHm5FZN+a4rqW7HidgsjgCjk+ZBA/q?= =?us-ascii?Q?6DF/4aQ0xk+nR2U59WhOYc9LhRIzAasuXuY5Vht2TImgLXtK3lkhwSHSoCXM?= =?us-ascii?Q?/JxKfoGHu4ThOiOiM2urOdyc3QIsPBFqAPIefWFzWi+EN4mrjWDphyFNa2V4?= =?us-ascii?Q?ZwMB9GzXGFDWbEuPITntHvFWDjktrdlAId/gn+XLLqhBemqEWMxB46GUkj2/?= =?us-ascii?Q?b3ORyqs9ryjLEUAQyUmM46kBTo080FaChGMwUWGrDcBtE9q832sgdf/mdDXp?= =?us-ascii?Q?bN28UeHmfS+Af4vWkEOeWHUWSejfTPEHHtLXpA1F7GhHf0V+gG/6hihkNtQX?= =?us-ascii?Q?toW3a81OerebLa2QWM2MTxKBbbdD5Wm6/UHqYICVp7JzWutIauTp5KLRGi57?= =?us-ascii?Q?fcVZMHaZWIRHrJbJAhliDD24Kzk+Q/hrTqHUbnrfGejZ7KJNeCVmszC8TzRY?= =?us-ascii?Q?7T2ShT4p6f7ojkiAX8ZOuBtbD7Ik1zDKFv4wWSXSwVu3etssTILZQ8XT2LJq?= =?us-ascii?Q?DcF82eZ3P8qE5d/mtx9g8tAUSdfjbqxwy3mNYRlLumnE4K4p8sOivBvyX2d6?= =?us-ascii?Q?1R5mOPFra534Vo9Bu6qR5UNq5rZg1E3AUAu/FWoLtKmTx/b+GtwlKl528qDU?= =?us-ascii?Q?YG9K0hsm1OHo7+1DWCWxQjQNJkSnqG20n1WvWoBIYiA1jteEnnCdyG0qnaN5?= =?us-ascii?Q?ucUB8X2HxiBg3Bxkz9omDSMPFtLjYC3x1jQiw9mvIzX8oBsmB3vnvywIcad5?= =?us-ascii?Q?hJYiH2PX1NnA4PA16PlNFRZz8upkQM8rcxOGlzars+9RXvgJrhlXds6YcDaK?= =?us-ascii?Q?4MwJ5ps95Ju6N3oJJtowuobr5ST3FzDc2AVLBul57KIGV1EzaNjDN/tj6SDM?= =?us-ascii?Q?+eTppYgMba8M7779It5MOPxknmM7D1ah4s404FyCcVT9qoCown8GUVS6Xaw1?= =?us-ascii?Q?gTuafmxyXrd8l9DaNDZLFZPvUqjlYscssTBw9PzjHr7uSTcXvQMNFtEnCpzf?= =?us-ascii?Q?6Qi/V68yOrKzyIQNXPST9Q43hvG5ZjguszR5HNqthOPIgeYmGLYyxvZgy8HK?= =?us-ascii?Q?Ph5p9SFfQYIFNd9uQ3JzbhFTEcpn+Q71c4oanskIgF8zSQ+OGijx1CgdhLcQ?= =?us-ascii?Q?RFyFWYTDrFt/7i1/dkXKKSfiMJTdsedF4zXzfHw3v1Ym1x2+7TJGG5A5YpZa?= =?us-ascii?Q?u9GvzuRNQqozxCFKCDocr0iDPr7Q5Qn7eMxHwmPEcwJelIg+xjoTB1WoZmLl?= =?us-ascii?Q?EyfMcm06Oss5egZ5u2ZOCc727tMAAMTy15tdSqelobKXMC2u7mq5lT8v7sKq?= =?us-ascii?Q?AMYGcVfxMektiuCzcOBVPt2sQ5DaDRPj0A4ApD+MujHPKZjB7kOJWck0+dpo?= =?us-ascii?Q?ssfCWRcncjUKD52Mbjc8OWju8vt6on+I/C2hSXSyU3FJ/ePkypQVnKmuIh6d?= =?us-ascii?Q?W5DZQ+s/8Ubibh4jc4FXedibXng3T/b+1wm7uvmf85bWG5wsrHABZbIXXyKW?= =?us-ascii?Q?Y578X8Nlb4CbaWWP59zuxF6T+YwbW8uZYcZ7hwt8bH/MFPOBC8AgEAaPzG2W?= =?us-ascii?Q?XRxNckG2s+TU3W/F+/OPq5Y6tMKHryrbPjbYGXmM?= 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: 4e28a6fb-1d5b-46fb-aacc-08da8673b8bd X-MS-Exchange-CrossTenant-originalarrivaltime: 25 Aug 2022 08:28:00.4989 (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: PLdoz2zGnOlQZ49Mup/MAfvzOiqGYbgNZ5uR0A9OXiUmP2BOBL7Lyau2zWgnjStr5EMxVYtd5VhcwJ8XWGU3Fw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR11MB1774 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: Xie, Yuanhao > Sent: Friday, August 19, 2022 2:17 PM > To: devel@edk2.groups.io > Cc: Xie, Yuanhao ; Dong, Eric > ; Ni, Ray ; Kumar, Rahul R > > Subject: [Patch V2] UefiCpuPkg: Use Top of each AP's stack to save > CpuMpData >=20 > From: Yuanhao Xie >=20 > To remove the dependency of CPU register, 4/8 byte at the top of the > stack is occupied for CpuMpData. BIST information is also taken care > here. This modification is only for PEI phase, since in DXE phase > CpuMpData is accessed via global variable. >=20 > Change-Id: I7564279544622617c322310b4c7028ac0e11a9c4 > Signed-off-by: Yuanhao > Cc: Eric Dong > Cc: Ray Ni > Cc: Rahul Kumar > --- > .../Library/MpInitLib/Ia32/MpFuncs.nasm | 8 ++++ > UefiCpuPkg/Library/MpInitLib/MpLib.c | 37 ++++++++++++++----- > UefiCpuPkg/Library/MpInitLib/MpLib.h | 8 ++++ > UefiCpuPkg/Library/MpInitLib/PeiMpLib.c | 10 +++-- > UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 9 +++++ > 5 files changed, 59 insertions(+), 13 deletions(-) >=20 > diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm > b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm > index 28301bb8f0..2625d28401 100644 > --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm > +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm > @@ -179,6 +179,14 @@ ProgramStack: > mov esp, dword [edi + CPU_INFO_IN_HOB.ApTopOfStack] >=20 > CProcedureInvoke: > + ; > + ; Reserve 4 bytes for CpuMpData. > + ; When the AP wakes up again via INIT-SIPI-SIPI, push 0 will cause t= he > existing CpuMpData to be overwritten with 0. > + ; CpuMpData is filled in via InitializeApData() during the first tim= e INIT- > SIPI-SIPI, > + ; while overwirrten may occurs when under ApInHltLoop but InitFlag i= s > not set to ApInitConfig. > + ; Therefore reservation is implemented by sub esp instead of push 0. > + ; > + sub esp, 4 > push ebp ; push BIST data at top of AP stack > xor ebp, ebp ; clear ebp for call stack trace > push ebp > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c > b/UefiCpuPkg/Library/MpInitLib/MpLib.c > index 8d1f24370a..a4ce1c6d2e 100644 > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c > @@ -571,6 +571,7 @@ InitializeApData ( > { > CPU_INFO_IN_HOB *CpuInfoInHob; > MSR_IA32_PLATFORM_ID_REGISTER PlatformIdMsr; > + AP_STACK_DATA *ApStackData; >=20 > CpuInfoInHob =3D (CPU_INFO_IN_HOB > *)(UINTN)CpuMpData->CpuInfoInHob; > CpuInfoInHob[ProcessorNumber].InitialApicId =3D GetInitialApicId (); > @@ -578,6 +579,12 @@ InitializeApData ( > CpuInfoInHob[ProcessorNumber].Health =3D BistData; > CpuInfoInHob[ProcessorNumber].ApTopOfStack =3D ApTopOfStack; >=20 > + // > + // AP_STACK_DATA is stored at the top of AP Stack > + // > + ApStackData =3D (AP_STACK_DATA *)((UINTN)ApTopOfStack - sizeof > (AP_STACK_DATA)); > + ApStackData->MpData =3D CpuMpData; > + > CpuMpData->CpuData[ProcessorNumber].Waiting =3D FALSE; > CpuMpData->CpuData[ProcessorNumber].CpuHealthy =3D (BistData =3D=3D 0)= ? > TRUE : FALSE; >=20 > @@ -623,6 +630,7 @@ ApWakeupFunction ( > CPU_INFO_IN_HOB *CpuInfoInHob; > UINT64 ApTopOfStack; > UINTN CurrentApicMode; > + AP_STACK_DATA *ApStackData; >=20 > // > // AP finished assembly code and begin to execute C code > @@ -648,7 +656,9 @@ ApWakeupFunction ( > // This is first time AP wakeup, get BIST information from AP stac= k > // > ApTopOfStack =3D CpuMpData->Buffer + (ProcessorNumber + 1) * > CpuMpData->CpuApStackSize; > - BistData =3D *(UINT32 *)((UINTN)ApTopOfStack - sizeof (UINTN))= ; > + ApStackData =3D (AP_STACK_DATA *)((UINTN)ApTopOfStack - sizeof > (AP_STACK_DATA)); > + BistData =3D (UINT32)ApStackData->Bist; > + > // > // CpuMpData->CpuData[0].VolatileRegisters is initialized based on= BSP > environment, > // to initialize AP in InitConfig path. > @@ -1796,14 +1806,22 @@ MpInitLibInitialize ( > AsmGetAddressMap (&AddressMap); > GetApResetVectorSize (&AddressMap, &ApResetVectorSizeBelow1Mb, > &ApResetVectorSizeAbove1Mb); > ApStackSize =3D PcdGet32 (PcdCpuApStackSize); > - ApLoopMode =3D GetApLoopMode (&MonitorFilterSize); > + // > + // ApStackSize must be power of 2 > + // > + ASSERT ((ApStackSize & (ApStackSize - 1)) =3D=3D 0); > + ApLoopMode =3D GetApLoopMode (&MonitorFilterSize); >=20 > // > // Save BSP's Control registers for APs. > // > SaveVolatileRegisters (&VolatileRegisters); >=20 > - BufferSize =3D ApStackSize * MaxLogicalProcessorNumber; > + BufferSize =3D ApStackSize * MaxLogicalProcessorNumber; > + // > + // Allocate extra ApStackSize to let AP stack align on ApStackSize bou= nday > + // > + BufferSize +=3D ApStackSize; > BufferSize +=3D MonitorFilterSize * MaxLogicalProcessorNumber; > BufferSize +=3D ApResetVectorSizeBelow1Mb; > BufferSize =3D ALIGN_VALUE (BufferSize, 8); > @@ -1813,13 +1831,13 @@ MpInitLibInitialize ( > MpBuffer =3D AllocatePages (EFI_SIZE_TO_PAGES (BufferSize)); > ASSERT (MpBuffer !=3D NULL); > ZeroMem (MpBuffer, BufferSize); > - Buffer =3D (UINTN)MpBuffer; > + Buffer =3D ALIGN_VALUE ((UINTN)MpBuffer, ApStackSize); >=20 > // > - // The layout of the Buffer is as below: > + // The layout of the Buffer is as below (lower address on top): > // > - // +--------------------+ <-- Buffer > - // AP Stacks (N) > + // +--------------------+ <-- Buffer (Pointer of CpuMpData is store= d in the > top of each AP's stack.) > + // AP Stacks (N) (StackTop =3D (RSP + ApStackSi= ze) & > ~ApStackSize)) > // +--------------------+ <-- MonitorBuffer > // AP Monitor Filters (N) > // +--------------------+ <-- BackupBufferAddr (CpuMpData->BackupBu= ffer) > @@ -1827,7 +1845,7 @@ MpInitLibInitialize ( > // +--------------------+ > // Padding > // +--------------------+ <-- ApIdtBase (8-byte boundary) > - // AP IDT All APs share one separate IDT. So AP can= get address of > CPU_MP_DATA from IDT Base. > + // AP IDT All APs share one separate IDT. > // +--------------------+ <-- CpuMpData > // CPU_MP_DATA > // +--------------------+ <-- CpuMpData->CpuData > @@ -1864,10 +1882,11 @@ MpInitLibInitialize ( >=20 > // > // Make sure no memory usage outside of the allocated buffer. > + // (ApStackSize - (Buffer - (UINTN)MpBuffer)) is the redundant caused = by > alignment > // > ASSERT ( > (CpuMpData->CpuInfoInHob + sizeof (CPU_INFO_IN_HOB) * > MaxLogicalProcessorNumber) =3D=3D > - Buffer + BufferSize > + (UINTN)MpBuffer + BufferSize - (ApStackSize - Buffer + > (UINTN)MpBuffer) > ); >=20 > // > diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h > b/UefiCpuPkg/Library/MpInitLib/MpLib.h > index 974fb76019..69b621a340 100644 > --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h > +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h > @@ -302,6 +302,14 @@ struct _CPU_MP_DATA { > UINT64 GhcbBase; > }; >=20 > +// > +// AP_STACK_DATA is stored at the top of each AP stack. > +// > +typedef struct { > + UINTN Bist; > + CPU_MP_DATA *MpData; > +} AP_STACK_DATA; > + > #define AP_SAFE_STACK_SIZE 128 > #define AP_RESET_STACK_SIZE AP_SAFE_STACK_SIZE >=20 > diff --git a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c > b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c > index 65400b95a2..e732371ddd 100644 > --- a/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c > +++ b/UefiCpuPkg/Library/MpInitLib/PeiMpLib.c > @@ -89,7 +89,7 @@ EnableDebugAgent ( > /** > Get pointer to CPU MP Data structure. > For BSP, the pointer is retrieved from HOB. > - For AP, the structure is just after IDT. > + For AP, the structure is stored in the top of each AP's stack. >=20 > @return The pointer to CPU MP Data structure. > **/ > @@ -100,15 +100,17 @@ GetCpuMpData ( > { > CPU_MP_DATA *CpuMpData; > MSR_IA32_APIC_BASE_REGISTER ApicBaseMsr; > - IA32_DESCRIPTOR Idtr; > + UINTN ApTopOfStack; > + AP_STACK_DATA *ApStackData; >=20 > ApicBaseMsr.Uint64 =3D AsmReadMsr64 (MSR_IA32_APIC_BASE); > if (ApicBaseMsr.Bits.BSP =3D=3D 1) { > CpuMpData =3D GetCpuMpDataFromGuidedHob (); > ASSERT (CpuMpData !=3D NULL); > } else { > - AsmReadIdtr (&Idtr); > - CpuMpData =3D (CPU_MP_DATA *)(Idtr.Base + Idtr.Limit + 1); > + ApTopOfStack =3D ALIGN_VALUE ((UINTN)&ApTopOfStack, > (UINTN)PcdGet32 (PcdCpuApStackSize)); > + ApStackData =3D (AP_STACK_DATA *)((UINTN)ApTopOfStack- sizeof > (AP_STACK_DATA)); > + CpuMpData =3D (CPU_MP_DATA *)ApStackData->MpData; > } >=20 > return CpuMpData; > diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm > b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm > index 1daaa72b1e..6751cae6f1 100644 > --- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm > +++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm > @@ -237,11 +237,20 @@ ProgramStack: > mov rsp, qword [rdi + CPU_INFO_IN_HOB.ApTopOfStack] >=20 > CProcedureInvoke: > + ; > + ; Reserve 8 bytes for CpuMpData. > + ; When the AP wakes up again via INIT-SIPI-SIPI, push 0 will cause t= he > existing CpuMpData to be overwritten with 0. > + ; CpuMpData is filled in via InitializeApData() during the first tim= e INIT- > SIPI-SIPI, > + ; while overwirrten may occurs when under ApInHltLoop but InitFlag i= s > not set to ApInitConfig. > + ; Therefore reservation is implemented by sub rsp instead of push 0. > + ; > + sub rsp, 8 > push rbp ; Push BIST data at top of AP stack > xor rbp, rbp ; Clear ebp for call stack trace > push rbp > mov rbp, rsp >=20 > + push qword 0 ; Push 8 bytes for alignment > mov rax, qword [esi + MP_CPU_EXCHANGE_INFO_FIELD > (InitializeFloatingPointUnits)] > sub rsp, 20h > call rax ; Call assembly function to initialize = FPU per UEFI spec > -- > 2.36.1.windows.1