From nobody Tue Feb 10 05:26:19 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+92848+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+92848+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1661497501; cv=none; d=zohomail.com; s=zohoarc; b=dZSoZt6oI+ecksUzSX72gwXVudV8+TAROvXa4LT9D2Pr3nmMUxuH10aIjJpm3srGDPKsTBtAo915IPZFR2UVLwEe41JPSHizZhu+LEdk3SUo6C6NsbSGz+Qg/vUedYDJk20ctK+xZSpwPnkHv2Dtle8iM0csfYoubiEDvD9RWoU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1661497501; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=VSBA2tepkMg3XfXByHqIymQQJT1e09F8Q7V9u/hqplI=; b=UfszRUU1sDBSTNEtyI5J2c55LLh5mIxLzBTxobd7yYYk8xi5O+9ucCEaTPHVcUM028ls/ijTqIUWvbs1q7NULKw1G10GK3C44kcdsFLff6s7Gwio/S/n7PPVqqCpA2x/N0MBWXGKqeu0G9bfkyBXsY9MBtIqnXU+fuXvVVDm0gs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+92848+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1661497501273336.150900507222; Fri, 26 Aug 2022 00:05:01 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id Po8RYY1788612x9JY37tbcBp; Fri, 26 Aug 2022 00:05:00 -0700 X-Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mx.groups.io with SMTP id smtpd.web10.34227.1661497500083763450 for ; Fri, 26 Aug 2022 00:05:00 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10450"; a="320534723" X-IronPort-AV: E=Sophos;i="5.93,264,1654585200"; d="scan'208";a="320534723" X-Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2022 00:04:59 -0700 X-IronPort-AV: E=Sophos;i="5.93,264,1654585200"; d="scan'208";a="938651862" X-Received: from shwdesfp01.ccr.corp.intel.com ([10.239.158.151]) by fmsmga005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2022 00:04:58 -0700 From: "Zhiguang Liu" To: devel@edk2.groups.io Cc: Zhiguang Liu , Eric Dong , Ray Ni , Rahul Kumar Subject: [edk2-devel] [PATCH v2] UefiCpuPkg/MpInitLib: Simplify logic in SwitchBsp Date: Fri, 26 Aug 2022 15:04:46 +0800 Message-Id: <20220826070447.2508-2-zhiguang.liu@intel.com> In-Reply-To: <20220826070447.2508-1-zhiguang.liu@intel.com> References: <20220826070447.2508-1-zhiguang.liu@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,zhiguang.liu@intel.com X-Gm-Message-State: VbnhHOSUTsy2Cr7XoCibgA0gx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1661497500; bh=XZgj5BsuHiOqMXREBuFU/X0rC0ltiaOkex+72TpUuQ8=; h=Cc:Date:From:Reply-To:Subject:To; b=Ij9EgamE7PdyqnxFqbvryfXmiTyd5jTXnxXgiZ1vwcMrz+vLhEtLZWnphQZS0ML3cMM XPqY6f65s3LCzV1ST1F3SI2kXDR4XdgXlVh45Euc6X9ItnWQurnkvVTnaygwBYGR0uDDZ qG+pHidr41InurjDOtCneak98f1eTq+r0bU= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1661497503219100001 Content-Type: text/plain; charset="utf-8" When switch bsp, old bsp and new bsp put CR0/CR4 into stack, and put IDT and GDT register into a structure. After they exchange their stack, they restore these registers. This logic is now implemented by assembly code. This patch aims to reuse (Save/Restore)VolatileRegisters function to replace such assembly code for better code readability. Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Signed-off-by: Zhiguang Liu Reviewed-by: Ray Ni --- .../Library/MpInitLib/Ia32/MpFuncs.nasm | 20 +-------- UefiCpuPkg/Library/MpInitLib/MpLib.c | 35 ++++++++++++++- UefiCpuPkg/Library/MpInitLib/MpLib.h | 43 +++++++++---------- UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm | 21 --------- 4 files changed, 56 insertions(+), 63 deletions(-) diff --git a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm b/UefiCpuPkg/Li= brary/MpInitLib/Ia32/MpFuncs.nasm index 28301bb8f0..1d67f510e9 100644 --- a/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/Ia32/MpFuncs.nasm @@ -284,15 +284,8 @@ ASM_PFX(AsmExchangeRole): ; edi contains OthersInfo pointer mov edi, [ebp + 28h] =20 - ;Store EFLAGS, GDTR and IDTR register to stack + ;Store EFLAGS to stack pushfd - mov eax, cr4 - push eax ; push cr4 firstly - mov eax, cr0 - push eax - - sgdt [esi + CPU_EXCHANGE_ROLE_INFO.Gdtr] - sidt [esi + CPU_EXCHANGE_ROLE_INFO.Idtr] =20 ; Store the its StackPointer mov [esi + CPU_EXCHANGE_ROLE_INFO.StackPointer],esp @@ -308,13 +301,6 @@ WaitForOtherStored: jmp WaitForOtherStored =20 OtherStored: - ; Since another CPU already stored its state, load them - ; load GDTR value - lgdt [edi + CPU_EXCHANGE_ROLE_INFO.Gdtr] - - ; load IDTR value - lidt [edi + CPU_EXCHANGE_ROLE_INFO.Idtr] - ; load its future StackPointer mov esp, [edi + CPU_EXCHANGE_ROLE_INFO.StackPointer] =20 @@ -331,10 +317,6 @@ WaitForOtherLoaded: =20 OtherLoaded: ; since the other CPU already get the data it want, leave this procedu= re - pop eax - mov cr0, eax - pop eax - mov cr4, eax popfd =20 popad diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpIn= itLib/MpLib.c index 8d1f24370a..041a32e659 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -1,7 +1,7 @@ /** @file CPU MP Initialize Library common functions. =20 - Copyright (c) 2016 - 2021, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2022, Intel Corporation. All rights reserved.
Copyright (c) 2020, AMD Inc. All rights reserved.
=20 SPDX-License-Identifier: BSD-2-Clause-Patent @@ -15,6 +15,29 @@ =20 EFI_GUID mCpuInitMpLibHobGuid =3D CPU_INIT_MP_LIB_HOB_GUID; =20 +/** + Save the volatile registers required to be restored following INIT IPI. + + @param[out] VolatileRegisters Returns buffer saved the volatile resi= sters +**/ +VOID +SaveVolatileRegisters ( + OUT CPU_VOLATILE_REGISTERS *VolatileRegisters + ); + +/** + Restore the volatile registers following INIT IPI. + + @param[in] VolatileRegisters Pointer to volatile resisters + @param[in] IsRestoreDr TRUE: Restore DRx if supported + FALSE: Do not restore DRx +**/ +VOID +RestoreVolatileRegisters ( + IN CPU_VOLATILE_REGISTERS *VolatileRegisters, + IN BOOLEAN IsRestoreDr + ); + /** The function will check if BSP Execute Disable is enabled. =20 @@ -83,7 +106,12 @@ FutureBSPProc ( CPU_MP_DATA *DataInHob; =20 DataInHob =3D (CPU_MP_DATA *)Buffer; + // + // Save and restore volatile registers when switch BSP + // + SaveVolatileRegisters (&DataInHob->APInfo.VolatileRegisters); AsmExchangeRole (&DataInHob->APInfo, &DataInHob->BSPInfo); + RestoreVolatileRegisters (&DataInHob->APInfo.VolatileRegisters, FALSE); } =20 /** @@ -2233,7 +2261,12 @@ SwitchBSPWorker ( // WakeUpAP (CpuMpData, FALSE, ProcessorNumber, FutureBSPProc, CpuMpData, T= RUE); =20 + // + // Save and restore volatile registers when switch BSP + // + SaveVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters); AsmExchangeRole (&CpuMpData->BSPInfo, &CpuMpData->APInfo); + RestoreVolatileRegisters (&CpuMpData->BSPInfo.VolatileRegisters, FALSE); =20 // // Set the BSP bit of MSR_IA32_APIC_BASE on new BSP diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.h b/UefiCpuPkg/Library/MpIn= itLib/MpLib.h index 974fb76019..47b722cb2f 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.h +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.h @@ -68,14 +68,31 @@ typedef struct { UINTN Size; } MICROCODE_PATCH_INFO; =20 +// +// CPU volatile registers around INIT-SIPI-SIPI +// +typedef struct { + UINTN Cr0; + UINTN Cr3; + UINTN Cr4; + UINTN Dr0; + UINTN Dr1; + UINTN Dr2; + UINTN Dr3; + UINTN Dr6; + UINTN Dr7; + IA32_DESCRIPTOR Gdtr; + IA32_DESCRIPTOR Idtr; + UINT16 Tr; +} CPU_VOLATILE_REGISTERS; + // // CPU exchange information for switch BSP // typedef struct { - UINT8 State; // offset 0 - UINTN StackPointer; // offset 4 / 8 - IA32_DESCRIPTOR Gdtr; // offset 8 / 16 - IA32_DESCRIPTOR Idtr; // offset 14 / 26 + UINT8 State; // offset 0 + UINTN StackPointer; // offset 4 / 8 + CPU_VOLATILE_REGISTERS VolatileRegisters; // offset 8 / 16 } CPU_EXCHANGE_ROLE_INFO; =20 // @@ -112,24 +129,6 @@ typedef enum { CpuStateDisabled } CPU_STATE; =20 -// -// CPU volatile registers around INIT-SIPI-SIPI -// -typedef struct { - UINTN Cr0; - UINTN Cr3; - UINTN Cr4; - UINTN Dr0; - UINTN Dr1; - UINTN Dr2; - UINTN Dr3; - UINTN Dr6; - UINTN Dr7; - IA32_DESCRIPTOR Gdtr; - IA32_DESCRIPTOR Idtr; - UINT16 Tr; -} CPU_VOLATILE_REGISTERS; - // // AP related data // diff --git a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm b/UefiCpuPkg/Lib= rary/MpInitLib/X64/MpFuncs.nasm index cd95b03da8..b7f8d48504 100644 --- a/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm +++ b/UefiCpuPkg/Library/MpInitLib/X64/MpFuncs.nasm @@ -482,22 +482,13 @@ ASM_PFX(AsmExchangeRole): push r14 push r15 =20 - mov rax, cr0 - push rax - - mov rax, cr4 - push rax - ; rsi contains MyInfo pointer mov rsi, rcx =20 ; rdi contains OthersInfo pointer mov rdi, rdx =20 - ;Store EFLAGS, GDTR and IDTR regiter to stack pushfq - sgdt [rsi + CPU_EXCHANGE_ROLE_INFO.Gdtr] - sidt [rsi + CPU_EXCHANGE_ROLE_INFO.Idtr] =20 ; Store the its StackPointer mov [rsi + CPU_EXCHANGE_ROLE_INFO.StackPointer], rsp @@ -513,12 +504,6 @@ WaitForOtherStored: jmp WaitForOtherStored =20 OtherStored: - ; Since another CPU already stored its state, load them - ; load GDTR value - lgdt [rdi + CPU_EXCHANGE_ROLE_INFO.Gdtr] - - ; load IDTR value - lidt [rdi + CPU_EXCHANGE_ROLE_INFO.Idtr] =20 ; load its future StackPointer mov rsp, [rdi + CPU_EXCHANGE_ROLE_INFO.StackPointer] @@ -538,12 +523,6 @@ OtherLoaded: ; since the other CPU already get the data it want, leave this procedu= re popfq =20 - pop rax - mov cr4, rax - - pop rax - mov cr0, rax - pop r15 pop r14 pop r13 --=20 2.31.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#92848): https://edk2.groups.io/g/devel/message/92848 Mute This Topic: https://groups.io/mt/93265208/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-