From 8f0b7fc7bdc392431eaa2f4335e751469a0eaab8 Mon Sep 17 00:00:00 2001 From: vit9696 Date: Sat, 25 Jan 2020 12:22:19 +0300 Subject: [PATCH] OcSmbiosLib: Add support for exposing OEM info --- Include/Guid/OcVariables.h | 15 +++ Include/Library/OcConfigurationLib.h | 1 + Include/Library/OcSmbiosLib.h | 81 +++++++++++-- Library/OcSmbiosLib/OcSmbiosLib.inf | 1 + Library/OcSmbiosLib/SmbiosInternal.c | 13 +-- Library/OcSmbiosLib/SmbiosInternal.h | 47 +------- Library/OcSmbiosLib/SmbiosPatch.c | 166 +++++++++++++++++++-------- Tests/SmbiosTest/SmbiosTest.c | 13 ++- 8 files changed, 221 insertions(+), 116 deletions(-) diff --git a/Include/Guid/OcVariables.h b/Include/Guid/OcVariables.h index 55983a3a..7d76af07 100644 --- a/Include/Guid/OcVariables.h +++ b/Include/Guid/OcVariables.h @@ -57,6 +57,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // #define OC_VERSION_VARIABLE_NAME L"opencore-version" +// +// Variable used to report OEM product from SMBIOS Type1 ProductName. +// +#define OC_OEM_PRODUCT_VARIABLE_NAME L"oem-product" + +// +// Variable used to report OEM board vendor from SMBIOS Type2 Manufacturer. +// +#define OC_OEM_VENDOR_VARIABLE_NAME L"oem-vendor" + +// +// Variable used to report OEM board vendor from SMBIOS Type2 ProductName. +// +#define OC_OEM_BOARD_VARIABLE_NAME L"oem-board" + // // 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102 // This GUID is specifically used for normal variable access by Lilu kernel extension and its plugins. diff --git a/Include/Library/OcConfigurationLib.h b/Include/Library/OcConfigurationLib.h index a84fac01..9479d984 100644 --- a/Include/Library/OcConfigurationLib.h +++ b/Include/Library/OcConfigurationLib.h @@ -288,6 +288,7 @@ #define OCS_EXPOSE_BOOT_PATH 1U #define OCS_EXPOSE_VERSION_VAR 2U #define OCS_EXPOSE_VERSION_UI 4U +#define OCS_EXPOSE_OEM_INFO 8U #define OCS_EXPOSE_VERSION (OCS_EXPOSE_VERSION_VAR | OCS_EXPOSE_VERSION_UI) #define OC_MISC_SECURITY_FIELDS(_, __) \ diff --git a/Include/Library/OcSmbiosLib.h b/Include/Library/OcSmbiosLib.h index bb0ed8df..d42ed6ba 100644 --- a/Include/Library/OcSmbiosLib.h +++ b/Include/Library/OcSmbiosLib.h @@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #define OC_SMBIOS_LIB_H #include +#include // // This GUID is used for storing SMBIOS data when the firmware overwrites SMBIOS data at original @@ -136,17 +137,81 @@ typedef enum OC_SMBIOS_UPDATE_MODE_ { OcSmbiosUpdateCustom = 3, } OC_SMBIOS_UPDATE_MODE; +// +// Growing SMBIOS table data. +// +typedef struct OC_SMBIOS_TABLE_ { + // + // SMBIOS table. + // + UINT8 *Table; + // + // Current table position. + // + APPLE_SMBIOS_STRUCTURE_POINTER CurrentPtr; + // + // Current string position. + // + CHAR8 *CurrentStrPtr; + // + // Allocated table size, multiple of EFI_PAGE_SIZE. + // + UINT32 AllocatedTableSize; + // + // Incrementable handle. + // + SMBIOS_HANDLE Handle; + // + // Largest structure size within the table. + // + UINT16 MaxStructureSize; + // + // Number of structures within the table. + // + UINT16 NumberOfStructures; +} OC_SMBIOS_TABLE; + +/** + Prepare new SMBIOS table based on host data. + + @param SmbiosTable + + @retval EFI_SUCCESS if buffer is ready to be filled. +**/ +EFI_STATUS +OcSmbiosTablePrepare ( + IN OUT OC_SMBIOS_TABLE *SmbiosTable + ); + +/** + Free SMBIOS table + + @param[in, out] Table Current table buffer. + + @retval EFI_SUCCESS on success +**/ VOID -SmbiosGetSmcVersion ( +OcSmbiosTableFree ( + IN OUT OC_SMBIOS_TABLE *Table + ); + +EFI_STATUS +OcSmbiosCreate ( + IN OUT OC_SMBIOS_TABLE *SmbiosTable, + IN OC_SMBIOS_DATA *Data, + IN OC_SMBIOS_UPDATE_MODE Mode, + IN OC_CPU_INFO *CpuInfo + ); + +VOID +OcSmbiosExposeOemInfo ( + IN OC_SMBIOS_TABLE *SmbiosTable + ); + +VOID +OcSmbiosGetSmcVersion ( IN CONST UINT8 *SmcRevision, OUT UINT8 *SmcVersion ); -EFI_STATUS -CreateSmbios ( - IN OC_SMBIOS_DATA *Data, - IN OC_SMBIOS_UPDATE_MODE Mode, - IN OC_CPU_INFO *CpuInfo - ); - #endif // OC_SMBIOS_LIB_H diff --git a/Library/OcSmbiosLib/OcSmbiosLib.inf b/Library/OcSmbiosLib/OcSmbiosLib.inf index 25d50eff..9b2b6fca 100755 --- a/Library/OcSmbiosLib/OcSmbiosLib.inf +++ b/Library/OcSmbiosLib/OcSmbiosLib.inf @@ -44,6 +44,7 @@ gEfiSmbiosTableGuid gEfiSmbios3TableGuid gOcCustomSmbiosTableGuid + gOcVendorVariableGuid [Protocols] gEfiPciRootBridgeIoProtocolGuid diff --git a/Library/OcSmbiosLib/SmbiosInternal.c b/Library/OcSmbiosLib/SmbiosInternal.c index 4c35937b..c593db0d 100755 --- a/Library/OcSmbiosLib/SmbiosInternal.c +++ b/Library/OcSmbiosLib/SmbiosInternal.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -87,18 +88,6 @@ SmbiosExtendTable ( return EFI_SUCCESS; } -VOID -SmbiosTableFree ( - IN OUT OC_SMBIOS_TABLE *Table - ) -{ - if (Table->Table != NULL) { - FreePool (Table->Table); - } - - ZeroMem (Table, sizeof (*Table)); -} - UINT8 SmbiosOverrideString ( IN OC_SMBIOS_TABLE *Table, diff --git a/Library/OcSmbiosLib/SmbiosInternal.h b/Library/OcSmbiosLib/SmbiosInternal.h index abe425d9..11db5e15 100755 --- a/Library/OcSmbiosLib/SmbiosInternal.h +++ b/Library/OcSmbiosLib/SmbiosInternal.h @@ -17,6 +17,7 @@ #include #include +#include // // 2 zero bytes required in the end of each table. @@ -99,40 +100,6 @@ enum { STATIC_ASSERT (OcSmbiosAutomaticHandle > OcSmbiosLastReservedHandle, "Inconsistent handle IDs"); -// -// Growing SMBIOS table data. -// -typedef struct OC_SMBIOS_TABLE_ { - // - // SMBIOS table. - // - UINT8 *Table; - // - // Current table position. - // - APPLE_SMBIOS_STRUCTURE_POINTER CurrentPtr; - // - // Current string position. - // - CHAR8 *CurrentStrPtr; - // - // Allocated table size, multiple of EFI_PAGE_SIZE. - // - UINT32 AllocatedTableSize; - // - // Incrementable handle. - // - SMBIOS_HANDLE Handle; - // - // Largest structure size within the table. - // - UINT16 MaxStructureSize; - // - // Number of structures within the table. - // - UINT16 NumberOfStructures; -} OC_SMBIOS_TABLE; - // // Map old handles to new ones. // @@ -155,18 +122,6 @@ SmbiosExtendTable ( IN UINT32 Size ); -/** - Free SMBIOS table - - @param[in, out] Table Current table buffer. - - @retval EFI_SUCCESS on success -**/ -VOID -SmbiosTableFree ( - IN OUT OC_SMBIOS_TABLE *Table - ); - /** Write override string to SMBIOS table diff --git a/Library/OcSmbiosLib/SmbiosPatch.c b/Library/OcSmbiosLib/SmbiosPatch.c index c2fe9b1b..d7b1e130 100755 --- a/Library/OcSmbiosLib/SmbiosPatch.c +++ b/Library/OcSmbiosLib/SmbiosPatch.c @@ -16,6 +16,7 @@ #include +#include #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include #include @@ -1168,16 +1170,8 @@ SmbiosHandleLegacyRegion ( return EFI_SUCCESS; } -/** - Prepare new SMBIOS table based on host data. - - @param SmbiosTable - - @retval EFI_SUCCESS if buffer is ready to be filled. -**/ -STATIC EFI_STATUS -SmbiosPrepareTable ( +OcSmbiosTablePrepare ( IN OUT OC_SMBIOS_TABLE *SmbiosTable ) { @@ -1289,6 +1283,19 @@ SmbiosPrepareTable ( return Status; } + +VOID +OcSmbiosTableFree ( + IN OUT OC_SMBIOS_TABLE *Table + ) +{ + if (Table->Table != NULL) { + FreePool (Table->Table); + } + + ZeroMem (Table, sizeof (*Table)); +} + STATIC EFI_STATUS SmbiosTableAllocate ( @@ -1555,7 +1562,7 @@ SmbiosTableApply ( } VOID -SmbiosGetSmcVersion ( +OcSmbiosGetSmcVersion ( IN CONST UINT8 *SmcRevision, OUT UINT8 *SmcVersion ) @@ -1665,19 +1672,15 @@ SmbiosGetSmcVersion ( } } -/** - - @retval EFI_SUCCESS The smbios tables were generated successfully -**/ EFI_STATUS -CreateSmbios ( - IN OC_SMBIOS_DATA *Data, - IN OC_SMBIOS_UPDATE_MODE Mode, - IN OC_CPU_INFO *CpuInfo +OcSmbiosCreate ( + IN OUT OC_SMBIOS_TABLE *SmbiosTable, + IN OC_SMBIOS_DATA *Data, + IN OC_SMBIOS_UPDATE_MODE Mode, + IN OC_CPU_INFO *CpuInfo ) { EFI_STATUS Status; - OC_SMBIOS_TABLE SmbiosTable; SMBIOS_HANDLE MemoryDeviceHandle; APPLE_SMBIOS_STRUCTURE_POINTER MemoryDeviceInfo; APPLE_SMBIOS_STRUCTURE_POINTER MemoryDeviceAddress; @@ -1690,27 +1693,22 @@ CreateSmbios ( ASSERT (Data != NULL); - Status = SmbiosPrepareTable (&SmbiosTable); - if (EFI_ERROR (Status)) { - return Status; - } - Mapping = AllocatePool (OC_SMBIOS_MAX_MAPPING * sizeof (*Mapping)); if (Mapping == NULL) { DEBUG ((DEBUG_WARN, "OCSMB: Cannot allocate mapping table\n")); return EFI_OUT_OF_RESOURCES; } - PatchBiosInformation (&SmbiosTable, Data); - PatchSystemInformation (&SmbiosTable, Data); - PatchBaseboardInformation (&SmbiosTable, Data); - PatchSystemEnclosure (&SmbiosTable, Data); - PatchProcessorInformation (&SmbiosTable, Data, CpuInfo); - PatchCacheInformation (&SmbiosTable, Data); - PatchSystemPorts (&SmbiosTable, Data); - PatchSystemSlots (&SmbiosTable, Data); - PatchMemoryArray (&SmbiosTable, Data); - PatchMemoryMappedAddress (&SmbiosTable, Data, Mapping, &MappingNum); + PatchBiosInformation (SmbiosTable, Data); + PatchSystemInformation (SmbiosTable, Data); + PatchBaseboardInformation (SmbiosTable, Data); + PatchSystemEnclosure (SmbiosTable, Data); + PatchProcessorInformation (SmbiosTable, Data, CpuInfo); + PatchCacheInformation (SmbiosTable, Data); + PatchSystemPorts (SmbiosTable, Data); + PatchSystemSlots (SmbiosTable, Data); + PatchMemoryArray (SmbiosTable, Data); + PatchMemoryMappedAddress (SmbiosTable, Data, Mapping, &MappingNum); NumberMemoryDevices = SmbiosGetOriginalStructureCount (SMBIOS_TYPE_MEMORY_DEVICE); NumberMemoryMapped = SmbiosGetOriginalStructureCount (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS); @@ -1726,7 +1724,7 @@ CreateSmbios ( // For each memory device we must generate type 17 // PatchMemoryDevice ( - &SmbiosTable, + SmbiosTable, Data, MemoryDeviceInfo, MemoryDeviceNo, @@ -1744,7 +1742,7 @@ CreateSmbios ( && MemoryDeviceAddress.Standard.Type20->MemoryDeviceHandle == MemoryDeviceInfo.Standard.Type17->Hdr.Handle) { PatchMemoryMappedDevice ( - &SmbiosTable, + SmbiosTable, Data, MemoryDeviceAddress, MemoryMappedNo, @@ -1756,20 +1754,94 @@ CreateSmbios ( } } - PatchPortableBatteryDevice (&SmbiosTable, Data); - PatchBootInformation (&SmbiosTable, Data); - CreateAppleProcessorType (&SmbiosTable, Data, CpuInfo); - CreateAppleProcessorSpeed (&SmbiosTable, Data, CpuInfo); - CreateAppleFirmwareVolume (&SmbiosTable, Data); - CreateApplePlatformFeature (&SmbiosTable, Data); - CreateAppleSmcInformation (&SmbiosTable, Data); - CreateSmBiosEndOfTable (&SmbiosTable, Data); + PatchPortableBatteryDevice (SmbiosTable, Data); + PatchBootInformation (SmbiosTable, Data); + CreateAppleProcessorType (SmbiosTable, Data, CpuInfo); + CreateAppleProcessorSpeed (SmbiosTable, Data, CpuInfo); + CreateAppleFirmwareVolume (SmbiosTable, Data); + CreateApplePlatformFeature (SmbiosTable, Data); + CreateAppleSmcInformation (SmbiosTable, Data); + CreateSmBiosEndOfTable (SmbiosTable, Data); FreePool (Mapping); - Status = SmbiosTableApply (&SmbiosTable, Mode); - - SmbiosTableFree (&SmbiosTable); + Status = SmbiosTableApply (SmbiosTable, Mode); return Status; } + +VOID +OcSmbiosExposeOemInfo ( + IN OC_SMBIOS_TABLE *SmbiosTable + ) +{ + EFI_STATUS Status; + APPLE_SMBIOS_STRUCTURE_POINTER Original; + CHAR8 *Value; + UINTN Length; + + Original = SmbiosGetOriginalStructure (SMBIOS_TYPE_SYSTEM_INFORMATION, 1); + + if (Original.Raw != NULL && SMBIOS_ACCESSIBLE (Original, Standard.Type1->ProductName)) { + Value = SmbiosGetString (Original, Original.Standard.Type1->ProductName); + if (Value != NULL) { + Length = AsciiStrLen (Value); + Status = gRT->SetVariable ( + OC_OEM_PRODUCT_VARIABLE_NAME, + &gOcVendorVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Length, + Value + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot write OEM product\n")); + } + } else { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot find OEM product\n")); + } + } else { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot access OEM Type1\n")); + } + + Original = SmbiosGetOriginalStructure (SMBIOS_TYPE_BASEBOARD_INFORMATION, 1); + + if (Original.Raw != NULL + && SMBIOS_ACCESSIBLE (Original, Standard.Type2->Manufacturer) + && SMBIOS_ACCESSIBLE (Original, Standard.Type2->ProductName)) { + Value = SmbiosGetString (Original, Original.Standard.Type2->Manufacturer); + if (Value != NULL) { + Length = AsciiStrLen (Value); + Status = gRT->SetVariable ( + OC_OEM_VENDOR_VARIABLE_NAME, + &gOcVendorVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Length, + Value + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot write OEM vendor\n")); + } + } else { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot find OEM vendor\n")); + } + + Value = SmbiosGetString (Original, Original.Standard.Type2->ProductName); + if (Value != NULL) { + Length = AsciiStrLen (Value); + Status = gRT->SetVariable ( + OC_OEM_BOARD_VARIABLE_NAME, + &gOcVendorVariableGuid, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Length, + Value + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot write OEM board\n")); + } + } else { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot find OEM board\n")); + } + } else { + DEBUG ((DEBUG_INFO, "OCSMB: Cannot access OEM Type2\n")); + } +} diff --git a/Tests/SmbiosTest/SmbiosTest.c b/Tests/SmbiosTest/SmbiosTest.c index e58417fc..773fd665 100644 --- a/Tests/SmbiosTest/SmbiosTest.c +++ b/Tests/SmbiosTest/SmbiosTest.c @@ -84,10 +84,17 @@ TestSmbios ( IN EFI_SYSTEM_TABLE *SystemTable ) { - OC_CPU_INFO CpuInfo; + EFI_STATUS Status; + OC_CPU_INFO CpuInfo; + OC_SMBIOS_TABLE SmbiosTable; OcCpuScanProcessor (&CpuInfo); - CreateSmbios (&Data, OcSmbiosUpdateCreate, &CpuInfo); - return EFI_SUCCESS; + Status = OcSmbiosTablePrepare (&SmbiosTable); + if (!EFI_ERROR (Status)) { + OcSmbiosCreate (&SmbiosTable, &Data, OcSmbiosUpdateCreate, &CpuInfo); + OcSmbiosTableFree (&SmbiosTable); + } + + return Status; } EFI_STATUS