mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
OcSmbiosLib: Add support for exposing OEM info
This commit is contained in:
parent
25b3ed1d18
commit
8f0b7fc7bd
@ -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.
|
||||
|
||||
@ -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(_, __) \
|
||||
|
||||
@ -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
|
||||
|
||||
@ -44,6 +44,7 @@
|
||||
gEfiSmbiosTableGuid
|
||||
gEfiSmbios3TableGuid
|
||||
gOcCustomSmbiosTableGuid
|
||||
gOcVendorVariableGuid
|
||||
|
||||
[Protocols]
|
||||
gEfiPciRootBridgeIoProtocolGuid
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user