From 8b2cc30989c009ab72951022bd017143764411b2 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Mon, 28 Nov 2022 13:40:20 +0800 Subject: OvmfPkg/SmbiosPlatformDxe: use PcdFirmware* Instead of using hard-coded strings ("0.0.0" for BiosVersion etc) which is mostly useless read the PCDs (PcdFirmwareVendor, PcdFirmwareVersionString and PcdFirmwareReleaseDateString) and build the string table dynamuically at runtime. Signed-off-by: Gerd Hoffmann Reviewed-by: Jiewen Yao (cherry picked from commit 4cb94f20b002c99dd2b4b75f07c5495b81a34ffd) https://issues.redhat.com/browse/RHEL-75 --- OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c | 115 +++++++++++------- .../SmbiosPlatformDxe/SmbiosPlatformDxe.inf | 6 + .../XenSmbiosPlatformDxe.inf | 9 +- 3 files changed, 85 insertions(+), 45 deletions(-) diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c index 94249d3ff1..dc1e6aed63 100644 --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.c @@ -9,57 +9,43 @@ **/ #include // SMBIOS_TABLE_TYPE0 +#include +#include #include // ASSERT_EFI_ERROR() +#include +#include #include // gBS #include // EFI_SMBIOS_PROTOCOL #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 = { +STATIC CONST SMBIOS_TABLE_TYPE0 mOvmfDefaultType0 = { + // SMBIOS_STRUCTURE Hdr { - // 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 + EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type + sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length }, - // Text strings (unformatted area) - TYPE0_STRINGS + 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 }; /** @@ -153,14 +139,55 @@ InstallAllStructures ( // // Add OVMF default Type 0 (BIOS Information) table // + CHAR16 *VendStr, *VersStr, *DateStr; + UINTN VendLen, VersLen, DateLen; + CHAR8 *Type0; + + VendStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVendor); + VendLen = StrLen (VendStr); + if (VendLen < 3) { + VendStr = L"unknown"; + VendLen = StrLen (VendStr); + } + + VersStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString); + VersLen = StrLen (VersStr); + if (VersLen < 3) { + VersStr = L"unknown"; + VersLen = StrLen (VersStr); + } + + DateStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareReleaseDateString); + DateLen = StrLen (DateStr); + if (DateLen < 3) { + DateStr = L"unknown"; + DateLen = StrLen (DateStr); + } + + DEBUG ((DEBUG_INFO, "FirmwareVendor: \"%s\" (%d chars)\n", VendStr, VendLen)); + DEBUG ((DEBUG_INFO, "FirmwareVersionString: \"%s\" (%d chars)\n", VersStr, VersLen)); + DEBUG ((DEBUG_INFO, "FirmwareReleaseDateString: \"%s\" (%d chars)\n", DateStr, DateLen)); + + Type0 = AllocateZeroPool (sizeof (mOvmfDefaultType0) + VendLen + VersLen + DateLen + 4); + if (Type0 == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (Type0, &mOvmfDefaultType0, sizeof (mOvmfDefaultType0)); + UnicodeStrToAsciiStrS (VendStr, Type0 + sizeof (mOvmfDefaultType0), VendLen + 1); + UnicodeStrToAsciiStrS (VersStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + 1, VersLen + 1); + UnicodeStrToAsciiStrS (DateStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + VersLen + 2, DateLen + 1); + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; Status = Smbios->Add ( Smbios, NULL, &SmbiosHandle, - (EFI_SMBIOS_TABLE_HEADER *)&mOvmfDefaultType0 + (EFI_SMBIOS_TABLE_HEADER *)Type0 ); ASSERT_EFI_ERROR (Status); + + FreePool (Type0); } return EFI_SUCCESS; diff --git a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf index 0066bbc922..52689c96e5 100644 --- a/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/SmbiosPlatformDxe.inf @@ -32,9 +32,12 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec [LibraryClasses] + BaseLib + BaseMemoryLib DebugLib MemoryAllocationLib PcdLib @@ -45,6 +48,9 @@ [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId gUefiOvmfPkgTokenSpaceGuid.PcdQemuSmbiosValidated + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareReleaseDateString [Protocols] gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED diff --git a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf index 7f4588e33d..e646c88741 100644 --- a/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf +++ b/OvmfPkg/SmbiosPlatformDxe/XenSmbiosPlatformDxe.inf @@ -38,19 +38,26 @@ [Packages] MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec [Packages.IA32, Packages.X64] OvmfPkg/OvmfPkg.dec [LibraryClasses] + BaseLib + BaseMemoryLib DebugLib UefiBootServicesTableLib UefiDriverEntryPoint [LibraryClasses.IA32, LibraryClasses.X64] - BaseLib HobLib +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVendor + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString + gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareReleaseDateString + [Protocols] gEfiSmbiosProtocolGuid # PROTOCOL ALWAYS_CONSUMED -- 2.38.1