| /** @file | |
| This file contains DXE driver for publishing empty HSTI table | |
| Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> | |
| Copyright (c) 2024, Red Hat. Inc | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiDxe.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/HstiLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Library/PcdLib.h> | |
| #include <Library/PlatformInitLib.h> | |
| #include <IndustryStandard/Hsti.h> | |
| #include <IndustryStandard/I440FxPiix4.h> | |
| #include <IndustryStandard/Q35MchIch9.h> | |
| #include "VirtHstiDxe.h" | |
| VOID | |
| VirtHstiSetSupported ( | |
| VIRT_ADAPTER_INFO_PLATFORM_SECURITY *VirtHsti, | |
| IN UINT32 ByteIndex, | |
| IN UINT8 BitMask | |
| ) | |
| { | |
| ASSERT (ByteIndex < VIRT_HSTI_SECURITY_FEATURE_SIZE); | |
| VirtHsti->SecurityFeaturesRequired[ByteIndex] |= BitMask; | |
| VirtHsti->SecurityFeaturesImplemented[ByteIndex] |= BitMask; | |
| } | |
| BOOLEAN | |
| VirtHstiIsSupported ( | |
| VIRT_ADAPTER_INFO_PLATFORM_SECURITY *VirtHsti, | |
| IN UINT32 ByteIndex, | |
| IN UINT8 BitMask | |
| ) | |
| { | |
| ASSERT (ByteIndex < VIRT_HSTI_SECURITY_FEATURE_SIZE); | |
| return VirtHsti->SecurityFeaturesImplemented[ByteIndex] & BitMask; | |
| } | |
| VOID | |
| VirtHstiTestResult ( | |
| CHAR16 *ErrorMsg, | |
| IN UINT32 ByteIndex, | |
| IN UINT8 BitMask | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| ASSERT (ByteIndex < VIRT_HSTI_SECURITY_FEATURE_SIZE); | |
| if (ErrorMsg) { | |
| DEBUG ((DEBUG_ERROR, "VirtHsti: Test failed: %s\n", ErrorMsg)); | |
| Status = HstiLibAppendErrorString ( | |
| PLATFORM_SECURITY_ROLE_PLATFORM_REFERENCE, | |
| NULL, | |
| ErrorMsg | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| } else { | |
| Status = HstiLibSetFeaturesVerified ( | |
| PLATFORM_SECURITY_ROLE_PLATFORM_REFERENCE, | |
| NULL, | |
| ByteIndex, | |
| BitMask | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| } | |
| } | |
| STATIC | |
| UINT16 | |
| VirtHstiGetHostBridgeDevId ( | |
| VOID | |
| ) | |
| { | |
| EFI_HOB_GUID_TYPE *GuidHob; | |
| EFI_HOB_PLATFORM_INFO *PlatformInfo; | |
| GuidHob = GetFirstGuidHob (&gUefiOvmfPkgPlatformInfoGuid); | |
| ASSERT (GuidHob); | |
| PlatformInfo = (EFI_HOB_PLATFORM_INFO *)GET_GUID_HOB_DATA (GuidHob); | |
| return PlatformInfo->HostBridgeDevId; | |
| } | |
| STATIC | |
| VOID | |
| EFIAPI | |
| VirtHstiOnReadyToBoot ( | |
| EFI_EVENT Event, | |
| VOID *Context | |
| ) | |
| { | |
| switch (VirtHstiGetHostBridgeDevId ()) { | |
| case INTEL_82441_DEVICE_ID: | |
| VirtHstiQemuPCVerify (); | |
| VirtHstiQemuCommonVerify (); | |
| break; | |
| case INTEL_Q35_MCH_DEVICE_ID: | |
| VirtHstiQemuQ35Verify (); | |
| VirtHstiQemuCommonVerify (); | |
| break; | |
| default: | |
| ASSERT (FALSE); | |
| } | |
| if (Event != NULL) { | |
| gBS->CloseEvent (Event); | |
| } | |
| } | |
| /** | |
| The driver's entry point. | |
| @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 occurs when executing this entry point. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| VirtHstiDxeEntrypoint ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| VIRT_ADAPTER_INFO_PLATFORM_SECURITY *VirtHsti; | |
| UINT16 DevId; | |
| EFI_STATUS Status; | |
| EFI_EVENT Event; | |
| if (PcdGet64 (PcdConfidentialComputingGuestAttr)) { | |
| DEBUG ((DEBUG_INFO, "%a: confidential guest\n", __func__)); | |
| return EFI_UNSUPPORTED; | |
| } | |
| DevId = VirtHstiGetHostBridgeDevId (); | |
| switch (DevId) { | |
| case INTEL_82441_DEVICE_ID: | |
| VirtHsti = VirtHstiQemuPCInit (); | |
| VirtHstiQemuCommonInit (VirtHsti); | |
| break; | |
| case INTEL_Q35_MCH_DEVICE_ID: | |
| VirtHsti = VirtHstiQemuQ35Init (); | |
| VirtHstiQemuCommonInit (VirtHsti); | |
| break; | |
| default: | |
| DEBUG ((DEBUG_INFO, "%a: unknown platform (0x%x)\n", __func__, DevId)); | |
| return EFI_UNSUPPORTED; | |
| } | |
| Status = HstiLibSetTable (VirtHsti, sizeof (*VirtHsti)); | |
| if (EFI_ERROR (Status)) { | |
| if (Status != EFI_ALREADY_STARTED) { | |
| ASSERT_EFI_ERROR (Status); | |
| } | |
| } | |
| EfiCreateEventReadyToBootEx ( | |
| TPL_NOTIFY, | |
| VirtHstiOnReadyToBoot, | |
| NULL, | |
| &Event | |
| ); | |
| return EFI_SUCCESS; | |
| } |