From nobody Sun May 12 09:29:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+66823+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66823+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1604070075; cv=none; d=zohomail.com; s=zohoarc; b=Sf8OxhYw1wJTg1VFzY1wwC5MtUZ//l1lv2HqzLLFvacMMD9SYfFZ4qVgqKzLSQ+P6YGJMDY8vVsQSscBpxGVzTRFsHua5Lp/tdDfyH78mtWZVVmKqHPHElTTS4al+j5NikDmlKxdZd+k8l4GmHoRff7uCr67jW+8KsI1X+FloJQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604070075; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=dwqr4B22NaxllNR00udKY1QWuWHWDokUr03/BGVgc7I=; b=VBadkbWT1o4VPY5u4xck1FgZQ0VwfTLj35f+2xA286UpdZNqNaZxI0GQ0wmuwgodjLlhNj7psQ54uq+HIryveAcsf1ZHVC5lyPQPLT84FVpuuz4ZdLKGTXHy4rLoxiUh30GtVBgauhqDrpwuqC1bo+pkhQTxf3Ai0UTGh1+oQyE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66823+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1604070075469295.9206806669034; Fri, 30 Oct 2020 08:01:15 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id MrRiYY1788612x8zuj6ag1lU; Fri, 30 Oct 2020 08:01:12 -0700 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web08.10497.1604046987144042202 for ; Fri, 30 Oct 2020 01:36:27 -0700 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id BC6E3143D; Fri, 30 Oct 2020 01:36:26 -0700 (PDT) X-Received: from usa.arm.com (a076764.blr.arm.com [10.162.16.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D281D3F719; Fri, 30 Oct 2020 01:36:24 -0700 (PDT) From: "Omkar Anand Kulkarni" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Leif Lindholm , Sami Mujawar , Jiewen Yao Subject: [edk2-devel] [PATCH 1/3] ArmPlatformPkg: Allow dynamic generation of HEST ACPI table Date: Fri, 30 Oct 2020 14:06:09 +0530 Message-Id: <20201030083611.8196-2-omkar.kulkarni@arm.com> In-Reply-To: <20201030083611.8196-1-omkar.kulkarni@arm.com> References: <20201030083611.8196-1-omkar.kulkarni@arm.com> MIME-Version: 1.0 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,omkar.kulkarni@arm.com X-Gm-Message-State: vAnJ3Vk5J5vxlN0SfLA5UXKJx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1604070072; bh=FENMjp9RpwMK0HP/DBO6ET0vOOmclrQPkLnTkhz3lfc=; h=Cc:Date:From:Reply-To:Subject:To; b=xQRZ/+I8geexkBzjSU7Wn/eqIhDYB3Y2F3aceh4PB/1NuFLXnAUiBjnzdzaqO5sDt8I 3+Zv9iYZ5+4PNg3iI7fbAaVqYHqt6xz4WBEJhFx3F/z+bcArXz5b/BnzA7G2x9QJcaIPX uRBd3TiVA3/MEG4VHpAk09+0FR7lIdoKI5A= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Introduce the HEST table generation protocol that allows platforms to build the table with multiple error source descriptors and install the table. The protocols provides two interfaces. The first interface allows for adding multiple error source descriptors into the HEST table. The second interface can then be used to dynamically installed the fully populated HEST table. This allows multiple drivers and/or libraries to dynamically register error source descriptors into the HEST table. Co-authored-by: Thomas Abraham Signed-off-by: Omkar Anand Kulkarni --- ArmPlatformPkg/ArmPlatformPkg.dec | 4 + ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.inf | 45 +++ ArmPlatformPkg/Include/Protocol/HestTable.h | 66 ++++ ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.c | 320 ++++++++++++++++++++ 4 files changed, 435 insertions(+) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dec b/ArmPlatformPkg/ArmPlatform= Pkg.dec index 696d636aacee..23c5b768f677 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dec +++ b/ArmPlatformPkg/ArmPlatformPkg.dec @@ -110,3 +110,7 @@ gArmPlatformTokenSpaceGuid.PcdPL031RtcPpmAccuracy|300000000|UINT32|0x000= 00022 =20 gArmPlatformTokenSpaceGuid.PcdWatchdogCount|0x0|UINT32|0x00000033 + +[Protocols.common] + ## Arm Platform HEST table generation protocol + gHestTableProtocolGuid =3D { 0x705bdcd9, 0x8c47, 0x457e, { 0xad, 0x0d, 0= xf7, 0x86, 0xf3, 0x4a, 0x0d, 0x63 } } diff --git a/ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.inf b/ArmPlatformP= kg/Drivers/Apei/HestDxe/HestDxe.inf new file mode 100644 index 000000000000..670f53476800 --- /dev/null +++ b/ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.inf @@ -0,0 +1,45 @@ +## @file +# DXE driver that creates and publishes the HEST ACPI table. +# +# Copyright (c) 2018-2020, ARM Limited. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D HestDxe + FILE_GUID =3D 933099a2-ef71-4e00-82aa-a79b1e0a3b38 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D HestInitialize + +[Sources.Common] + HestDxe.c + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Platform/ARM/SgiPkg/SgiPlatform.dec + +[LibraryClasses] + ArmLib + BaseMemoryLib + DebugLib + UefiDriverEntryPoint + UefiLib + +[Protocols] + gEfiAcpiTableProtocolGuid ## PROTOCOL ALWAYS_CONSUMED + gHestTableProtocolGuid ## PRODUCES + +[FixedPcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemTableId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision + +[Depex] + gEfiAcpiSdtProtocolGuid diff --git a/ArmPlatformPkg/Include/Protocol/HestTable.h b/ArmPlatformPkg/I= nclude/Protocol/HestTable.h new file mode 100644 index 000000000000..3905aab044dc --- /dev/null +++ b/ArmPlatformPkg/Include/Protocol/HestTable.h @@ -0,0 +1,66 @@ +/** @file + Provides protocol to create and install the HEST ACPI for the + platform. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef HEST_TABLE_H_ +#define HEST_TABLE_H_ + +#define HEST_TABLE_PROTOCOL_GUID \ + { \ + 0x705bdcd9, 0x8c47, 0x457e, \ + { 0xad, 0x0d, 0xf7, 0x86, 0xf3, 0x4a, 0x0d, 0x63 } \ + } + +/** + Append a list of error source descriptors to the HEST table. + + Allows error source list producer module to append its error source desc= riptors + into the HEST ACPI table being prepared for installation. + + @param[in] ErrorSourceDescriptorList List of Error Source Descriptor= s. + @param[in] ErrorSourceDescriptorListSize Total Size of the ErrorSourceDe= scriptorList. + @param[in] ErrorSourceDescriptorCount Total count of error source des= criptors in + ErrorSourceDescriptorList. + + @retval EFI_SUCCESS Appending the error source desc= riptors + successful. + @retval EFI_OUT_OF_RESOURCES Buffer reallocation failed for = the HEST + table. + @retval EFI_INVALID_PARAMETER Null ErrorSourceDescriptorList = param or + ErrorSourceDescriptorListSize i= s 0. + +**/ +typedef +EFI_STATUS +(EFIAPI *APPEND_ERROR_SOURCE_DESCRIPTOR) ( + IN CONST VOID *ErrorSourceDescriptorList, + IN UINTN ErrorSourceDescriptorListSize, + IN UINTN ErrorSourceDescriptorCount + ); + +/** + Install ACPI HEST table. + + @retval EFI_SUCCESS On ACPI HEST table installation success. + @retval Other On ACPI HEST table installation failure. + +**/ +typedef +EFI_STATUS +(EFIAPI *INSTALL_HEST_TABLE) (VOID); + +// +// HEST_TABLE_PROTOCOL enables creation and installation of HEST table +// +typedef struct { + APPEND_ERROR_SOURCE_DESCRIPTOR AppendErrorSourceDescriptors; + INSTALL_HEST_TABLE InstallHestTable; +} HEST_TABLE_PROTOCOL; + +extern EFI_GUID gHestTableProtocolGuid; +#endif // HEST_TABLE_H_ diff --git a/ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.c b/ArmPlatformPkg= /Drivers/Apei/HestDxe/HestDxe.c new file mode 100644 index 000000000000..35de14aaf05c --- /dev/null +++ b/ArmPlatformPkg/Drivers/Apei/HestDxe/HestDxe.c @@ -0,0 +1,320 @@ +/** @file + Builds and installs the HEST ACPI table. + + This driver installs a protocol that can be used to create and install a= HEST + ACPI table. The protocol allows one or more error source producers to ad= d the + error source descriptors into the HEST table. It also allows the resulti= ng HEST + ACPI table to be installed. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +typedef struct { + VOID *HestTable; /// Pointer to HEST ACPI table. + UINT32 CurrentTableSize; /// Current size of HEST ACPI table. +} HEST_DXE_DRIVER_DATA; + +STATIC EFI_ACPI_TABLE_PROTOCOL *mAcpiTableProtocol =3D NULL; +STATIC HEST_DXE_DRIVER_DATA mHestDriverData; + +/** + Helper function to reallocate memory pool for every new error source des= criptor + added. + + @param[in] OldTableSize Old memory pool size. + @param[in] NewTableSize Required memory pool size. + @param[in, out] OldBuffer Current memory buffer pointer holding the = HEST + table data. + + @retval New pointer to reallocated memory pool. + +**/ +STATIC +VOID* +ReallocateHestTableMemory ( + IN UINT32 OldTableSize, + IN UINT32 NewTableSize, + IN OUT VOID *OldBuffer + ) +{ + return ReallocateReservedPool ( + OldTableSize, + NewTableSize, + OldBuffer + ); +} + +/** + Allocate memory for the HEST ACPI table header and populate it. + + @retval EFI_SUCCESS On successful creation of HEST header. + @retval EFI_OUT_OF_RESOURCES If system is out of memory recources. + +**/ +STATIC +EFI_STATUS +BuildHestHeader (VOID) +{ + EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER HestHeader; + UINT64 TempOemTableId; + + // + // Allocate memory for the HEST ACPI table header. + // + mHestDriverData.HestTable =3D + ReallocateHestTableMemory ( + 0, + sizeof (EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER), + NULL + ); + if (mHestDriverData.HestTable =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + mHestDriverData.CurrentTableSize =3D + sizeof (EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER); + + // + // Populate the values of the HEST ACPI table header. + // + HestHeader.Header.Signature =3D EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE= _SIGNATURE; + HestHeader.Header.Revision =3D EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_= REVISION; + CopyMem ( + &HestHeader.Header.OemId, + FixedPcdGetPtr (PcdAcpiDefaultOemId), + sizeof (HestHeader.Header.OemId) + ); + TempOemTableId =3D FixedPcdGet64 (PcdAcpiDefaultOemTableId); + CopyMem ( + &HestHeader.Header.OemTableId, + &TempOemTableId, + sizeof (HestHeader.Header.OemTableId) + ); + HestHeader.Header.OemRevision =3D PcdGet32 (PcdAcpiDefaultOemRevision); + HestHeader.Header.CreatorId =3D PcdGet32 (PcdAcpiDefaultCreatorId); + HestHeader.Header.CreatorRevision =3D PcdGet32 (PcdAcpiDefaultCreatorRev= ision); + HestHeader.ErrorSourceCount =3D 0; + CopyMem (mHestDriverData.HestTable, &HestHeader, sizeof (HestHeader)); + + return EFI_SUCCESS; +} + +/** + Append HEST error source descriptor protocol service. + + @param[in] ErrorSourceDescriptorList List of Error Source Descriptor= s. + @param[in] ErrorSourceDescriptorListSize Total Size of the ErrorSourceDe= scriptorList. + @param[in] ErrorSourceDescriptorCount Total count of error source des= criptors in + ErrorSourceDescriptorList. + + @retval EFI_SUCCESS Appending the error source desc= riptors + successful. + @retval EFI_OUT_OF_RESOURCES Buffer reallocation failed for = the HEST + table. + @retval EFI_INVALID_PARAMETER Null ErrorSourceDescriptorList = param or + ErrorSourceDescriptorListSize i= s 0. + +**/ +STATIC +EFI_STATUS +EFIAPI +AppendErrorSourceDescriptor ( + IN CONST VOID *ErrorSourceDescriptorList, + IN UINTN ErrorSourceDescriptorListSize, + IN UINTN ErrorSourceDescriptorCount + ) +{ + EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeaderPtr; + EFI_STATUS Status; + UINT32 NewTableSize; + VOID *ErrorDescriptorPtr; + + if ((ErrorSourceDescriptorList =3D=3D NULL) + || (ErrorSourceDescriptorListSize =3D=3D 0)) { + return EFI_INVALID_PARAMETER; + } + + // + // Create a HEST table header if not already created. + // + if (mHestDriverData.HestTable =3D=3D NULL) { + Status =3D BuildHestHeader (); + if (Status =3D=3D EFI_OUT_OF_RESOURCES) { + DEBUG ((DEBUG_ERROR, "HestDxe: Failed to build HEST header, status: = %r\n", + Status)); + return Status; + } + } + + // + // Resize the existing HEST table buffer to accommodate the incoming err= or source + // descriptors. + // + NewTableSize =3D mHestDriverData.CurrentTableSize + + ErrorSourceDescriptorListSize; + mHestDriverData.HestTable =3D ReallocateHestTableMemory ( + mHestDriverData.CurrentTableSize, + NewTableSize, + mHestDriverData.HestTable + ); + if (mHestDriverData.HestTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "HestDxe: Failed to reallocate memory for HEST ta= ble\n")); + return EFI_OUT_OF_RESOURCES; + } + + // + // Copy the incoming error source descriptors into HEST table. + // + ErrorDescriptorPtr =3D (VOID *)mHestDriverData.HestTable + + mHestDriverData.CurrentTableSize; + HestHeaderPtr =3D (EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER *) + mHestDriverData.HestTable; + CopyMem ( + ErrorDescriptorPtr, + ErrorSourceDescriptorList, + ErrorSourceDescriptorListSize + ); + mHestDriverData.CurrentTableSize =3D NewTableSize; + HestHeaderPtr->Header.Length =3D mHestDriverData.CurrentTableSize; + HestHeaderPtr->ErrorSourceCount +=3D ErrorSourceDescriptorCount; + + DEBUG ((DEBUG_INFO, "HestDxe: %d Error source descriptor(s) added \n", + ErrorSourceDescriptorCount)); + return EFI_SUCCESS; +} + +/** + Install HEST ACPI table protocol service. + + @retval EFI_SUCCESS ACPI HEST table is installed successfully. + @retval EFI_ABORTED HEST table is NULL. + @retval Other Install HEST ACPI table failed. + +**/ +STATIC +EFI_STATUS +EFIAPI +InstallHestAcpiTable (VOID) +{ + EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader; + EFI_STATUS Status; + UINTN AcpiTableHandle; + + // + // Check if we have valid HEST table data. + // + if (mHestDriverData.HestTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "HestDxe: No data available to generate HEST tabl= e\n")); + return EFI_ABORTED; + } + + // + // Valid data for HEST table found. Update the header checksum and insta= ll the + // HEST table. + // + HestHeader =3D (EFI_ACPI_6_3_HARDWARE_ERROR_SOURCE_TABLE_HEADER *) + mHestDriverData.HestTable; + HestHeader->Header.Checksum =3D CalculateCheckSum8 ( + (UINT8 *)HestHeader, + HestHeader->Header.Length + ); + + Status =3D mAcpiTableProtocol->InstallAcpiTable ( + mAcpiTableProtocol, + HestHeader, + HestHeader->Header.Length, + &AcpiTableHandle + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "HestDxe: HEST ACPI table installation failed, st= atus: %r\n", + Status)); + return Status; + } + + // + // Free the HEST table buffer. + // + FreePool (mHestDriverData.HestTable); + DEBUG ((DEBUG_INFO, "HestDxe: Installed HEST ACPI table \n")); + return EFI_SUCCESS; +} + +// +// HEST table generation protocol instance. +// +STATIC HEST_TABLE_PROTOCOL mHestProtocol =3D { + AppendErrorSourceDescriptor, + InstallHestAcpiTable +}; + +/** + The Entry Point for HEST DXE driver. + + This function installs the HEST table creation and installation protocol + services. + + @param[in] ImageHandle Handle to the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS On successful installation of protocol services a= nd + location the Acpi table protocol. + @retval Other On Failure to locate ACPI table protocol or insta= ll + of HEST table generation protocol. + +**/ +EFI_STATUS +EFIAPI +HestInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_HANDLE Handle =3D NULL; + EFI_STATUS Status; + + Status =3D gBS->LocateProtocol ( + &gEfiAcpiTableProtocolGuid, + NULL, + (VOID **)&mAcpiTableProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "HestDxe: Failed to locate ACPI table protocol, status: %r\n", + Status + )); + return Status; + } + + Status =3D gBS->InstallProtocolInterface ( + &Handle, + &gHestTableProtocolGuid, + EFI_NATIVE_INTERFACE, + &mHestProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "HestDxe: Failed to install HEST table generation protocol status: %= r\n", + Status + )); + return Status; + } + + 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 (#66823): https://edk2.groups.io/g/devel/message/66823 Mute This Topic: https://groups.io/mt/77913841/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- From nobody Sun May 12 09:29:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+66824+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66824+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1604070046; cv=none; d=zohomail.com; s=zohoarc; b=oKe0ct92OifXCrbCQd9kZQVwWxrmm+J4SbHFL1RG72ImTwCYhyzYcKrF3/uagJgVl9DbegoVv0Z+aAM/YpTrqaf6UvzeG3JXgYV6pDZdH+In5jrkd5mK79WjH9oB//7lWa3g2rBcRTA55XpGn4T1GfktxiuyHOhUf53CN+WMQug= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604070046; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=Bw//StHj0CjGaHQSoHVW6pZj5QU/ruK9zpDCrDu3hTY=; b=Ejaoda3W/mi4ZTR9QKvNzo6f4RPefltNLniDJBMOR1HgrK20uIM/PQmbhkom0+fI/bBTSAqBudo3Gkj8XhDqc/N7qYPybScFV8vx42R+8numZZFTOdatNWY+sG76piBE0wOR5mUHvq0iIeN5VIvLQgFZ0CdXKgaAsH/al4Gvdfg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66824+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1604070046106190.0567394398854; Fri, 30 Oct 2020 08:00:46 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id WtnoYY1788612xy35jKGYBJv; Fri, 30 Oct 2020 08:00:43 -0700 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.10669.1604046989300503617 for ; Fri, 30 Oct 2020 01:36:29 -0700 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id D411ED6E; Fri, 30 Oct 2020 01:36:28 -0700 (PDT) X-Received: from usa.arm.com (a076764.blr.arm.com [10.162.16.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 373F83F719; Fri, 30 Oct 2020 01:36:26 -0700 (PDT) From: "Omkar Anand Kulkarni" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Leif Lindholm , Sami Mujawar , Jiewen Yao Subject: [edk2-devel] [PATCH 2/3] ArmPlatformPkg: add definition for MM_HEST_ERROR_SOURCE_DESC_PROTOCOL Date: Fri, 30 Oct 2020 14:06:10 +0530 Message-Id: <20201030083611.8196-3-omkar.kulkarni@arm.com> In-Reply-To: <20201030083611.8196-1-omkar.kulkarni@arm.com> References: <20201030083611.8196-1-omkar.kulkarni@arm.com> MIME-Version: 1.0 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,omkar.kulkarni@arm.com X-Gm-Message-State: vFHUXoOWcRG2cb7yWmHkbm6px1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1604070043; bh=NiQiKYOMqgEEu9bFcZFNMCAHDhtXJE3givCOnPVW0fs=; h=Cc:Date:From:Reply-To:Subject:To; b=NNXDwrIE39CgaSo3+0SOR6awSVSo81F+OXmTokMc9Gp3VlF6jnnxCqsoOn7x7G1UhIU OGqbOoiZx/R6ZdNKXT+L2cE2s5sQkzDYcI0pfKn5mMzA/F3iFxgRDcUBf7ySf+el5ob8N Q5PLP7mIGM3wWuDEf0Qf6cvM5iGLsuwANI8= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Add the protocol definition of the MM_HEST_ERROR_SOURCE_DESC_PROTOCOL protocol. This protocol can be implemented by MM drivers to publish error source descriptors that have to be populated into HEST table. Co-authored-by: Thomas Abraham Signed-off-by: Omkar Anand Kulkarni --- ArmPlatformPkg/ArmPlatformPkg.dec | 1 + ArmPlatformPkg/Include/Protocol/HestErrorSourceInfo.h | 64 +++++++++++++++= +++++ 2 files changed, 65 insertions(+) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dec b/ArmPlatformPkg/ArmPlatform= Pkg.dec index 23c5b768f677..8fc44c40e813 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dec +++ b/ArmPlatformPkg/ArmPlatformPkg.dec @@ -114,3 +114,4 @@ [Protocols.common] ## Arm Platform HEST table generation protocol gHestTableProtocolGuid =3D { 0x705bdcd9, 0x8c47, 0x457e, { 0xad, 0x0d, 0= xf7, 0x86, 0xf3, 0x4a, 0x0d, 0x63 } } + gMmHestErrorSourceDescProtocolGuid =3D { 0x560bf236, 0xa4a8, 0x4d69, { 0= xbc, 0xf6, 0xc2, 0x97, 0x24, 0x10, 0x9d, 0x91 } } diff --git a/ArmPlatformPkg/Include/Protocol/HestErrorSourceInfo.h b/ArmPla= tformPkg/Include/Protocol/HestErrorSourceInfo.h new file mode 100644 index 000000000000..396a7cc48ee9 --- /dev/null +++ b/ArmPlatformPkg/Include/Protocol/HestErrorSourceInfo.h @@ -0,0 +1,64 @@ +/** @file + Standalone MM protocol to get the HEST secure error source descriptor + information. + + Drivers must implement his protocol in order to pusblih their Hardware + error source descriptor information to OS through the HEST ACPI table. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef MM_HEST_ERROR_SOURCE_DESC_ +#define MM_HEST_ERROR_SOURCE_DESC_ + +#define MM_HEST_ERROR_SOURCE_DESC_PROTOCOL_GUID \ + { \ + 0x560bf236, 0xa4a8, 0x4d69, { 0xbc, 0xf6, 0xc2, 0x97, 0x24, 0x10, 0x9d= , 0x91 } \ + } + +typedef struct MM_HEST_ERROR_SOURCE_DESC_PROTOCOL_ + MM_HEST_ERROR_SOURCE_DESC_PROTOCOL; + +/** + Get HEST Secure Error Source Descriptors. + + The drivers implementing this protocol must convey the total count and t= otal + length of the error sources the driver has along with the actual error s= ource + descriptors. + If the user of this driver calls the protocol by passing NULL as Buffer = parameter. + Then protocol shall return EFI_INVALID_PARAMETR with the total length an= d count of + the error source descriptor it supports. + + @param[in] This Instance of MM_HEST_ERROR_SOURCE_DESC_PRO= TOCOL. + @param[out] Buffer Buffer to be appended with the error sour= ce descriptors information. + @param[out] ErrorSourcesLength Total length of all the error source desc= riptors. + @param[out] ErrorSourceCount Count of total error source descriptors s= upported by the + driver. + + retval EFI_SUCCESS If the Buffer is valid and is filled with= valid Error Source + descriptor data. + retval EFI_INVALID_PARAMTER Buffer is NULL. + retval Other If no error source descriptor information= is available. + +**/ +typedef +EFI_STATUS +(EFIAPI *MM_HEST_GET_ERROR_SOURCE_DESCRIPTORS) ( + IN MM_HEST_ERROR_SOURCE_DESC_PROTOCOL *This, + OUT VOID **Buffer, + OUT UINTN *ErrorSourcesLength, + OUT UINTN *ErrorSourcesCount + ); + +// +// Protocol declaration +// +struct MM_HEST_ERROR_SOURCE_DESC_PROTOCOL_ { + MM_HEST_GET_ERROR_SOURCE_DESCRIPTORS GetHestErrorSourceDescriptors; +}; + +extern EFI_GUID gMmHestErrorSourceDescProtocolGuid; + +#endif // MM_HEST_ERROR_SOURCE_DESC_ --=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 (#66824): https://edk2.groups.io/g/devel/message/66824 Mute This Topic: https://groups.io/mt/77913842/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- From nobody Sun May 12 09:29:30 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+66825+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66825+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=arm.com ARC-Seal: i=1; a=rsa-sha256; t=1604070048; cv=none; d=zohomail.com; s=zohoarc; b=U55dakfTa3Pr1Iu06xWjU8n8/dQPx8tnPasF+7QPqlPM+MKanBvkOxbRSv2+k4GcJydZdJrfdHKunysilmVfqULCK9lC8clAObPLjM6CUsv5ui2Uy3zxp/SGqT129hdl1R+69Azrw7kWFHbvrK6L+r7a7rcyfwUGg+8RRndC5pM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1604070048; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=tROij6kjcxY3vuPJVGQlSIsJSsGGwhl+Ii/rxocUBoc=; b=Ct6puAw68X01gejJ+x6RgXb/vyPZDuGZnmhwUCFwoEqXNQiQlyriwaZkRHgCkgK8TznNb4dlIdok6noauWw+ZjUwBiBUzBCpdLcDcCu965SyRM0Zqyev81ngRe90XzdSRhjmTfgp3U164Y6QUoOtO+BtE+sNQQR9nJNOeVAkkF8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+66825+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1604070048675912.4293224893934; Fri, 30 Oct 2020 08:00:48 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id tTa7YY1788612xxFRzVqu1I4; Fri, 30 Oct 2020 08:00:46 -0700 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.10670.1604046991475943201 for ; Fri, 30 Oct 2020 01:36:31 -0700 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2F928143D; Fri, 30 Oct 2020 01:36:31 -0700 (PDT) X-Received: from usa.arm.com (a076764.blr.arm.com [10.162.16.42]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 4E9DB3F719; Fri, 30 Oct 2020 01:36:29 -0700 (PDT) From: "Omkar Anand Kulkarni" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Leif Lindholm , Sami Mujawar , Jiewen Yao Subject: [edk2-devel] [PATCH 3/3] ArmPlatformPkg: retreive error source descriptors from MM Date: Fri, 30 Oct 2020 14:06:11 +0530 Message-Id: <20201030083611.8196-4-omkar.kulkarni@arm.com> In-Reply-To: <20201030083611.8196-1-omkar.kulkarni@arm.com> References: <20201030083611.8196-1-omkar.kulkarni@arm.com> MIME-Version: 1.0 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,omkar.kulkarni@arm.com X-Gm-Message-State: TLhgsQnptog3qfgrdoM7QvKrx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1604070046; bh=fdwh8SjyREhK5ISb7cY1WI3VrgyH98eZOQI0Rpya3lU=; h=Cc:Date:From:Reply-To:Subject:To; b=EpIp8zulldDVSOKauH/gOtLugxannDmtCDe+TJRYO2n4pJoxC0icAxXTB9i+qiTpEfL 2+d8/Dnoca2/6bmw8Tqv/y+21he+cQAX5NgYp88FUZ/tJBRNYkdtaQnCeb4LRlw+ly9/J BckWtvX1+yau7deojuTUgy4f2AMk6WocXww= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Add a driver that retreives error source descriptors from MM and populates those into the HEST ACPI table. The error source descriptors that are available from the MM side are retreived using MM Communicate 2 protocol. The first call into the MM returns the size of MM Communicate buffer required to hold all error source descriptor info. The communication buffer of that size is then allocated and the second call into MM returns the error source descriptors in the communication buffer. The retreived error source descriptors are then appended to the HEST table. Co-authored-by: Thomas Abraham Signed-off-by: Omkar Anand Kulkarni --- ArmPlatformPkg/ArmPlatformPkg.dec = | 7 + ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.inf = | 41 +++ ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStandaloneMm.inf = | 51 ++++ ArmPlatformPkg/Drivers/HestMmErrorSources/HestMmErrorSourceCommon.h = | 33 +++ ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.c = | 257 ++++++++++++++++++ ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStandaloneMm.c = | 282 ++++++++++++++++++++ 6 files changed, 671 insertions(+) diff --git a/ArmPlatformPkg/ArmPlatformPkg.dec b/ArmPlatformPkg/ArmPlatform= Pkg.dec index 8fc44c40e813..3c12d795121e 100644 --- a/ArmPlatformPkg/ArmPlatformPkg.dec +++ b/ArmPlatformPkg/ArmPlatformPkg.dec @@ -35,6 +35,8 @@ =20 [Guids.common] gArmPlatformTokenSpaceGuid =3D { 0x9c0aaed4, 0x74c5, 0x4043, { 0xb4, 0= x17, 0xa3, 0x22, 0x38, 0x14, 0xce, 0x76 } } + gArmPlatformHestErrorSourcesGuid =3D { 0x76b8ab43, 0x822d, 0x4b00, { 0x9= f, 0xd0, 0xf4, 0xa5, 0x35, 0x82, 0x47, 0x0a } } + gMmHestGetErrorSourceInfoGuid =3D { 0x7d602951, 0x678e, 0x4cc4, { 0x98, = 0xd9, 0xe3, 0x76, 0x04, 0xf6, 0x93, 0x0d } } =20 [PcdsFeatureFlag.common] gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|FALSE|BOOLE= AN|0x00000004 @@ -111,6 +113,11 @@ =20 gArmPlatformTokenSpaceGuid.PcdWatchdogCount|0x0|UINT32|0x00000033 =20 +[PcdsFixedAtBuild, PcdsPatchableInModule] + ## ACPI CPER memory space + gArmPlatformTokenSpaceGuid.PcdGhesGenericErrorDataMmBufferBase|0x0000000= 0|UINT64|0x00000046 + gArmPlatformTokenSpaceGuid.PcdGhesGenericErrorDataMmBufferSize|0x0000000= 0|UINT64|0x00000047 + [Protocols.common] ## Arm Platform HEST table generation protocol gHestTableProtocolGuid =3D { 0x705bdcd9, 0x8c47, 0x457e, { 0xad, 0x0d, 0= xf7, 0x86, 0xf3, 0x4a, 0x0d, 0x63 } } diff --git a/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.i= nf b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.inf new file mode 100644 index 000000000000..514f60fbafd4 --- /dev/null +++ b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.inf @@ -0,0 +1,41 @@ +## @file +# DXE driver to retrieve the error source descriptors from Standalone MM = and append +# those to the HEST table. +# +# Copyright (c) 2020, ARM Limited. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D HestMmErrorSourceDxe + FILE_GUID =3D 76b8ab43-822d-4b00-9fd0-f4a53582470a + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D HestErrorSourceInitialize + +[Sources.common] + HestErrorSourceDxe.c + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdePkg/MdePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + DxeServicesTableLib + UefiDriverEntryPoint + UefiLib + +[Guids] + gMmHestGetErrorSourceInfoGuid ## PRODUCES + +[Protocols] + gHestTableProtocolGuid ## CONSUMES + gEfiMmCommunication2ProtocolGuid + +[Depex] + gHestTableProtocolGuid AND gEfiMmCommunication2ProtocolGuid diff --git a/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStand= aloneMm.inf b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStan= daloneMm.inf new file mode 100644 index 000000000000..cf215ddd8d50 --- /dev/null +++ b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStandaloneMm= .inf @@ -0,0 +1,51 @@ +## @file +# HEST error source gateway Standalone MM driver. +# +# Collects HEST error source descriptors,by communicating with all the MM= drivers +# implementing the HEST error source descriptor protocol. +# +# Copyright (c) 2020, ARM Limited. All rights reserved. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D HestErrorSourceStandaloneMm + FILE_GUID =3D 3ddbebcc-9841-4ef8-87fa-305843c1922d + MODULE_TYPE =3D MM_STANDALONE + VERSION_STRING =3D 1.0 + PI_SPECIFICATION_VERSION =3D 0x00010032 + ENTRY_POINT =3D StandaloneMmHestErrorSourceInitialize + +[Sources] + HestErrorSourceStandaloneMm.c + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + StandaloneMmPkg/StandaloneMmPkg.dec + +[LibraryClasses] + ArmLib + ArmSvcLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + StandaloneMmDriverEntryPoint + +[Protocols] + gMmHestErrorSourceDescProtocolGuid + +[Guids] + gMmHestGetErrorSourceInfoGuid ##PRODUCES + gEfiStandaloneMmNonSecureBufferGuid + +[FixedPcd] + gArmPlatformTokenSpaceGuid.PcdGhesGenericErrorDataMmBufferBase + gArmPlatformTokenSpaceGuid.PcdGhesGenericErrorDataMmBufferSize + +[Depex] + gMmHestErrorSourceDescProtocolGuid diff --git a/ArmPlatformPkg/Drivers/HestMmErrorSources/HestMmErrorSourceCom= mon.h b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestMmErrorSourceCommon.h new file mode 100644 index 000000000000..2929f05607ac --- /dev/null +++ b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestMmErrorSourceCommon.h @@ -0,0 +1,33 @@ +/** @file + Define data structure for error source descriptor information. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef HEST_ERROR_SOURCE_DESCRIPTOR_H_ +#define HEST_ERROR_SOURCE_DESCRIPTOR_H_ + +#define HEST_ERROR_SOURCE_DESC_INFO_SIZE (OFFSET_OF (HEST_ERROR_SOURCE_DES= C_INFO, ErrSourceDescList)) + +// +// Data Structure to communicate the error source descriptor information f= rom +// Standalone MM. +// +typedef struct { + // + // Total count of error source descriptors. + // + UINTN ErrSourceDescCount; + // + // Total size of all the error source descriptors. + // + UINTN ErrSourceDescSize; + // + // Array of error source descriptors that is ErrSourceDescSize in size. + // + UINT8 ErrSourceDescList[1]; +} HEST_ERROR_SOURCE_DESC_INFO; + +#endif // HEST_ERROR_SOURCE_DESCRIPTOR_H_ diff --git a/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.c= b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.c new file mode 100644 index 000000000000..539424f2f4d6 --- /dev/null +++ b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceDxe.c @@ -0,0 +1,257 @@ +/** @file + Collects and appends the HEST error source descriptors from the MM drive= rs. + + The drivers entry point locates the MM Communication protocol and calls = into + Standalone MM to get the HEST error sources length and count. It also + retrieves descriptor information. + The information is then used to build the HEST table using the HEST table + generation protocol. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "HestMmErrorSourceCommon.h" + +#define MM_COMMUNICATE_HEADER_SIZE (OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, = Data)) + +STATIC HEST_TABLE_PROTOCOL *mHestProtocol; +STATIC EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2; + +/** + Retrieve the error source descriptors from Standalone MM. + + Initialize the MM comminication buffer by assigning the MM service to + invoke as gMmHestGetErrorSourceInfoGuid. Use the MM communication + protocol to retrieve the error source descriptors. + + @param[in] CommBuffSize Size of communicate buffer. + @param[in, out] CommBuffer The communicate buffer. + + @retval EFI_SUCCESS MM Communicate protocol call successful. + @retval Other MM Communicate protocol call failed. + +**/ +STATIC +EFI_STATUS +GetErrorSourceDescriptors ( + IN UINTN CommBuffSize, + IN OUT EFI_MM_COMMUNICATE_HEADER **CommBuffer + ) +{ + EFI_STATUS Status; + + // + // Initialize the CommBuffer with MM Communicate metadata. + // + CopyGuid (&(*CommBuffer)->HeaderGuid, &gMmHestGetErrorSourceInfoGuid); + (*CommBuffer)->MessageLength =3D + CommBuffSize - + sizeof ((*CommBuffer)->HeaderGuid) - + sizeof ((*CommBuffer)->MessageLength); + + // + // Call into the Standalone MM using the MM Communicate protocol. + // + Status =3D mMmCommunication2->Communicate ( + mMmCommunication2, + (VOID *)*CommBuffer, + (VOID *)*CommBuffer, + NULL + ); + + return Status; +} + +/** + Collect HEST error source descriptors from all Standalone MM drivers and= append + them to the HEST table. + + Use MM Communication Protocol to communicate and collect the error source + descriptor information from Standalone MM. Check for the required buffer= size + returned by the MM driver. Allocate buffer of adequate size and call aga= in into + MM. + + @retval EFI_SUCCESS Successful to collect and append the error = source + descriptors to HEST table. + @retval EFI_OUT_OF_RESOURCES Memory allocation failure. + @retval Other For any other error. + +**/ +STATIC +EFI_STATUS +AppendMmErrorSources (VOID) +{ + EFI_MM_COMMUNICATE_HEADER *CommunicationHeader =3D NULL; + HEST_ERROR_SOURCE_DESC_INFO *ErrorSourceDescInfo; + EFI_STATUS Status; + UINTN CommBufferSize; + + // + // Find out the number of error source descriptors that StandaloneMM sup= ports + // and length of the buffer to be supplied to retrieve those error source + // descriptors. Do this by providing a buffer of size that is just suffi= cient + // to hold the error source descriptor info. In response to this, the er= ror + // source descriptor that is returned contains the actual size of the + // communication buffer that is required to retrieve all the error sourc= es. + // + CommBufferSize =3D MM_COMMUNICATE_HEADER_SIZE + HEST_ERROR_SOURCE_DESC_I= NFO_SIZE; + CommunicationHeader =3D AllocatePool (CommBufferSize); + if (CommunicationHeader =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // Call to retrieve the length of required buffer. + Status =3D GetErrorSourceDescriptors (CommBufferSize, &CommunicationHead= er); + if ((EFI_ERROR (Status)) && + (Status !=3D EFI_BAD_BUFFER_SIZE)) { + DEBUG ((DEBUG_ERROR, "MM Communicate protocol call failed, status: %r\= n", + Status)); + FreePool (CommunicationHeader); + return Status; + } + + // Check for the length of Error Source descriptors. + ErrorSourceDescInfo =3D (HEST_ERROR_SOURCE_DESC_INFO *)(CommunicationHea= der->Data); + if ((ErrorSourceDescInfo->ErrSourceDescSize =3D=3D 0) || + (ErrorSourceDescInfo->ErrSourceDescCount =3D=3D 0)) { + DEBUG ((DEBUG_INFO, "HEST error source(s) not found\n")); + FreePool (CommunicationHeader); + return EFI_SUCCESS; + } + + // + // Allocate CommBuffer of required size to accomodate all the error sour= ce + // descriptors. Required size of communication buffer =3D + // MM communicate metadata. + (error source desc info struct + error sou= rce + // descriptor size) + // + CommBufferSize =3D + MM_COMMUNICATE_HEADER_SIZE + + HEST_ERROR_SOURCE_DESC_INFO_SIZE + + ErrorSourceDescInfo->ErrSourceDescSize; + + // Free old MM Communicate buffer and allocate a new buffer of required = size. + FreePool (CommunicationHeader); + CommunicationHeader =3D AllocatePool (CommBufferSize); + if (CommunicationHeader =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // Call to get the error source descriptors. + Status =3D GetErrorSourceDescriptors (CommBufferSize, &CommunicationHead= er); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "MM Communicate protocol failed, status: %r\n", + Status)); + FreePool (CommunicationHeader); + return Status; + } + + // + // Retrieve the HEST error source descriptor information. Ensure that th= ere + // is a valid list of error source descriptors. + // + ErrorSourceDescInfo =3D (HEST_ERROR_SOURCE_DESC_INFO *)(CommunicationHea= der->Data); + if (ErrorSourceDescInfo->ErrSourceDescList =3D=3D NULL) { + DEBUG ((DEBUG_INFO, "Error source descriptor list is empty")); + FreePool (CommunicationHeader); + return EFI_SUCCESS; + } + + DEBUG ((DEBUG_INFO, "HEST ErrorSources: TotalCount =3D %d TotalLength = =3D %d \n", + ErrorSourceDescInfo->ErrSourceDescCount, + ErrorSourceDescInfo->ErrSourceDescSize)); + // + // Append the error source descriptors to HEST table using the HEST table + // generation protocol. + // + Status =3D mHestProtocol->AppendErrorSourceDescriptors ( + ErrorSourceDescInfo->ErrSourceDescList, + ErrorSourceDescInfo->ErrSourceDescSize, + ErrorSourceDescInfo->ErrSourceDescCount + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to append error source(s), status: %r\n", + Status)); + } + + FreePool (CommunicationHeader); + return Status; +} + +/** + The Entry Point for Hest Error Source DXE driver. + + Locates the Hest Table generation and MM Communication2 protocols. Using= the + MM Communication2, the driver collects the Error Source Descriptor(s) fr= om + Standalone MM. It then appends those Error Source Descriptor(s) to the H= est + table using the Hest Table generation protocol. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Other Some error occurred when executing this entry poi= nt. + +**/ +EFI_STATUS +EFIAPI +HestErrorSourceInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status =3D gBS->LocateProtocol ( + &gHestTableProtocolGuid, + NULL, + (VOID **)&mHestProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "Failed to locate HEST table generation protocol, status:%r\n", + Status + )); + return Status; + } + + Status =3D gBS->LocateProtocol ( + &gEfiMmCommunication2ProtocolGuid, + NULL, + (VOID **)&mMmCommunication2 + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "Failed to locate MMCommunication2 driver protocol, status:%r\n", + Status + )); + return Status; + } + + // + // Append HEST error sources retrieved from StandaloneMM, if any, into t= he HEST + // ACPI table. + // + Status =3D AppendMmErrorSources (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "HEST table creation faied, status:%r\n", + Status)); + } + + return EFI_SUCCESS; +} diff --git a/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStand= aloneMm.c b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStanda= loneMm.c new file mode 100644 index 000000000000..9d0c1f744579 --- /dev/null +++ b/ArmPlatformPkg/Drivers/HestMmErrorSources/HestErrorSourceStandaloneMm= .c @@ -0,0 +1,282 @@ +/** @file + MM HEST error source gateway driver. + + This driver installs a handler which can be used to retrieve the error s= ource + descriptors from the all MM drivers implementing the HEST error source + descriptor protocol. + + Copyright (c) 2020, ARM Limited. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include + +#include +#include "HestMmErrorSourceCommon.h" + +STATIC EFI_MM_SYSTEM_TABLE *mMmst =3D NULL; + +/** + Returns an array of handles that implement the HEST error source descrip= tor + protocol. + + Passing HandleBuffer as NULL will return the actual size of the buffer + required to hold the array of handles implementing the protocol. + + @param[in, out] HandleBufferSize The size of the HandleBuffer. + @param[out] HandleBuffer A pointer to the buffer containing the= list + of handles. + + @retval EFI_SUCCESS The array of handles returned in HandleBuf= fer. + @retval EFI_NOT_FOUND No implementation present for the protocol. + @retval Other For any other error. + +**/ +STATIC +EFI_STATUS +GetHestErrorSourceProtocolHandles ( + IN OUT UINTN *HandleBufferSize, + OUT EFI_HANDLE **HandleBuffer + ) +{ + EFI_STATUS Status; + + Status =3D mMmst->MmLocateHandle ( + ByProtocol, + &gMmHestErrorSourceDescProtocolGuid, + NULL, + HandleBufferSize, + *HandleBuffer + ); + if ((EFI_ERROR (Status)) && + (Status !=3D EFI_BUFFER_TOO_SMALL)) + { + DEBUG (( + DEBUG_ERROR, + "No implementation of MmHestErrorSourceDescProtocol found, Status:%r= \n", + Status + )); + return EFI_NOT_FOUND; + } + + return Status; +} + +/** + MMI handler to retrieve HEST error source descriptor information. + + Handler for MMI service that returns the supported HEST error source + descriptors in MM. This handler populates the CommBuffer with the + list of all error source descriptors, prepended with the length and + the number of descriptors populated into CommBuffer. + + @param[in] DispatchHandle The unique handle assigned to this handle= r by + MmiHandlerRegister(). + @param[in] Context Points to an optional handler context whi= ch was + specified when the handler was registered. + @param[in, out] CommBuffer Buffer used for communication of HEST er= ror + source descriptors. + @param[in, out] CommBufferSize The size of the CommBuffer. + + @return EFI_SUCCESS CommBuffer has valid data. + @return EFI_BAD_BUFFER_SIZE CommBufferSize not adequate. + @return EFI_OUT_OF_RESOURCES System out of memory resources. + @retval EFI_INVALID_PARAMETER Invalid CommBufferSize recieved. + @retval Other For any other error. + +**/ +STATIC +EFI_STATUS +EFIAPI +HestErrorSourcesInfoMmiHandler ( + IN EFI_HANDLE DispatchHandle, + IN CONST VOID *Context, OPTIONAL + IN OUT VOID *CommBuffer, OPTIONAL + IN OUT UINTN *CommBufferSize OPTIONAL + ) +{ + MM_HEST_ERROR_SOURCE_DESC_PROTOCOL *HestErrSourceDescProtocolHandle; + HEST_ERROR_SOURCE_DESC_INFO *ErrorSourceInfoList; + EFI_HANDLE *HandleBuffer; + EFI_STATUS Status; + UINTN HandleCount; + UINTN HandleBufferSize; + UINTN Index; + UINTN SourceCount =3D 0; + UINTN SourceLength =3D 0; + VOID *ErrorSourcePtr; + UINTN TotalSourceLength =3D 0; + UINTN TotalSourceCount =3D 0; + + if (*CommBufferSize < HEST_ERROR_SOURCE_DESC_INFO_SIZE) { + // + // Ensure that the communication buffer has enough space to hold the + // ErrSourceDescCount and ErrSourceDescSize elements of the + // HEST_ERROR_SOURCE_DESC_INFO structure + // + return EFI_INVALID_PARAMETER; + } + + // Get all handles that implement the HEST error source descriptor proto= col. + + // Get the buffer size required to store list of handles for the protoco= l. + HandleBuffer =3D NULL; + HandleBufferSize =3D 0; + Status =3D GetHestErrorSourceProtocolHandles (&HandleBufferSize, &Handle= Buffer); + if ((Status =3D=3D EFI_NOT_FOUND) || + (HandleBufferSize =3D=3D 0)) + { + return Status; + } + + // Allocate memory for HandleBuffer of size HandleBufferSize. + HandleBuffer =3D AllocatePool (HandleBufferSize); + if (HandleBuffer =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // Get the list of handles. + Status =3D GetHestErrorSourceProtocolHandles (&HandleBufferSize, &Handle= Buffer); + if ((EFI_ERROR (Status)) || + (HandleBuffer =3D=3D NULL)) + { + FreePool (HandleBuffer); + return Status; + } + + // Count of handles for the protocol. + HandleCount =3D HandleBufferSize / sizeof (EFI_HANDLE); + + // + // Loop to get the count and length of the error source descriptors from= all + // the MM drivers implementing HEST error source descriptor protocol. + // + for (Index =3D 0; Index < HandleCount; ++Index) { + Status =3D mMmst->MmHandleProtocol ( + HandleBuffer[Index], + &gMmHestErrorSourceDescProtocolGuid, + (VOID **)&HestErrSourceDescProtocolHandle + ); + if (EFI_ERROR (Status)) { + continue; + } + + // + // Protocol called with Buffer parameter passed as NULL, must return + // error source length and error count for that driver. + // + Status =3D HestErrSourceDescProtocolHandle->GetHestErrorSourceDescript= ors ( + HestErrSourceDescProtocolH= andle, + NULL, + &SourceLength, + &SourceCount + ); + if (Status =3D=3D EFI_INVALID_PARAMETER) { + TotalSourceLength +=3D SourceLength; + TotalSourceCount +=3D SourceCount; + } + } + + // Set the count and length in the error source descriptor. + ErrorSourceInfoList =3D (HEST_ERROR_SOURCE_DESC_INFO *)(CommBuffer); + ErrorSourceInfoList->ErrSourceDescCount =3D TotalSourceCount; + ErrorSourceInfoList->ErrSourceDescSize =3D TotalSourceLength; + + // + // Check the size of CommBuffer, it should atleast be of size + // TotalSourceLength + HEST_ERROR_SOURCE_DESC_INFO_SIZE. + // + TotalSourceLength =3D TotalSourceLength + HEST_ERROR_SOURCE_DESC_INFO_SI= ZE; + if ((*CommBufferSize) < TotalSourceLength) { + FreePool (HandleBuffer); + return EFI_BAD_BUFFER_SIZE; + } + + // + // CommBuffer size is adequate to return all the error source descriptor= s. + // Populate it with the error source descriptor information. + // + + // Buffer pointer to append the Error Descriptors data. + ErrorSourcePtr =3D ErrorSourceInfoList->ErrSourceDescList; + + // Loop to retrieve error source descriptors. + for (Index =3D 0; Index < HandleCount; ++Index) { + Status =3D mMmst->MmHandleProtocol ( + HandleBuffer[Index], + &gMmHestErrorSourceDescProtocolGuid, + (VOID **)&HestErrSourceDescProtocolHandle + ); + if (EFI_ERROR (Status)) { + continue; + } + + Status =3D HestErrSourceDescProtocolHandle->GetHestErrorSourceDescript= ors ( + HestErrSourceDescProtocolH= andle, + (VOID **)&ErrorSourcePtr, + &SourceLength, + &SourceCount + ); + if (Status =3D=3D EFI_SUCCESS) { + ErrorSourcePtr +=3D SourceLength; + } + } + + // Free the buffer holding all the protocol handles. + FreePool (HandleBuffer); + + // Initialize CPER memory. + SetMem ( + (VOID *)FixedPcdGet64 (PcdGhesGenericErrorDataMmBufferBase), + FixedPcdGet64 (PcdGhesGenericErrorDataMmBufferSize), + 0 + ); + + return EFI_SUCCESS; +} + +/** + Entry point for this Stanalone MM driver. + + Registers an MMI handler that retrieves the error source descriptors fro= m all + the MM drivers implementing the MM_HEST_ERROR_SOURCE_DESC_PROTOCOL. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point registered handler successfully. + @retval Other Some error occurred when executing this entry po= int. + +**/ +EFI_STATUS +EFIAPI +StandaloneMmHestErrorSourceInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_MM_SYSTEM_TABLE *SystemTable + ) +{ + EFI_HANDLE DispatchHandle; + EFI_STATUS Status; + + ASSERT (SystemTable !=3D NULL); + mMmst =3D SystemTable; + + Status =3D mMmst->MmiHandlerRegister ( + HestErrorSourcesInfoMmiHandler, + &gMmHestGetErrorSourceInfoGuid, + &DispatchHandle + ); + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR, "MMI handler registration failed with status : %r= \n", + Status)); + return Status; + } + + 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 (#66825): https://edk2.groups.io/g/devel/message/66825 Mute This Topic: https://groups.io/mt/77913843/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-