From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com [40.107.92.70]) by mx.groups.io with SMTP id smtpd.web10.37929.1674101457416578589 for ; Wed, 18 Jan 2023 20:10:57 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@amd.com header.s=selector1 header.b=wbPvEk6j; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.92.70, mailfrom: abner.chang@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Yyo03UflZ3LpQd7SouECRbl3vhgbw7lpm8gjwfMkMdUYPrcg1ZcxHrzsjuYkPNpIZ0qpPG99k7TkXrFvI6EAqXxx42RWC8O9Rtn+vC/dy/fdNCAb4ZmXQvuYkznX3l+CGiGlFOvUHoPe/aa4jQrPIIpeUETPiLpsugF65iZAW3+pCsfGbaZLbgW2sEVx6+ZVy1qufdqja6hgsCVlg8UsnAz5Rf5OJYhLZHG67Fa+MIAyZ2RPaQsHcU6mlhz3vqpYUBJVnitDxoU1wUsVKk1l4uZW7lh17koQ6SlUsWdf070agMiyBlBPfUDnh9I+9YWI6t24MNr5LiHjF1fpbsOr4Q== 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=6ylV3B52YF5jnxgx52rDYU25FQOZuJuT8o8YYyzWDIY=; b=M8QgdPDCfemUV4dDS6S+5o5eA7zC35aOgj4u8zvLQlK3VrYyP1V4vFypFMNrb2xEfLCTN/h6/CJbl6M2Yyjlx5sZVNqalTeV/JyDe7mzNWPDiXODnhLVE/uVFHmrisvPH72AjoALKbyOx3oYAmn/mXprIOWlSnuYuiK/Wr91gBkRsDMsgSijjZFYose5mF6WfwVidp6nIMXW6Rtpbn8YwKI8nsFMHIiIqGAceFug0etjwPzJ6aqUAnejB4P2C7pc8mhfxtuWy43BGhZ5prijvnkxX9IHzAqkXhxg1jCXxJGb3vfRJiwQec77fDBfHe+Cv4zK+emCkHO7X7RxqA4F5A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6ylV3B52YF5jnxgx52rDYU25FQOZuJuT8o8YYyzWDIY=; b=wbPvEk6jBquVqe6J4bQ77vDQnXjegHWPU/Ta3m9xvVRHaAn5foZhDg940E0mbo/D/ZGcJF5BITcByr4oeVA79AAkHW+obIXAKy8BUVzfvRlHyMkYy3X2L5RvRxLLNWIAyfLcv70rq94XqbhB1WkpdyDV2+s8sLSo8rIv+rBeFpw= Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by MW4PR12MB6899.namprd12.prod.outlook.com (2603:10b6:303:208::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6002.13; Thu, 19 Jan 2023 04:10:54 +0000 Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::d606:ab63:cf3:5d36]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::d606:ab63:cf3:5d36%7]) with mapi id 15.20.6002.024; Thu, 19 Jan 2023 04:10:54 +0000 From: "Chang, Abner" To: "Attar, AbdulLateef (Abdul Lateef)" , "devel@edk2.groups.io" CC: "Attar, AbdulLateef (Abdul Lateef)" , "Grimes, Paul" , "Kirkendall, Garrett" , Eric Dong , Ray Ni , Rahul Kumar , "Attar, AbdulLateef (Abdul Lateef)" Subject: Re: [PATCH v3 6/6] UefiCpuPkg: Implements SmmCpuFeaturesLib for AMD Family Thread-Topic: [PATCH v3 6/6] UefiCpuPkg: Implements SmmCpuFeaturesLib for AMD Family Thread-Index: AQHZK16MfOr4vROFOEGaNxBJyoePtq6lIT6A Date: Thu, 19 Jan 2023 04:10:54 +0000 Message-ID: References: <89ccc00cffd4960557b792376ec867c8b11cd437.1674060385.git.abdattar@amd.com> In-Reply-To: <89ccc00cffd4960557b792376ec867c8b11cd437.1674060385.git.abdattar@amd.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2023-01-19T04:10:52Z; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Method=Standard; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Name=General; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=0c3f0c3c-1878-43ef-96fd-ee4d7ce48602; MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=1 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN2PR12MB3966:EE_|MW4PR12MB6899:EE_ x-ms-office365-filtering-correlation-id: f454f26f-e96d-4894-c0ca-08daf9d328d3 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: PYG9EhAkKJfHSc+jLFr3JvAZx49UYatsXkAmgB83VJlHg/HqXGs47ItorUutEh7N9RMUIxrLBK/OhslDfa2dD8DdTw9fgE0ony3uIaAcKOx4Az0tCcHF26oG8sCCan2PqO/skvtb2jwfdXmS9OSDODnvd148/y6d6SVmuqwiWmVD3J3bvWXL1n3YbzUyiLIZJClUiX9EQOweBKpZaGzRfc15HyCw7oaER6UKVT7Pkuaj6KcvV9+en/OlIqUA1tkKGzA5Qr2Giu2GOYv2rK4UJP0Biqxp/gXg4A1qloQZqWP4/mWc8QOvXiNn72ShNIVLbAU4RKZahmPB2SU7xRd/LfUKcvkt/eeah1PqnqONR9JAhffP3RNmiegTq4ON1RCEP+LWm81oe6v2gIrCQQF/Qwy7RLx6oaQDLES+GcL1h8ROVMnyi9xjBMfKPiUm5Zf5b/Uu0xyYXtOelnCoPN3B121c6PcijcCwxktDFF7+2HyQaeonzf9qRsubvMKYV/5X3lF4by1Rr1ECgnE9UYSIpmwQPWJ022ln1/wPOcvP1WnbT4r+S3k1FTt0uUpoY+V6gKHKnnLnCZFehmg/nLP5wosaJWOKHXxPZoKVLglRY9yTHhbd9wY3XpVxjgaCN8e565MRif0/Eda7Ct3CasTwrqjuCq7DFT5c3uathUauh5y8FIgb4P9L6yPJhMqGJwzgJSyYbxl/YzRWlC1FZrOgj8+1tSgv8LQhQ6rRgsfTeEM= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR12MB3966.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(396003)(136003)(376002)(39860400002)(346002)(366004)(451199015)(38100700002)(2906002)(122000001)(55016003)(33656002)(86362001)(7696005)(110136005)(54906003)(38070700005)(316002)(71200400001)(64756008)(66556008)(66946007)(4326008)(66446008)(76116006)(83380400001)(5660300002)(41300700001)(66476007)(8676002)(6506007)(9686003)(53546011)(26005)(186003)(966005)(52536014)(8936002)(478600001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?cdz0JFfNZ+LMdqGkj4kn/o8pq86kLOYmldIHYl1iEUVNApEg8W7Fn8Mik+7M?= =?us-ascii?Q?M7tc1IMYsC+BVHQE+0jOFxAlO+/z92mNhiyjbJ/Jr2v5PewZvss4CguE7TTX?= =?us-ascii?Q?VSxuiiLVTqlNrg7O9Zm/4+eespZUqESQ2qUlg0IZi7CeYkZP2umJc5fZDI/P?= =?us-ascii?Q?oINFIyDH4fGPHwXz0qMMa1zdFwi06MMeRoeqjhAh+Jf6rQcHTGa7Fwm9KBs9?= =?us-ascii?Q?4kxfXJGto751Omg8yKZ6/3aTFPyhOl3JYq249Nra4uauBahHpj0SC4EscrL8?= =?us-ascii?Q?7xnuCG82dmfYmKwWH3P7y9kQZyXt+vfv7SOYw6thuonS689oPTt7DZZSvlLB?= =?us-ascii?Q?pecdNZQaVVVbP9YHHG4ptVKobAcVyxAZkvhkPDgQgrYg1XnIwq1TG4DxkDkp?= =?us-ascii?Q?OMQVKtjV+7rEcVlTwdbh6BFf1ueBCkYf/7F/evNrDn7CvsFnSWTHwGIjkoTa?= =?us-ascii?Q?MtHOkyb2fYz7OC/yqQ83hsmJU74YeEt2m+MKpglCz+7P3U8gN05nomE/n1Bk?= =?us-ascii?Q?6Yuz8pcvFksQX9zdhiJqTvv3A38z6rzkqJbbi9rFto6hH6PWPMGajylosb3v?= =?us-ascii?Q?VYYx+Z9XHjqMdD1o0H9M0o/Ha2RJjLlWNPA6BWI8pdzNMWy6ueaYCcFHpVYv?= =?us-ascii?Q?CMksNikk/ffm3CzkaM4An9LPDDJgHLn7G4OAUm1JAUl9GJHB9z4lzrMHjE1i?= =?us-ascii?Q?RnX9oHb5jgOWa2/4P/dxzDeOLy2xoI77wwCLbQAdrsFDZUS3qD5RdmhzpRYq?= =?us-ascii?Q?xnIUisgvH10F6vKSd2V4Y7lY11TTFstLd1XtobhJj0QkP9NGfvz1kaoyXWPZ?= =?us-ascii?Q?QgDJDIyACnXXKtzX0W7GxHks9BRjGSxTmYHuJKZQvIrjS0PmVv6ExVrAzrqy?= =?us-ascii?Q?xL64BlBufiFE0fEBm7lfv4tviJbnU+dcl4Hoj8Gbn5GwjEGa10rv2zc67Q9H?= =?us-ascii?Q?AXNi6yKDgtBdWlZFVEBXU9E6JUx2QHQ0op+vQsSXG7B8DzBHVIQXuC+ufI7P?= =?us-ascii?Q?LqaouxO3pr8AKeS4PkqDBbna0LY0iccN3cN/qWN1p3Zc0EGcmCCCXQm856O+?= =?us-ascii?Q?sqbwFLC/2RtSmBwouLbXCSXq8UKvIaEqZWGnWuqmn2NUpWImrsXL4JQGEVon?= =?us-ascii?Q?T00FiEb96PQuympeW0oPq5FAufqJMazd6GY2LM5aESGPhwyrI+YMlNqT28Kd?= =?us-ascii?Q?7CeTMrlCd4KP0mYQaNLTcLKWuwzpTlEm3srqMaPMgqW9tJh6WNQ2qjf3QX7V?= =?us-ascii?Q?oIFkqV4EvnLbF543JB3PhNtf/Q0/fwn8eiVezwvdMtozLwErbgYar5cG7umw?= =?us-ascii?Q?Qy66Kdrmgw7XyWE0qJ08HKVQjPOUQ9DM6b9fqdTWO4Y6lWNgm3FP6/AJq5At?= =?us-ascii?Q?4YJVf/eOS4Rw1dOGTxD92o9d5BrZwZJCNKfyZn1w+qDic7bJPubuLALwTvyS?= =?us-ascii?Q?PdozZFhD8oE5VsQ4+91MwG1saWnSYyx1wz46EHTQJ9emicuR2Gt71dnCogd2?= =?us-ascii?Q?dYlPFFZkvlcnIfY7vjtSq2VrkvG0bRFdTlmMnsuL2AKj9glcJmWIgPjgkZyC?= =?us-ascii?Q?9neaLW1kqcgFYzZ96kXjzqr9U/nlB/mizBKiFSBP?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f454f26f-e96d-4894-c0ca-08daf9d328d3 X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Jan 2023 04:10:54.4415 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: WNiKgJDFkmqoyJ0JjUI3jcgwH7Edzrfcp7d9+DyavC6DBu2K1qbrXhZfut+tgyuO0rcA0FXCsIdAiXo7gHYAYA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6899 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable [AMD Official Use Only - General] Reviewed-by: Abner Chang > -----Original Message----- > From: Abdul Lateef Attar > Sent: Thursday, January 19, 2023 1:01 AM > To: devel@edk2.groups.io > Cc: Attar, AbdulLateef (Abdul Lateef) ; > Grimes, Paul ; Kirkendall, Garrett > ; Chang, Abner ; > Eric Dong ; Ray Ni ; Rahul Kumar > ; Attar, AbdulLateef (Abdul Lateef) > > Subject: [PATCH v3 6/6] UefiCpuPkg: Implements SmmCpuFeaturesLib for > AMD Family >=20 > From: Abdul Lateef Attar >=20 > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4182 >=20 > Implements interfaces to read and write save state registers of AMD's > processor family. > Initializes processor SMMADDR and MASK depends on PcdSmrrEnable flag. > Program or corrects the IP once control returns from SMM. >=20 > Cc: Paul Grimes > Cc: Garrett Kirkendall > Cc: Abner Chang > Cc: Eric Dong > Cc: Ray Ni > Cc: Rahul Kumar > Signed-off-by: Abdul Lateef Attar > --- > .../AmdSmmCpuFeaturesLib.inf | 6 + > .../SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c | 106 > +++++++++++++++++- > 2 files changed, 109 insertions(+), 3 deletions(-) >=20 > diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf > index 4c77efc64462..9d5b8c2e972d 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf > +++ > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.inf > @@ -31,3 +31,9 @@ [LibraryClasses] > PcdLib MemoryAllocationLib DebugLib+ > SmmSmramSaveStateLib++[FeaturePcd]+ > gUefiCpuPkgTokenSpaceGuid.PcdSmrrEnable ## CONSUMES+ > gUefiCpuPkgTokenSpaceGuid.PcdSmmFeatureControlEnable ## > CONSUMES+diff --git > a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c > b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c > index c74e1a0c0c5b..af45be3e265a 100644 > --- a/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c > +++ b/UefiCpuPkg/Library/SmmCpuFeaturesLib/AmdSmmCpuFeaturesLib.c > @@ -11,6 +11,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > #include #include > +#include > +#include > +#include +#include > ++// EFER register LMA bit+#define > LMA BIT10++// Machine Specific Registers (MSRs)+#define > SMMADDR_ADDRESS 0xC0010112ul+#define SMMMASK_ADDRESS > 0xC0010113ul+#define EFER_ADDRESS 0XC0000080ul++// The mode of the > CPU at the time an SMI occurs+STATIC UINT8 mSmmSaveStateRegisterLma; > /** Read an SMM Save State register on the target processor. If this > function@@ -39,7 +54,7 @@ SmmCpuFeaturesReadSaveStateRegister ( > OUT VOID *Buffer ) {- return EFI_SUCCESS;+ = return > SmramSaveStateReadRegister (CpuIndex, Register, Width, Buffer); } /**@@ > -67,7 +82,7 @@ SmmCpuFeaturesWriteSaveStateRegister ( > IN CONST VOID *Buffer ) {- return EFI_SUCCESS;+ = return > SmramSaveStateWriteRegister (CpuIndex, Register, Width, Buffer); } > /**@@ -82,6 +97,13 @@ CpuFeaturesLibInitialization ( > VOID ) {+ UINT32 LMAValue;++ LMAValue =3D > (UINT32)AsmReadMsr64 (EFER_ADDRESS) & LMA;+ > mSmmSaveStateRegisterLma =3D > EFI_SMM_SAVE_STATE_REGISTER_LMA_32BIT;+ if (LMAValue) {+ > mSmmSaveStateRegisterLma =3D > EFI_SMM_SAVE_STATE_REGISTER_LMA_64BIT;+ } } /**@@ -117,6 +139,52 > @@ SmmCpuFeaturesInitializeProcessor ( > IN CPU_HOT_PLUG_DATA *CpuHotPlugData ) {+ > AMD_SMRAM_SAVE_STATE_MAP *CpuState;+ UINT32 > LMAValue;++ //+ // Configure SMBASE.+ //+ CpuState =3D > (AMD_SMRAM_SAVE_STATE_MAP *)(UINTN)(SMM_DEFAULT_SMBASE + > SMRAM_SAVE_STATE_MAP_OFFSET);+ CpuState->x64.SMBASE =3D > (UINT32)CpuHotPlugData->SmBase[CpuIndex];++ // Re-initialize the value > of mSmmSaveStateRegisterLma flag which might have been changed in > PiCpuSmmDxeSmm Driver+ // Entry point, to make sure correct value on > AMD platform is assigned to be used by SmmCpuFeaturesLib.+ LMAValue > =3D (UINT32)AsmReadMsr64 (EFER_ADDRESS) & LMA;+ > mSmmSaveStateRegisterLma =3D > EFI_SMM_SAVE_STATE_REGISTER_LMA_32BIT;+ if (LMAValue) {+ > mSmmSaveStateRegisterLma =3D > EFI_SMM_SAVE_STATE_REGISTER_LMA_64BIT;+ }++ //+ // If SMRR is > supported, then program SMRR base/mask MSRs.+ // The > EFI_MSR_SMRR_PHYS_MASK_VALID bit is not set until the first normal SMI.+ > // The code that initializes SMM environment is running in normal mode+ = // > from SMRAM region. If SMRR is enabled here, then the SMRAM region+ // > is protected and the normal mode code execution will fail.+ //+ if > (FeaturePcdGet (PcdSmrrEnable)) {+ //+ // SMRR size cannot be less = than > 4-KBytes+ // SMRR size must be of length 2^n+ // SMRR base alignmen= t > cannot be less than SMRR length+ //+ if ((CpuHotPlugData->SmrrSize = < > SIZE_4KB) ||+ (CpuHotPlugData->SmrrSize !=3D GetPowerOfTwo32 > (CpuHotPlugData->SmrrSize)) ||+ ((CpuHotPlugData->SmrrBase & > ~(CpuHotPlugData->SmrrSize - 1)) !=3D CpuHotPlugData->SmrrBase))+ {+ > //+ // Print message and halt if CPU is Monarch+ //+ if (I= sMonarch) {+ > DEBUG ((DEBUG_ERROR, "SMM Base/Size does not meet alignment/size > requirement!\n"));+ CpuDeadLoop ();+ }+ } else {+ Asm= WriteMsr64 > (SMMADDR_ADDRESS, CpuHotPlugData->SmrrBase);+ AsmWriteMsr64 > (SMMMASK_ADDRESS, ((~(UINT64)(CpuHotPlugData->SmrrSize - 1)) | > 0x6600));+ }+ } } /**@@ -159,7 +227,39 @@ > SmmCpuFeaturesHookReturnFromSmm ( > IN UINT64 NewInstructionPointer ) {- return 0;+ UIN= T64 > OriginalInstructionPointer;+ AMD_SMRAM_SAVE_STATE_MAP > *AmdCpuState;++ AmdCpuState =3D (AMD_SMRAM_SAVE_STATE_MAP > *)CpuState;++ if (mSmmSaveStateRegisterLma =3D=3D > EFI_SMM_SAVE_STATE_REGISTER_LMA_32BIT) {+ > OriginalInstructionPointer =3D (UINT64)AmdCpuState->x86._EIP;+ > AmdCpuState->x86._EIP =3D (UINT32)NewInstructionPointer;+ //+ = // > Clear the auto HALT restart flag so the RSM instruction returns+ // pr= ogram > control to the instruction following the HLT instruction.+ //+ if > ((AmdCpuState->x86.AutoHALTRestart & BIT0) !=3D 0) {+ AmdCpuState- > >x86.AutoHALTRestart &=3D ~BIT0;+ }+ } else {+ OriginalInstruction= Pointer =3D > AmdCpuState->x64._RIP;+ if ((AmdCpuState->x64.EFER & LMA) =3D=3D 0) {+ > AmdCpuState->x64._RIP =3D (UINT32)NewInstructionPointer32;+ } else {+ > AmdCpuState->x64._RIP =3D (UINT32)NewInstructionPointer;+ }++ //+ = // > Clear the auto HALT restart flag so the RSM instruction returns+ // pr= ogram > control to the instruction following the HLT instruction.+ //+ if > ((AmdCpuState->x64.AutoHALTRestart & BIT0) !=3D 0) {+ AmdCpuState- > >x64.AutoHALTRestart &=3D ~BIT0;+ }+ }++ return > OriginalInstructionPointer; } /**-- > 2.25.1