From nobody Mon Feb 9 01:30:53 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+68500+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+68500+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1607505856715709.5130872031; Wed, 9 Dec 2020 01:24:16 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id 6zofYY1788612xfBPahXTsRF; Wed, 09 Dec 2020 01:24:16 -0800 X-Received: from NAM10-MW2-obe.outbound.protection.outlook.com (NAM10-MW2-obe.outbound.protection.outlook.com [40.107.94.93]) by mx.groups.io with SMTP id smtpd.web12.4046.1607505855319270284 for ; Wed, 09 Dec 2020 01:24:15 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QjeEda4CpqvwHGSCcLWnqfbKMAeDd/R9sSJYAcdyw4QxOOdISbSezEP46YTsj70NI+2fnRI4ImFFl99b78KfOMO888UmndRUL/vKhH7mVpQDzHdTzjTyVmsrAwnOe4KhtsjyfUTyW1/8bLGITUuYiORrJiXS5R9LIbvELUSpfJizeC0TTZoe10omMyBpmQeaxHnLgBf9xgqkset1zydt+cWoGam/7vWg7qPR2pKoTWZo3Mj7VdbvZHH4DQQgSR1OjhO7nb9PTrzNB5ulcgYcHO366WOlPV1wR9j1pe9dRQsyxZqph8PwNn8uxK4J090PQm/qVrisc0+k44JFfnES9g== 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-SenderADCheck; bh=klyHBpFsvDCA4I8XxpnoAtgi2eZU1sBaOVO/9jtzpmM=; b=fPKTn37cxa86Gz5F9x5L08ASRqKEsx/IlH01kbuhfLi7nf6rU9BUu7Nk6qcOp82O3uiThZf/hLRSUtwA6bDvW8r6H/+xG0rRs13wQFE7i91YEmHWZkN3tokRYfOF6AP6Wvqf9rtBj8hyR0NEfDzsitQOZXQ69Rt0BgjrzU4pRj+csDrM0fuowPE6kO5yVL6GVljoeEVCOI+IdpBhNI6nO8B0nJncAh5NYbN2MXFEBRGvBlS+jdN1T/59Y0IpqJG8ORSL93WD5wjzb1xODN78xuM+46xRHmhrbx4LYe09+TYcfUHzdakXMl1U44i2qLZQ/kiEO84yaHayu3OKw4f5jg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=os.amperecomputing.com; dmarc=pass action=none header.from=os.amperecomputing.com; dkim=pass header.d=os.amperecomputing.com; arc=none X-Received: from DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) by DM6PR01MB5609.prod.exchangelabs.com (2603:10b6:5:157::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3632.21; Wed, 9 Dec 2020 09:24:13 +0000 X-Received: from DM6PR01MB5849.prod.exchangelabs.com ([fe80::c814:9a08:5c2e:4076]) by DM6PR01MB5849.prod.exchangelabs.com ([fe80::c814:9a08:5c2e:4076%5]) with mapi id 15.20.3632.023; Wed, 9 Dec 2020 09:24:13 +0000 From: "Nhi Pham via groups.io" To: devel@edk2.groups.io Cc: Nhi Pham Subject: [edk2-devel] [edk2-platforms][PATCH 02/34] Platform/Ampere: Implement FailSafe library Date: Wed, 9 Dec 2020 16:24:59 +0700 Message-Id: <20201209092531.30867-3-nhi@os.amperecomputing.com> In-Reply-To: <20201209092531.30867-1-nhi@os.amperecomputing.com> References: <20201209092531.30867-1-nhi@os.amperecomputing.com> X-Originating-IP: [118.69.219.201] X-ClientProxiedBy: HK0PR01CA0054.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::18) To DM6PR01MB5849.prod.exchangelabs.com (2603:10b6:5:205::20) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from sw004.amperecomputing.com (118.69.219.201) by HK0PR01CA0054.apcprd01.prod.exchangelabs.com (2603:1096:203:a6::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3654.12 via Frontend Transport; Wed, 9 Dec 2020 09:24:11 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ac385836-548c-4b34-93b3-08d89c243156 X-MS-TrafficTypeDiagnostic: DM6PR01MB5609: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:3968; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: esqeWu7gaGcEZHuhD4Og89Jgwn4kXVJZ1vp2douTLthMIFBCI8nC6+cP98E/Sa0RrNH7GWmFSb00i5BGyZS4ZZJskjMLqjW2ffKYHNBaodzNmdoDdu/3r/CtYli56eb8Csshguj81WZ8pq1WQBhn1eL/ieE0bLQUxoJQkMV7/Pzr5EPa+EJ9zz+3yTkBSBGYuEZWZApVWf1DkFQzRpRDB5LDZX4ojTE5nMb27KcI8rYoIosM8ngMoHOGw+m5f9twNvBf3d2fBJ8VBXjc4DKxHimUKEWRpDcw8fOsRbdnk0W1qAcZ3tIvs1sRcGB7S+xmnK67LmcPj+6wYDCkPOZyQeITgpF0RiI6HJe3H0IQWwAnFw1uzNDqTDjmaB+Zh4M9 X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?ZZ6NhPe+iIF3IZ691FehyhPzPJl5aRfDZD79O4vGIX8HoQlqL3vZwWCmyImT?= =?us-ascii?Q?wAniZfmS0nn9280p8wzVuzYy0+sKsi9F3pHJZCMH7FkA9Qk5B29ZvnLo/A2z?= =?us-ascii?Q?2/lXoYPAZeu+gnXNb7SXeklCn9LtApes/6toSZho68GeDljV4YoAyF22GyTf?= =?us-ascii?Q?ZQQt8rNxCo34QeSNQl9McdKhY5SO0ymm2gFYQVaqJXNn0q5Zmn0Doq70SnpI?= =?us-ascii?Q?/mZBQBaAMZmTCyrAum2TJhP2ymKIOreIUPmKarv/zl3dg00DtrEsqaTV9BS/?= =?us-ascii?Q?ZQd8cgWnzb834tQo4Xt23qhK2IVXpNHRnWCkO6tZ4+bROw3FlMt+UBpVmMOP?= =?us-ascii?Q?YsvZZ1Sl/lDJLT6RZr1WQtPcL9Yj1AA+voD1c4FEYZcyxQctyuP+YBJ1gtXm?= =?us-ascii?Q?DHmX6LeuGwd9bP7txc4qa4l2/hC6HHSjejwUcTIjo+S94iJNNDcDsqtmXROH?= =?us-ascii?Q?wty7HZF/mGIb8XvcQUNhElBUuxzRtDI5NfvWegm3PutiDQdFEmhQ6DRTDpDB?= =?us-ascii?Q?Fv/HAYGBjC3ds9rZh2zHeXvZfQqBzSA5TfVX+oYcvQyjNJzmqd/8XKFE5CGx?= =?us-ascii?Q?bDBOIms39MtdMA08eRNdCITo9gJnl8K9V5KytLPA+qhJmMlKFcPhu2W09DZS?= =?us-ascii?Q?zVxMZHAyKbB5fSGVuuMps/q6NvtfBIluGWyCntLygrYDEFnO5ChTF6L56AuQ?= =?us-ascii?Q?CVHf3FPkflU/T/ZJRrZWkoMbD+gWm8FOh4fVz7DJaMcwxfWh0sX3Ww+mV2uP?= =?us-ascii?Q?UANChKmz6e1oVBvo8TalvV3GbP0zT5vKxuB1Hs/qOcODueUd06W6VUwRRagu?= =?us-ascii?Q?c2NobgQXaKoR4ZGihUKwQpUMwVg+hmvp2Lt5eH6q5yxVyEHeYsf+Wc/R2BT8?= =?us-ascii?Q?ZoNjwElpH0GlGAjsJzBjySXHyOgS/Y2CIdm7+joyHsmpfmME+feMBcrKXEnM?= =?us-ascii?Q?YSDVzhKOBegtOJP2Zxhkk+pOz2a3bugqYgAq/C+wysM4Urs/7NP8dxLzz9f8?= =?us-ascii?Q?+1hi?= X-OriginatorOrg: os.amperecomputing.com X-MS-Exchange-CrossTenant-AuthSource: DM6PR01MB5849.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Dec 2020 09:24:13.1919 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3bc2b170-fd94-476d-b0ce-4229bdc904a7 X-MS-Exchange-CrossTenant-Network-Message-Id: ac385836-548c-4b34-93b3-08d89c243156 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: K2gYKGxlxcCs8G2BYH3ROWHcquY9J1qaqkSIfjB4CnSLDg1yWBbQVr1Cs0l8hll3lt4g37X6hVReSO5qsoEfeKg2po9ltTCQQbpYuhLzqG4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR01MB5609 Precedence: Bulk List-Unsubscribe: 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,nhi@os.amperecomputing.com X-Gm-Message-State: pT8I6IDcpjL43aSYyr5TxtHlx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1607505856; bh=IKd0elhBkYrbSTCBR8oCoMK8oyXHee+eUPzYiUTT554=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=BJ+Y+5w7kdiG9QWi1KFoayEygSeLxBo3C9WFjDrD+ZtezUSVhdzffETJheKN1vydkMv 72X/zZpcCPihqlFk0B8J3OywUEEQswQ+7pz+e9XdmWtH5ibMPWOln6CCLgLX5MT8TTY7i ps8kUWRdGBugsDyGX1v9FMZBvCYBXBHV6lY= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The FailSafeLib support API calls to Secure World to: * Get the FailSafe region information. * Get the current FailSafe status. * Inform to FailSafe monitor that the system boots successfully. * Simulate UEFI boot failure due to config wrong NVPARAM for testing failsafe feature. This library is consumed by FailSafe DXE driver. Signed-off-by: Nhi Pham --- Platform/Ampere/AmperePkg.dec | 3 + Platform/Ampere/Library/FailSafeLib/FailSafeLib.inf | 41 +++ Platform/Ampere/Include/Library/FailSafeLib.h | 64 +++++ Platform/Ampere/Library/FailSafeLib/FailSafeLib.c | 267 ++++++++++++++++= ++++ 4 files changed, 375 insertions(+) diff --git a/Platform/Ampere/AmperePkg.dec b/Platform/Ampere/AmperePkg.dec index e6a73b25286c..472b44550fee 100755 --- a/Platform/Ampere/AmperePkg.dec +++ b/Platform/Ampere/AmperePkg.dec @@ -22,7 +22,10 @@ [Defines] # ##########################################################################= ###### [Includes] + Include # Root include for the package =20 [LibraryClasses] + ## @libraryclass Provides functions to support FailSafe operations. + FailSafeLib|Platform/Ampere/Include/Library/FailSafeLib.h =20 [Guids] diff --git a/Platform/Ampere/Library/FailSafeLib/FailSafeLib.inf b/Platform= /Ampere/Library/FailSafeLib/FailSafeLib.inf new file mode 100755 index 000000000000..3ce0c2209cf1 --- /dev/null +++ b/Platform/Ampere/Library/FailSafeLib/FailSafeLib.inf @@ -0,0 +1,41 @@ +## @file +# +# Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001B + BASE_NAME =3D FailSafeLib + FILE_GUID =3D 3403D080-6D76-11E7-907B-A6006AD3DBA0 + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D FailSafeLib + +[Sources] + FailSafeLib.c + +[Protocols] + gEfiMmCommunicationProtocolGuid ## CONSUMES + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdePkg/MdePkg.dec + Silicon/Ampere/AmperePkg.dec + Silicon/Ampere/AmpereAltraPkg/Ac01Pkg.dec + Platform/Ampere/AmperePkg.dec + +[LibraryClasses] + IoLib + DebugLib + BaseLib + BaseMemoryLib + ArmSmcLib + HobLib + NVParamLib + +[Guids] + gSpiNorMmGuid diff --git a/Platform/Ampere/Include/Library/FailSafeLib.h b/Platform/Amper= e/Include/Library/FailSafeLib.h new file mode 100755 index 000000000000..6319284e5ecd --- /dev/null +++ b/Platform/Ampere/Include/Library/FailSafeLib.h @@ -0,0 +1,64 @@ +/** @file + + Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _FAILSAFE_LIB_H_ +#define _FAILSAFE_LIB_H_ + +enum { + MM_SPINOR_FUNC_GET_INFO, + MM_SPINOR_FUNC_READ, + MM_SPINOR_FUNC_WRITE, + MM_SPINOR_FUNC_ERASE, + MM_SPINOR_FUNC_GET_NVRAM_INFO, + MM_SPINOR_FUNC_GET_NVRAM2_INFO, + MM_SPINOR_FUNC_GET_FAILSAFE_INFO +}; + +#define MM_SPINOR_RES_SUCCESS 0xAABBCC00 +#define MM_SPINOR_RES_FAIL 0xAABBCCFF + +enum { + FAILSAFE_BOOT_NORMAL =3D 0, + FAILSAFE_BOOT_LAST_KNOWN_SETTINGS, + FAILSAFE_BOOT_DEFAULT_SETTINGS, + FAILSAFE_BOOT_SUCCESSFUL +}; + +/** + Get the FailSafe region information. +**/ +EFI_STATUS +EFIAPI +FailSafeGetRegionInfo ( + UINT64 *Offset, + UINT64 *Size + ); + +/** + Get the current FailSafe status. +**/ +UINT64 +EFIAPI +FailSafeGetStatus (VOID); + +/** + Inform to FailSafe monitor that the system boots successfully. +**/ +EFI_STATUS +EFIAPI +FailSafeBootSuccessfully (VOID); + +/** + Simulate UEFI boot failure due to config wrong NVPARAM for + testing failsafe feature +**/ +EFI_STATUS +EFIAPI +FailSafeTestBootFailure (VOID); + +#endif /* _FAILSAFE_LIB_H_ */ diff --git a/Platform/Ampere/Library/FailSafeLib/FailSafeLib.c b/Platform/A= mpere/Library/FailSafeLib/FailSafeLib.c new file mode 100755 index 000000000000..244c0b49d085 --- /dev/null +++ b/Platform/Ampere/Library/FailSafeLib/FailSafeLib.c @@ -0,0 +1,267 @@ +/** @file + + Copyright (c) 2020, Ampere Computing LLC. All rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EFI_MM_MAX_PAYLOAD_U64_E 10 +#define EFI_MM_MAX_PAYLOAD_SIZE (EFI_MM_MAX_PAYLOAD_U64_E * sizeof (UINT= 64)) + +EFI_MM_COMMUNICATION_PROTOCOL *mFlashLibMmCommProtocol =3D NULL; + +typedef struct { + /* Allows for disambiguation of the message format */ + EFI_GUID HeaderGuid; + /* + * Describes the size of Data (in bytes) and does not include the size + * of the header + */ + UINTN MsgLength; +} EFI_MM_COMM_HEADER_NOPAYLOAD; + +typedef struct { + UINT64 Data[EFI_MM_MAX_PAYLOAD_U64_E]; +} EFI_MM_COMM_SPINOR_PAYLOAD; + +typedef struct { + EFI_MM_COMM_HEADER_NOPAYLOAD EfiMmHdr; + EFI_MM_COMM_SPINOR_PAYLOAD PayLoad; +} EFI_MM_COMM_REQUEST; + +typedef struct { + UINT64 Status; +} EFI_MM_COMMUNICATE_SPINOR_RES; + +typedef struct { + UINT64 Status; + UINT64 FailSafeBase; + UINT64 FailSafeSize; +} EFI_MM_COMMUNICATE_SPINOR_FAILSAFE_INFO_RES; + +EFI_MM_COMM_REQUEST mEfiMmSpiNorReq; + +typedef struct { + UINT32 NumRetry1; + UINT32 NumRetry2; + UINT32 MaxRetry; + UINT8 Status; + /* + * Byte[3]: Reserved + * Byte[2]: Slave MCU Failure Mask + * Byte[1]: Reserved + * Byte[0]: Master MCU Failure Mask + */ + UINT32 MCUFailsMask; + UINT16 CRC16; +} __attribute__((packed, aligned(4))) FailsafeCtx_t; + +STATIC +EFI_STATUS +UefiMmCreateSpiNorReq ( + VOID *Data, + UINT64 Size + ) +{ + CopyGuid (&mEfiMmSpiNorReq.EfiMmHdr.HeaderGuid, &gSpiNorMmGuid); + mEfiMmSpiNorReq.EfiMmHdr.MsgLength =3D Size; + + if (Size !=3D 0) { + ASSERT (Data); + ASSERT (Size <=3D EFI_MM_MAX_PAYLOAD_SIZE); + + CopyMem (mEfiMmSpiNorReq.PayLoad.Data, Data, Size); + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +FailSafeGetRegionInfo ( + UINT64 *Offset, + UINT64 *Size + ) +{ + EFI_MM_COMMUNICATE_SPINOR_FAILSAFE_INFO_RES *MmSpiNorFailSafeInfoRes; + UINT64 MmData[5]; + UINTN DataSize; + EFI_STATUS Status; + + if (mFlashLibMmCommProtocol =3D=3D NULL) { + Status =3D gBS->LocateProtocol ( + &gEfiMmCommunicationProtocolGuid, + NULL, + (VOID **) &mFlashLibMmCommProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Can't locate gEfiMmCommunicationProtocolGu= id\n", __FUNCTION__)); + return Status; + } + } + + MmData[0] =3D MM_SPINOR_FUNC_GET_FAILSAFE_INFO; + UefiMmCreateSpiNorReq ((VOID *) &MmData, sizeof (MmData)); + + DataSize =3D sizeof (EFI_MM_COMM_HEADER_NOPAYLOAD) + sizeof (MmData); + Status =3D mFlashLibMmCommProtocol->Communicate ( + mFlashLibMmCommProtocol, + (VOID *) &mEfiMmSpiNorReq, + &DataSize + ); + ASSERT_EFI_ERROR (Status); + + MmSpiNorFailSafeInfoRes =3D (EFI_MM_COMMUNICATE_SPINOR_FAILSAFE_INFO_RES= *) &mEfiMmSpiNorReq.PayLoad; + if (MmSpiNorFailSafeInfoRes->Status !=3D MM_SPINOR_RES_SUCCESS) { + DEBUG ((DEBUG_ERROR, "%a: Get flash information failed: %d\n", + __FUNCTION__, + MmSpiNorFailSafeInfoRes->Status)); + return EFI_DEVICE_ERROR; + } + + *Offset =3D MmSpiNorFailSafeInfoRes->FailSafeBase; + *Size =3D MmSpiNorFailSafeInfoRes->FailSafeSize; + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +FailSafeBootSuccessfully (VOID) +{ + EFI_MM_COMMUNICATE_SPINOR_RES *MmSpiNorRes; + UINT64 MmData[5]; + UINTN Size; + EFI_STATUS Status; + UINT64 FailSafeStartOffset; + UINT64 FailSafeSize; + + Status =3D FailSafeGetRegionInfo (&FailSafeStartOffset, &FailSafeSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get context region information\n",= __FUNCTION__)); + return EFI_DEVICE_ERROR; + } + + ASSERT (mFlashLibMmCommProtocol !=3D NULL); + + MmData[0] =3D MM_SPINOR_FUNC_ERASE; + MmData[1] =3D FailSafeStartOffset; + MmData[2] =3D FailSafeSize; + UefiMmCreateSpiNorReq ((VOID *) &MmData, sizeof (MmData)); + + Size =3D sizeof (EFI_MM_COMM_HEADER_NOPAYLOAD) + sizeof (MmData); + Status =3D mFlashLibMmCommProtocol->Communicate ( + mFlashLibMmCommProtocol, + (VOID *) &mEfiMmSpiNorReq, + &Size + ); + ASSERT_EFI_ERROR (Status); + + MmSpiNorRes =3D (EFI_MM_COMMUNICATE_SPINOR_RES *) &mEfiMmSpiNorReq.PayLo= ad; + if (MmSpiNorRes->Status !=3D MM_SPINOR_RES_SUCCESS) { + DEBUG ((DEBUG_ERROR, "%a: erase context failed: %d\n", + __FUNCTION__, + MmSpiNorRes->Status)); + return EFI_DEVICE_ERROR; + } + + return EFI_SUCCESS; +} + +UINT8 +FailSafeValidStatus ( + IN UINT8 Status + ) +{ + if ((Status =3D=3D FAILSAFE_BOOT_NORMAL) || + (Status =3D=3D FAILSAFE_BOOT_LAST_KNOWN_SETTINGS) || + (Status =3D=3D FAILSAFE_BOOT_DEFAULT_SETTINGS) || + (Status =3D=3D FAILSAFE_BOOT_SUCCESSFUL)) { + return 1; + } + + return 0; +} + +UINT64 +EFIAPI +FailSafeGetStatus (VOID) +{ + EFI_MM_COMMUNICATE_SPINOR_RES *MmSpiNorRes; + UINT64 MmData[5]; + UINTN Size; + EFI_STATUS Status; + UINT64 FailSafeStartOffset; + UINT64 FailSafeSize; + FailsafeCtx_t FailsafeBuf; + + Status =3D FailSafeGetRegionInfo (&FailSafeStartOffset, &FailSafeSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to get region information\n", __FUNCT= ION__)); + return EFI_DEVICE_ERROR; + } + + ASSERT (mFlashLibMmCommProtocol !=3D NULL); + + MmData[0] =3D MM_SPINOR_FUNC_READ; + MmData[1] =3D FailSafeStartOffset; + MmData[2] =3D (UINT64) sizeof (FailsafeCtx_t); + MmData[3] =3D (UINT64) &FailsafeBuf; + UefiMmCreateSpiNorReq ((VOID *)&MmData, sizeof(MmData)); + + Size =3D sizeof (EFI_MM_COMM_HEADER_NOPAYLOAD) + sizeof (MmData); + Status =3D mFlashLibMmCommProtocol->Communicate ( + mFlashLibMmCommProtocol, + (VOID *) &mEfiMmSpiNorReq, + &Size + ); + ASSERT_EFI_ERROR (Status); + + MmSpiNorRes =3D (EFI_MM_COMMUNICATE_SPINOR_RES *) &mEfiMmSpiNorReq.PayLo= ad; + if (MmSpiNorRes->Status !=3D MM_SPINOR_RES_SUCCESS) { + DEBUG ((DEBUG_ERROR, "%a: read context failed: %d\n", + __FUNCTION__, + MmSpiNorRes->Status)); + return EFI_DEVICE_ERROR; + } + + if (FailSafeValidStatus (FailsafeBuf.Status) =3D=3D 0) { + FailsafeBuf.Status =3D FAILSAFE_BOOT_NORMAL; + } + + return FailsafeBuf.Status; +} + +EFI_STATUS +EFIAPI +FailSafeTestBootFailure (VOID) +{ + EFI_STATUS Status; + UINT32 Value =3D 0; + + /* + * Simulate UEFI boot failure due to config wrong NVPARAM for + * testing failsafe feature + */ + Status =3D NVParamGet (NV_UEFI_FAILURE_FAILSAFE_OFFSET, NV_PERM_ALL, &Va= lue); + if (!EFI_ERROR (Status) && (Value =3D=3D 1)) { + while (1); + } + + return EFI_SUCCESS; +} --=20 2.17.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 (#68500): https://edk2.groups.io/g/devel/message/68500 Mute This Topic: https://groups.io/mt/78825481/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-