/** @file * * Copyright (c) 2018, Hisilicon Limited. All rights reserved. * Copyright (c) 2018, Linaro Limited. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * **/ #include "ErrorSource/Ghes.h" #include "Hest.h" #include #include #include #include #include #include EFI_STATUS HestAddErrorSourceDescriptor ( IN OUT HEST_CONTEXT *Context, IN VOID *ErrorSourceDescriptor, IN UINT32 SizeOfDescriptor ) { UINT16 *pSourceId; VOID *Descriptor; EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader; if ((Context == NULL) || (ErrorSourceDescriptor == NULL)) { return EFI_INVALID_PARAMETER; } HestHeader = Context->HestHeader; if (HestHeader->Header.Length + SizeOfDescriptor > Context->OccupiedMemorySize) { DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: Hest Size Too small\n", __FUNCTION__, __LINE__)); return EFI_BUFFER_TOO_SMALL; } Descriptor = (UINT8*)HestHeader + HestHeader->Header.Length; gBS->CopyMem ((VOID*)Descriptor , ErrorSourceDescriptor, SizeOfDescriptor); pSourceId = Descriptor + sizeof (UINT16); *pSourceId = HestHeader->ErrorSourceCount; HestHeader->Header.Length += SizeOfDescriptor; HestHeader->ErrorSourceCount++; Context->KeyErrorSource = Descriptor; return EFI_SUCCESS; } VOID HestSetAcpiTable ( IN HEST_CONTEXT *Context ) { UINTN AcpiTableHandle; EFI_STATUS Status; UINT8 Checksum; EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader; EFI_ACPI_SDT_HEADER *Table; EFI_ACPI_TABLE_VERSION TableVersion; UINTN TableKey; UINT32 Index; if (Context == NULL) { DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: ERROR\n", __FUNCTION__, __LINE__)); return; } HestHeader = Context->HestHeader; Checksum = CalculateCheckSum8 ((UINT8*)(HestHeader), HestHeader->Header.Length); HestHeader->Header.Checksum = Checksum; AcpiTableHandle = 0; // see AcpiTableProtocol.c InstallAcpiTable Status = mAcpiTableProtocol->InstallAcpiTable ( mAcpiTableProtocol, HestHeader, HestHeader->Header.Length, &AcpiTableHandle); for (Index = 0; Index < EFI_ACPI_MAX_NUM_TABLES; Index++) { Status = mAcpiSdtProtocol->GetAcpiTable (Index, &Table, &TableVersion, &TableKey); if (EFI_ERROR (Status)) { break; } if (Table->Signature != EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE) { continue; } mApeiTrustedfirmwareData->HestTableAddress = (EFI_PHYSICAL_ADDRESS)Table; DEBUG ((DEBUG_INFO, "Acpi HestSetAcpiTable Table = 0x%x.\n", (EFI_PHYSICAL_ADDRESS)Table)); } DEBUG ((DEBUG_INFO, "[%a]:[%dL]:OUT %llx, IN %llx \n", __FUNCTION__, __LINE__, AcpiTableHandle, Context->HestHeader)); return; } EFI_STATUS HestHeaderCreator ( HEST_CONTEXT *Context, UINT32 PreAllocatedHestSize ) { if (PreAllocatedHestSize < sizeof (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER)) { return EFI_BUFFER_TOO_SMALL; } Context->HestHeader = AllocateReservedZeroPool (PreAllocatedHestSize); *Context->HestHeader = (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER) { ARM_ACPI_HEADER ( EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE, EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER, EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_REVISION ), 0x0 }; Context->KeyErrorSource = Context->HestHeader + 1; Context->OccupiedMemorySize = PreAllocatedHestSize; return EFI_SUCCESS; }