**/\r
\r
#include <IndustryStandard/SmBios.h> // SMBIOS_TABLE_TYPE0\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
#include <Library/DebugLib.h> // ASSERT_EFI_ERROR()\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PcdLib.h>\r
#include <Library/UefiBootServicesTableLib.h> // gBS\r
#include <Protocol/Smbios.h> // EFI_SMBIOS_PROTOCOL\r
\r
#include "SmbiosPlatformDxe.h"\r
\r
-#define TYPE0_STRINGS \\r
- "EFI Development Kit II / OVMF\0" /* Vendor */ \\r
- "0.0.0\0" /* BiosVersion */ \\r
- "02/06/2015\0" /* BiosReleaseDate */\r
-//\r
-// Type definition and contents of the default Type 0 SMBIOS table.\r
-//\r
-#pragma pack(1)\r
-typedef struct {\r
- SMBIOS_TABLE_TYPE0 Base;\r
- UINT8 Strings[sizeof (TYPE0_STRINGS)];\r
-} OVMF_TYPE0;\r
-#pragma pack()\r
-\r
-STATIC CONST OVMF_TYPE0 mOvmfDefaultType0 = {\r
+STATIC CONST SMBIOS_TABLE_TYPE0 mOvmfDefaultType0 = {\r
+ // SMBIOS_STRUCTURE Hdr\r
{\r
- // SMBIOS_STRUCTURE Hdr\r
- {\r
- EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type\r
- sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length\r
- },\r
- 1, // SMBIOS_TABLE_STRING Vendor\r
- 2, // SMBIOS_TABLE_STRING BiosVersion\r
- 0xE800, // UINT16 BiosSegment\r
- 3, // SMBIOS_TABLE_STRING BiosReleaseDate\r
- 0, // UINT8 BiosSize\r
- { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
- 0, // Reserved :2\r
- 0, // Unknown :1\r
- 1, // BiosCharacteristicsNotSupported :1\r
- // Remaining BiosCharacteristics bits left unset :60\r
- },\r
- { // BIOSCharacteristicsExtensionBytes[2]\r
- 0, // BiosReserved\r
- 0x1C // SystemReserved = VirtualMachineSupported |\r
- // UefiSpecificationSupported |\r
- // TargetContentDistributionEnabled\r
- },\r
- 0, // UINT8 SystemBiosMajorRelease\r
- 0, // UINT8 SystemBiosMinorRelease\r
- 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease\r
- 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease\r
+ EFI_SMBIOS_TYPE_BIOS_INFORMATION, // UINT8 Type\r
+ sizeof (SMBIOS_TABLE_TYPE0), // UINT8 Length\r
},\r
- // Text strings (unformatted area)\r
- TYPE0_STRINGS\r
+ 1, // SMBIOS_TABLE_STRING Vendor\r
+ 2, // SMBIOS_TABLE_STRING BiosVersion\r
+ 0xE800, // UINT16 BiosSegment\r
+ 3, // SMBIOS_TABLE_STRING BiosReleaseDate\r
+ 0, // UINT8 BiosSize\r
+ { // MISC_BIOS_CHARACTERISTICS BiosCharacteristics\r
+ 0, // Reserved :2\r
+ 0, // Unknown :1\r
+ 1, // BiosCharacteristicsNotSupported :1\r
+ // Remaining BiosCharacteristics bits left unset :60\r
+ },\r
+ { // BIOSCharacteristicsExtensionBytes[2]\r
+ 0, // BiosReserved\r
+ 0x1C // SystemReserved = VirtualMachineSupported |\r
+ // UefiSpecificationSupported |\r
+ // TargetContentDistributionEnabled\r
+ },\r
+ 0, // UINT8 SystemBiosMajorRelease\r
+ 0, // UINT8 SystemBiosMinorRelease\r
+ 0xFF, // UINT8 EmbeddedControllerFirmwareMajorRelease\r
+ 0xFF // UINT8 EmbeddedControllerFirmwareMinorRelease\r
};\r
\r
/**\r
//\r
// Add OVMF default Type 0 (BIOS Information) table\r
//\r
+ CHAR16 *VendStr, *VersStr, *DateStr;\r
+ UINTN VendLen, VersLen, DateLen;\r
+ CHAR8 *Type0;\r
+\r
+ VendStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVendor);\r
+ VendLen = StrLen (VendStr);\r
+ if (VendLen < 3) {\r
+ VendStr = L"unknown";\r
+ VendLen = StrLen (VendStr);\r
+ }\r
+\r
+ VersStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareVersionString);\r
+ VersLen = StrLen (VersStr);\r
+ if (VersLen < 3) {\r
+ VersStr = L"unknown";\r
+ VersLen = StrLen (VersStr);\r
+ }\r
+\r
+ DateStr = (CHAR16 *)FixedPcdGetPtr (PcdFirmwareReleaseDateString);\r
+ DateLen = StrLen (DateStr);\r
+ if (DateLen < 3) {\r
+ DateStr = L"unknown";\r
+ DateLen = StrLen (DateStr);\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO, "FirmwareVendor: \"%s\" (%d chars)\n", VendStr, VendLen));\r
+ DEBUG ((DEBUG_INFO, "FirmwareVersionString: \"%s\" (%d chars)\n", VersStr, VersLen));\r
+ DEBUG ((DEBUG_INFO, "FirmwareReleaseDateString: \"%s\" (%d chars)\n", DateStr, DateLen));\r
+\r
+ Type0 = AllocateZeroPool (sizeof (mOvmfDefaultType0) + VendLen + VersLen + DateLen + 4);\r
+ if (Type0 == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ CopyMem (Type0, &mOvmfDefaultType0, sizeof (mOvmfDefaultType0));\r
+ UnicodeStrToAsciiStrS (VendStr, Type0 + sizeof (mOvmfDefaultType0), VendLen + 1);\r
+ UnicodeStrToAsciiStrS (VersStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + 1, VersLen + 1);\r
+ UnicodeStrToAsciiStrS (DateStr, Type0 + sizeof (mOvmfDefaultType0) + VendLen + VersLen + 2, DateLen + 1);\r
+\r
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
Status = Smbios->Add (\r
Smbios,\r
NULL,\r
&SmbiosHandle,\r
- (EFI_SMBIOS_TABLE_HEADER *)&mOvmfDefaultType0\r
+ (EFI_SMBIOS_TABLE_HEADER *)Type0\r
);\r
ASSERT_EFI_ERROR (Status);\r
+\r
+ FreePool (Type0);\r
}\r
\r
return EFI_SUCCESS;\r