diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
commit | f215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch) | |
tree | 6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe | |
parent | Initial commit. (diff) | |
download | virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip |
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe')
4 files changed, 394 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/Bhyve.c b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/Bhyve.c new file mode 100644 index 00000000..1ba5947c --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/Bhyve.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com> + * Copyright (c) 2014, Pluribus Networks, Inc. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + */ + +#include "SmbiosPlatformDxe.h" + +#define BHYVE_SMBIOS_PHYSICAL_ADDRESS 0x000F0000 +#define BHYVE_SMBIOS_PHYSICAL_END 0x000FFFFF + +/** + Locates the bhyve SMBIOS data if it exists + + @return SMBIOS_TABLE_ENTRY_POINT Address of bhyve SMBIOS data + +**/ +SMBIOS_TABLE_ENTRY_POINT * +GetBhyveSmbiosTables ( + VOID + ) +{ + UINT8 *BhyveSmbiosPtr; + SMBIOS_TABLE_ENTRY_POINT *BhyveSmbiosEntryPointStructure; + + for (BhyveSmbiosPtr = (UINT8*)(UINTN) BHYVE_SMBIOS_PHYSICAL_ADDRESS; + BhyveSmbiosPtr < (UINT8*)(UINTN) BHYVE_SMBIOS_PHYSICAL_END; + BhyveSmbiosPtr += 0x10) { + + BhyveSmbiosEntryPointStructure = (SMBIOS_TABLE_ENTRY_POINT *) BhyveSmbiosPtr; + + if (!AsciiStrnCmp ((CHAR8 *) BhyveSmbiosEntryPointStructure->AnchorString, "_SM_", 4) && + !AsciiStrnCmp ((CHAR8 *) BhyveSmbiosEntryPointStructure->IntermediateAnchorString, "_DMI_", 5) && + IsEntryPointStructureValid (BhyveSmbiosEntryPointStructure)) { + + return BhyveSmbiosEntryPointStructure; + + } + } + + return NULL; +} diff --git a/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.c new file mode 100644 index 00000000..2ba0474b --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.c @@ -0,0 +1,245 @@ +/** @file + This driver installs SMBIOS information for OVMF + + Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com> + Copyright (c) 2011, Bei Guan <gbtju85@gmail.com> + Copyright (c) 2011 - 2015, Intel Corporation. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "SmbiosPlatformDxe.h" + +#define TYPE0_STRINGS \ + "EFI Development Kit II / OVMF\0" /* Vendor */ \ + "0.0.0\0" /* BiosVersion */ \ + "02/06/2015\0" /* BiosReleaseDate */ +// +// Type definition and contents of the default Type 0 SMBIOS table. +// +#pragma pack(1) +typedef struct { + SMBIOS_TABLE_TYPE0 Base; + UINT8 Strings[sizeof(TYPE0_STRINGS)]; +} OVMF_TYPE0; +#pragma pack() + +STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = { + { + // SMBIOS_STRUCTURE Hdr + { + EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type + sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length + }, + 1, // SMBIOS_TABLE_STRING Vendor + 2, // SMBIOS_TABLE_STRING BiosVersion + 0xE800,// UINT16 BiosSegment + 3, // SMBIOS_TABLE_STRING BiosReleaseDate + 0, // UINT8 BiosSize + { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics + 0, // Reserved :2 + 0, // Unknown :1 + 1, // BiosCharacteristicsNotSupported :1 + // Remaining BiosCharacteristics bits left unset :60 + }, + { // BIOSCharacteristicsExtensionBytes[2] + 0, // BiosReserved + 0x1C // SystemReserved = VirtualMachineSupported | + // UefiSpecificationSupported | + // TargetContentDistributionEnabled + }, + 0, // UINT8 SystemBiosMajorRelease + 0, // UINT8 SystemBiosMinorRelease + 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease + 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease + }, + // Text strings (unformatted area) + TYPE0_STRINGS +}; + + +/** + Validates the SMBIOS entry point structure + + @param EntryPointStructure SMBIOS entry point structure + + @retval TRUE The entry point structure is valid + @retval FALSE The entry point structure is not valid + +**/ +BOOLEAN +IsEntryPointStructureValid ( + IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure + ) +{ + UINTN Index; + UINT8 Length; + UINT8 Checksum; + UINT8 *BytePtr; + + BytePtr = (UINT8*) EntryPointStructure; + Length = EntryPointStructure->EntryPointLength; + Checksum = 0; + + for (Index = 0; Index < Length; Index++) { + Checksum = Checksum + (UINT8) BytePtr[Index]; + } + + if (Checksum != 0) { + return FALSE; + } else { + return TRUE; + } +} + + +/** + Get SMBIOS record length. + + @param SmbiosTable SMBIOS pointer. + +**/ +UINTN +SmbiosTableLength ( + IN SMBIOS_STRUCTURE_POINTER SmbiosTable + ) +{ + CHAR8 *AChar; + UINTN Length; + + AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length); + + // + // Each structure shall be terminated by a double-null (SMBIOS spec.7.1) + // + while ((*AChar != 0) || (*(AChar + 1) != 0)) { + AChar ++; + } + Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2); + + return Length; +} + + +/** + Install all structures from the given SMBIOS structures block + + @param Smbios SMBIOS protocol + @param TableAddress SMBIOS tables starting address + +**/ +EFI_STATUS +InstallAllStructures ( + IN EFI_SMBIOS_PROTOCOL *Smbios, + IN UINT8 *TableAddress + ) +{ + EFI_STATUS Status; + SMBIOS_STRUCTURE_POINTER SmbiosTable; + EFI_SMBIOS_HANDLE SmbiosHandle; + BOOLEAN NeedSmbiosType0; + + SmbiosTable.Raw = TableAddress; + if (SmbiosTable.Raw == NULL) { + return EFI_INVALID_PARAMETER; + } + + NeedSmbiosType0 = TRUE; + + while (SmbiosTable.Hdr->Type != 127) { + // + // Log the SMBIOS data for this structure + // + SmbiosHandle = SmbiosTable.Hdr->Handle; + Status = Smbios->Add ( + Smbios, + NULL, + &SmbiosHandle, + (EFI_SMBIOS_TABLE_HEADER*) SmbiosTable.Raw + ); + ASSERT_EFI_ERROR (Status); + + if (SmbiosTable.Hdr->Type == 0) { + NeedSmbiosType0 = FALSE; + } + + // + // Get the next structure address + // + SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable)); + } + + if (NeedSmbiosType0) { + // + // Add OVMF default Type 0 (BIOS Information) table + // + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; + Status = Smbios->Add ( + Smbios, + NULL, + &SmbiosHandle, + (EFI_SMBIOS_TABLE_HEADER*) &mOvmfDefaultType0 + ); + ASSERT_EFI_ERROR (Status); + } + + return EFI_SUCCESS; +} + + +/** + Installs SMBIOS information for OVMF + + @param ImageHandle Module's image handle + @param SystemTable Pointer of EFI_SYSTEM_TABLE + + @retval EFI_SUCCESS Smbios data successfully installed + @retval Other Smbios data was not installed + +**/ +EFI_STATUS +EFIAPI +SmbiosTablePublishEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_SMBIOS_PROTOCOL *Smbios; + SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure; + UINT8 *SmbiosTables = NULL; + + // + // Find the SMBIOS protocol + // + Status = gBS->LocateProtocol ( + &gEfiSmbiosProtocolGuid, + NULL, + (VOID**)&Smbios + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Add bhyve SMBIOS data + // + EntryPointStructure = GetBhyveSmbiosTables (); + if (EntryPointStructure != NULL) { + SmbiosTables = (UINT8*)(UINTN)EntryPointStructure->TableAddress; + } + + if (SmbiosTables != NULL) { + Status = InstallAllStructures (Smbios, SmbiosTables); + + // + // Free SmbiosTables if allocated by Qemu (i.e., NOT by Xen): + // + if (EntryPointStructure == NULL) { + FreePool (SmbiosTables); + } + } + + return Status; +} diff --git a/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.h b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.h new file mode 100644 index 00000000..d6ea62ba --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.h @@ -0,0 +1,51 @@ +/** @file + This driver installs SMBIOS information for OVMF + + Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com> + Copyright (c) 2011, Bei Guan <gbtju85@gmail.com> + Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef _SMBIOS_PLATFORM_DXE_H_ +#define _SMBIOS_PLATFORM_DXE_H_ + +#include <PiDxe.h> +#include <Protocol/Smbios.h> +#include <IndustryStandard/SmBios.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> + + +/** + Locates the bhyve SMBIOS data if it exists + + @return SMBIOS_TABLE_ENTRY_POINT Address of bhyve SMBIOS data + +**/ +SMBIOS_TABLE_ENTRY_POINT * +GetBhyveSmbiosTables ( + VOID + ); + + +/** + Validates the SMBIOS entry point structure + + @param EntryPointStructure SMBIOS entry point structure + + @retval TRUE The entry point structure is valid + @retval FALSE The entry point structure is not valid + +**/ +BOOLEAN +IsEntryPointStructureValid ( + IN SMBIOS_TABLE_ENTRY_POINT *EntryPointStructure + ); + +#endif /* _SMBIOS_PLATFORM_DXE_H_ */ diff --git a/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf new file mode 100644 index 00000000..ffad1bd3 --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/OvmfPkg/Bhyve/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -0,0 +1,55 @@ +## @file +# This driver installs SMBIOS information for bhyve +# +# Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com> +# Copyright (c) 2011, Bei Guan <gbtju85@gmail.com> +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = SmbiosPlatformDxe + FILE_GUID = e2d8a63c-c239-484f-bb21-2917843cc382 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + + ENTRY_POINT = SmbiosTablePublishEntry + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 +# + +[Sources] + Bhyve.c + SmbiosPlatformDxe.h + SmbiosPlatformDxe.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + MemoryAllocationLib + PcdLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated + +[Protocols] + gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED + +[Depex] + gEfiSmbiosProtocolGuid + |