OcSmbiosLib: Add support for exposing OEM info

This commit is contained in:
vit9696 2020-01-25 12:22:19 +03:00
parent 25b3ed1d18
commit 8f0b7fc7bd
8 changed files with 221 additions and 116 deletions

View File

@ -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.

View File

@ -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(_, __) \

View File

@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#define OC_SMBIOS_LIB_H
#include <Library/OcCpuLib.h>
#include <IndustryStandard/AppleSmBios.h>
//
// 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

View File

@ -44,6 +44,7 @@
gEfiSmbiosTableGuid
gEfiSmbios3TableGuid
gOcCustomSmbiosTableGuid
gOcVendorVariableGuid
[Protocols]
gEfiPciRootBridgeIoProtocolGuid

View File

@ -21,6 +21,7 @@
#include <Library/MemoryAllocationLib.h>
#include <Library/OcCpuLib.h>
#include <Library/OcMiscLib.h>
#include <Library/OcSmbiosLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
@ -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,

View File

@ -17,6 +17,7 @@
#include <IndustryStandard/AppleSmBios.h>
#include <Library/OcGuardLib.h>
#include <Library/OcSmbiosLib.h>
//
// 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

View File

@ -16,6 +16,7 @@
#include <Protocol/PciRootBridgeIo.h>
#include <Guid/OcVariables.h>
#include <Guid/SmBios.h>
#include <Library/BaseMemoryLib.h>
@ -30,6 +31,7 @@
#include <Library/OcStringLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <IndustryStandard/AppleSmBios.h>
#include <IndustryStandard/Pci.h>
@ -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"));
}
}

View File

@ -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