17#include <Protocol/PciRootBridgeIo.h>
21#include <Guid/SmBios.h>
23#include <Library/BaseMemoryLib.h>
24#include <Library/BaseOverflowLib.h>
25#include <Library/DebugLib.h>
26#include <Library/MemoryAllocationLib.h>
34#include <Library/UefiLib.h>
35#include <Library/UefiBootServicesTableLib.h>
36#include <Library/UefiRuntimeServicesTableLib.h>
39#include <IndustryStandard/Pci.h>
51#define SMBIOS_OVERRIDE_S(Table, Field, Original, Value, Index, Fallback) \
53 CONST CHAR8 *RealValue__ = (Value); \
54 if (RealValue__ == NULL && ((Original).Raw) != NULL && (Original).Raw + (Original).Standard.Hdr->Length \
55 >= ((UINT8 *)&((Original).Field) + sizeof (SMBIOS_TABLE_STRING))) { \
56 RealValue__ = SmbiosGetString ((Original), ((Original).Field)); \
58 (((Table)->CurrentPtr).Field) = SmbiosOverrideString ( \
60 RealValue__ != NULL ? RealValue__ : (Fallback), \
65#define SMBIOS_OVERRIDE_V(Table, Field, Original, Value, Fallback) \
67 if ((Value) != NULL) { \
68 CopyMem (&(((Table)->CurrentPtr).Field), (Value), sizeof ((((Table)->CurrentPtr).Field))); \
69 } else if ((Original).Raw != NULL && (Original).Raw + (Original).Standard.Hdr->Length \
70 >= ((UINT8 *)&((Original).Field) + sizeof ((((Table)->CurrentPtr).Field)))) { \
71 CopyMem (&(((Table)->CurrentPtr).Field), &((Original).Field), sizeof ((((Table)->CurrentPtr).Field))); \
72 } else if ((Fallback) != NULL) { \
73 CopyMem (&(((Table)->CurrentPtr).Field), (Fallback), sizeof ((((Table)->CurrentPtr).Field))); \
79#define SMBIOS_ACCESSIBLE(Table, Field) \
80 (((UINT8 *) &(Table).Field - (Table).Raw + sizeof ((Table).Field)) <= (Table).Standard.Hdr->Length)
115 return Original.Raw != NULL
117 && Original.Standard.Type17->FormFactor != 0;
129 IsAutomatic = !Data->ForceMemoryFormFactor;
136 return Original.Standard.Type17->FormFactor;
142 if (Data->MemoryFormFactor != NULL) {
143 return *Data->MemoryFormFactor;
150 if (Data->MemoryFormFactor != NULL) {
151 return *Data->MemoryFormFactor;
158 return Original.Standard.Type17->FormFactor;
164 return MemoryFormFactorUnknown;
189 MinLength =
sizeof (*Original.
Standard.Type0);
196 SMBIOS_OVERRIDE_S (Table, Standard.Type0->Vendor, Original, Data->BIOSVendor, &StringIndex, NULL);
197 SMBIOS_OVERRIDE_S (Table, Standard.Type0->BiosVersion, Original, Data->BIOSVersion, &StringIndex, NULL);
201 SMBIOS_OVERRIDE_S (Table, Standard.Type0->BiosReleaseDate, Original, Data->BIOSReleaseDate, &StringIndex, NULL);
203 SMBIOS_OVERRIDE_V (Table, Standard.Type0->BiosCharacteristics, Original, NULL, NULL);
204 SMBIOS_OVERRIDE_V (Table, Standard.Type0->BIOSCharacteristicsExtensionBytes, Original, NULL, NULL);
205 SMBIOS_OVERRIDE_V (Table, Standard.Type0->SystemBiosMajorRelease, Original, NULL, NULL);
206 SMBIOS_OVERRIDE_V (Table, Standard.Type0->SystemBiosMinorRelease, Original, NULL, NULL);
207 SMBIOS_OVERRIDE_V (Table, Standard.Type0->EmbeddedControllerFirmwareMajorRelease, Original, NULL, NULL);
208 SMBIOS_OVERRIDE_V (Table, Standard.Type0->EmbeddedControllerFirmwareMinorRelease, Original, NULL, NULL);
214 if ((
Vendor != NULL) && (AsciiStrStr (
Vendor,
"Apple") != NULL)) {
218 DEBUG ((DEBUG_INFO,
"OCSMB: Post-override BIOS vendor %a %d\n",
Vendor, IsApple));
242 MinLength =
sizeof (*Original.
Standard.Type1);
249 SMBIOS_OVERRIDE_S (Table, Standard.Type1->Manufacturer, Original, Data->SystemManufacturer, &StringIndex, NULL);
250 SMBIOS_OVERRIDE_S (Table, Standard.Type1->ProductName, Original, Data->SystemProductName, &StringIndex, NULL);
251 SMBIOS_OVERRIDE_S (Table, Standard.Type1->Version, Original, Data->SystemVersion, &StringIndex, NULL);
252 SMBIOS_OVERRIDE_S (Table, Standard.Type1->SerialNumber, Original, Data->SystemSerialNumber, &StringIndex, NULL);
253 SMBIOS_OVERRIDE_V (Table, Standard.Type1->Uuid, Original, Data->SystemUUID, NULL);
255 SMBIOS_OVERRIDE_S (Table, Standard.Type1->SKUNumber, Original, Data->SystemSKUNumber, &StringIndex, NULL);
256 SMBIOS_OVERRIDE_S (Table, Standard.Type1->Family, Original, Data->SystemFamily, &StringIndex, NULL);
278 MinLength =
sizeof (*Original.
Standard.Type2);
284 MinLength -=
sizeof (Original.
Standard.Type2->ContainedObjectHandles[0]);
286 sizeof (Original.
Standard.Type2->ContainedObjectHandles) == sizeof (UINT16),
287 "Please remove this hack, the structure should have been fixed by now."
294 SMBIOS_OVERRIDE_S (Table, Standard.Type2->Manufacturer, Original, Data->BoardManufacturer, &StringIndex, NULL);
295 SMBIOS_OVERRIDE_S (Table, Standard.Type2->ProductName, Original, Data->BoardProduct, &StringIndex, NULL);
296 SMBIOS_OVERRIDE_S (Table, Standard.Type2->Version, Original, Data->BoardVersion, &StringIndex, NULL);
297 SMBIOS_OVERRIDE_S (Table, Standard.Type2->SerialNumber, Original, Data->BoardSerialNumber, &StringIndex, NULL);
298 SMBIOS_OVERRIDE_S (Table, Standard.Type2->AssetTag, Original, Data->BoardAssetTag, &StringIndex, NULL);
300 SMBIOS_OVERRIDE_S (Table, Standard.Type2->LocationInChassis, Original, Data->BoardLocationInChassis, &StringIndex, NULL);
302 SMBIOS_OVERRIDE_V (Table, Standard.Type2->BoardType, Original, Data->BoardType, NULL);
328 MinLength =
sizeof (*Original.
Standard.Type3);
334 MinLength -=
sizeof (Original.
Standard.Type3->ContainedElements[0]);
336 sizeof (Original.
Standard.Type3->ContainedElements) == sizeof (UINT8)*3,
337 "Please remove this hack, the structure should have been fixed by now."
344 MinLength +=
sizeof (SMBIOS_TABLE_STRING);
346 sizeof (*Original.
Standard.Type3) == sizeof (UINT8) * 0x18,
347 "The structure has changed, please fix this up."
354 SMBIOS_OVERRIDE_S (Table, Standard.Type3->Manufacturer, Original, Data->ChassisManufacturer, &StringIndex, NULL);
355 SMBIOS_OVERRIDE_V (Table, Standard.Type3->Type, Original, Data->ChassisType, NULL);
356 SMBIOS_OVERRIDE_S (Table, Standard.Type3->Version, Original, Data->ChassisVersion, &StringIndex, NULL);
357 SMBIOS_OVERRIDE_S (Table, Standard.Type3->SerialNumber, Original, Data->ChassisSerialNumber, &StringIndex, NULL);
358 SMBIOS_OVERRIDE_S (Table, Standard.Type3->AssetTag, Original, Data->ChassisAssetTag, &StringIndex, NULL);
360 SMBIOS_OVERRIDE_V (Table, Standard.Type3->PowerSupplyState, Original, NULL, NULL);
365 SMBIOS_OVERRIDE_V (Table, Standard.Type3->NumberofPowerCords, Original, NULL, NULL);
388 IN OUT UINT16 *Index,
389 IN SMBIOS_HANDLE OriginalHandle,
390 OUT SMBIOS_HANDLE *NewHandle
394 UINT16 NumberEntries;
403 if (OriginalHandle == 0xFFFF) {
409 DEBUG ((DEBUG_INFO,
"OCSMB: Number of CPU cache entries is %u\n", (UINT32)NumberEntries));
414 for (EntryNo = 1; EntryNo <= NumberEntries; ++EntryNo) {
416 if ( (Original.
Raw == NULL)
418 || (Original.
Standard.Type7->Hdr.Handle != OriginalHandle))
423 MinLength =
sizeof (*Original.
Standard.Type7);
430 SMBIOS_OVERRIDE_S (Table, Standard.Type7->SocketDesignation, Original, NULL, &StringIndex, NULL);
431 SMBIOS_OVERRIDE_V (Table, Standard.Type7->CacheConfiguration, Original, NULL, NULL);
432 SMBIOS_OVERRIDE_V (Table, Standard.Type7->MaximumCacheSize, Original, NULL, NULL);
434 SMBIOS_OVERRIDE_V (Table, Standard.Type7->SupportedSRAMType, Original, NULL, NULL);
435 SMBIOS_OVERRIDE_V (Table, Standard.Type7->CurrentSRAMType, Original, NULL, NULL);
437 SMBIOS_OVERRIDE_V (Table, Standard.Type7->ErrorCorrectionType, Original, NULL, NULL);
438 SMBIOS_OVERRIDE_V (Table, Standard.Type7->SystemCacheType, Original, NULL, NULL);
446 Table->CurrentPtr.Standard.Type7->MaximumCacheSize2 = Table->CurrentPtr.Standard.Type7->MaximumCacheSize & 0x7FFF;
447 Table->CurrentPtr.Standard.Type7->MaximumCacheSize2 |= Table->CurrentPtr.Standard.Type7->MaximumCacheSize & BIT15 ? BIT31 : 0;
448 Table->CurrentPtr.Standard.Type7->InstalledSize2 = Table->CurrentPtr.Standard.Type7->InstalledSize & 0x7FFF;
449 Table->CurrentPtr.Standard.Type7->InstalledSize2 |= Table->CurrentPtr.Standard.Type7->InstalledSize & BIT15 ? BIT31 : 0;
451 SMBIOS_OVERRIDE_V (Table, Standard.Type7->MaximumCacheSize2, Original, NULL, NULL);
455 *NewHandle = Table->CurrentPtr.Standard.Hdr->Handle;
476 UINT16 NumberEntries;
483 SMBIOS_HANDLE HandleL1Cache;
484 SMBIOS_HANDLE HandleL2Cache;
485 SMBIOS_HANDLE HandleL3Cache;
491 for (EntryNo = 1; EntryNo <= NumberEntries; EntryNo++) {
493 if (Original.
Raw == NULL) {
504 MinLength =
sizeof (*Original.
Standard.Type4);
511 SMBIOS_OVERRIDE_S (Table, Standard.Type4->Socket, Original, NULL, &StringIndex, NULL);
513 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ProcessorFamily, Original, NULL, NULL);
514 SMBIOS_OVERRIDE_S (Table, Standard.Type4->ProcessorManufacturer, Original, NULL, &StringIndex, NULL);
516 SMBIOS_OVERRIDE_S (Table, Standard.Type4->ProcessorVersion, Original, NULL, &StringIndex, NULL);
518 Table->CurrentPtr.Standard.Type4->ExternalClock = CpuInfo->ExternalClock;
522 DEBUG ((DEBUG_INFO,
"OCSMB: CPU%u display frequency is %uMHz\n", EntryNo, MhzSpeed));
524 Table->CurrentPtr.Standard.Type4->MaxSpeed = MhzSpeed;
525 Table->CurrentPtr.Standard.Type4->CurrentSpeed = Table->CurrentPtr.Standard.Type4->MaxSpeed;
528 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ProcessorUpgrade, Original, NULL, NULL);
530 Table->CurrentPtr.Standard.Type4->L1CacheHandle = HandleL1Cache;
531 Table->CurrentPtr.Standard.Type4->L2CacheHandle = HandleL2Cache;
532 Table->CurrentPtr.Standard.Type4->L3CacheHandle = HandleL3Cache;
534 SMBIOS_OVERRIDE_S (Table, Standard.Type4->SerialNumber, Original, NULL, &StringIndex, NULL);
538 SMBIOS_OVERRIDE_S (Table, Standard.Type4->AssetTag, Original, NULL, &StringIndex, NULL);
539 SMBIOS_OVERRIDE_S (Table, Standard.Type4->PartNumber, Original, NULL, &StringIndex, NULL);
541 TmpCount = (UINT8)(CpuInfo->CoreCount < 256 ? CpuInfo->CoreCount : 0xFF);
543 SMBIOS_OVERRIDE_V (Table, Standard.Type4->EnabledCoreCount, Original, NULL, &TmpCount);
544 TmpCount = (UINT8)(CpuInfo->ThreadCount < 256 ? CpuInfo->ThreadCount : 0xFF);
545 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ThreadCount, Original, NULL, &TmpCount);
546 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ProcessorCharacteristics, Original, NULL, NULL);
547 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ProcessorFamily2, Original, NULL, NULL);
548 SMBIOS_OVERRIDE_V (Table, Standard.Type4->CoreCount2, Original, NULL, &CpuInfo->CoreCount);
549 SMBIOS_OVERRIDE_V (Table, Standard.Type4->EnabledCoreCount2, Original, NULL, &CpuInfo->CoreCount);
550 SMBIOS_OVERRIDE_V (Table, Standard.Type4->ThreadCount2, Original, NULL, &CpuInfo->ThreadCount);
569 UINT16 NumberEntries;
576 for (EntryNo = 1; EntryNo <= NumberEntries; EntryNo++) {
578 if (Original.
Raw == NULL) {
582 MinLength =
sizeof (*Original.
Standard.Type8);
585 if (EFI_ERROR (
SmbiosInitialiseStruct (Table, SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, MinLength, EntryNo))) {
589 SMBIOS_OVERRIDE_S (Table, Standard.Type8->InternalReferenceDesignator, Original, NULL, &StringIndex, NULL);
590 SMBIOS_OVERRIDE_V (Table, Standard.Type8->InternalConnectorType, Original, NULL, NULL);
591 SMBIOS_OVERRIDE_S (Table, Standard.Type8->ExternalReferenceDesignator, Original, NULL, &StringIndex, NULL);
592 SMBIOS_OVERRIDE_V (Table, Standard.Type8->ExternalConnectorType, Original, NULL, NULL);
612 UINT16 NumberEntries;
616 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;
621 CONST CHAR8 *SlotDesignation;
623 Status =
gBS->LocateProtocol (
626 (VOID **)&PciRootBridgeIo
628 if (EFI_ERROR (Status)) {
629 PciRootBridgeIo = NULL;
634 for (EntryNo = 1; EntryNo <= NumberEntries; EntryNo++) {
636 if (Original.
Raw == NULL) {
640 MinLength =
sizeof (*Original.
Standard.Type9);
648 SMBIOS_OVERRIDE_V (Table, Standard.Type9->SlotDataBusWidth, Original, NULL, NULL);
652 SMBIOS_OVERRIDE_V (Table, Standard.Type9->SlotCharacteristics1, Original, NULL, NULL);
653 SMBIOS_OVERRIDE_V (Table, Standard.Type9->SlotCharacteristics2, Original, NULL, NULL);
654 SMBIOS_OVERRIDE_V (Table, Standard.Type9->SegmentGroupNum, Original, NULL, NULL);
662 if (PciRootBridgeIo == NULL) {
663 SMBIOS_OVERRIDE_S (Table, Standard.Type9->SlotDesignation, Original, NULL, &StringIndex, NULL);
666 SlotDesignation = NULL;
667 Table->CurrentPtr.Standard.Type9->CurrentUsage = SlotUsageAvailable;
669 if (Table->CurrentPtr.Standard.Type9->BusNum != 0) {
670 PciAddress = EFI_PCI_ADDRESS (
671 BitFieldRead8 (Table->CurrentPtr.Standard.Type9->DevFuncNum, 3, 7),
672 Table->CurrentPtr.Standard.Type9->BusNum,
673 BitFieldRead8 (Table->CurrentPtr.Standard.Type9->DevFuncNum, 0, 2),
677 PciAddress = EFI_PCI_ADDRESS (
678 Table->CurrentPtr.Standard.Type9->BusNum,
679 BitFieldRead8 (Table->CurrentPtr.Standard.Type9->DevFuncNum, 3, 7),
680 BitFieldRead8 (Table->CurrentPtr.Standard.Type9->DevFuncNum, 0, 2),
685 SecSubBus = MAX_UINT8;
686 ClassCode = MAX_UINT16;
687 Status = PciRootBridgeIo->Pci.Read (
690 PciAddress + PCI_BRIDGE_SECONDARY_BUS_REGISTER_OFFSET,
695 if (!EFI_ERROR (Status) && (SecSubBus != MAX_UINT8)) {
696 Status = PciRootBridgeIo->Pci.Read (
699 EFI_PCI_ADDRESS (SecSubBus, 0, 0, 0) + 10,
705 if (!EFI_ERROR (Status) && (ClassCode != MAX_UINT16)) {
706 Table->CurrentPtr.Standard.Type9->CurrentUsage = SlotUsageAvailable;
707 if (ClassCode == 0x0280) {
708 SlotDesignation =
"AirPort";
709 }
else if (ClassCode == 0x0108) {
713 SlotDesignation =
"M.2";
717 SMBIOS_OVERRIDE_S (Table, Standard.Type9->SlotDesignation, Original, SlotDesignation, &StringIndex, NULL);
742 MinLength =
sizeof (*Original.Standard.Type16);
750 SMBIOS_OVERRIDE_V (Table, Standard.Type16->MemoryErrorCorrection, Original, NULL, NULL);
751 SMBIOS_OVERRIDE_V (Table, Standard.Type16->MaximumCapacity, Original, NULL, NULL);
755 Table->CurrentPtr.Standard.Type16->MemoryErrorInformationHandle = 0xFFFF;
756 SMBIOS_OVERRIDE_V (Table, Standard.Type16->NumberOfMemoryDevices, Original, NULL, NULL);
757 SMBIOS_OVERRIDE_V (Table, Standard.Type16->ExtendedMaximumCapacity, Original, NULL, NULL);
762 *
Handle = Table->CurrentPtr.Standard.Hdr->Handle;
783 MinLength =
sizeof (*Table->CurrentPtr.Standard.Type16);
789 Table->CurrentPtr.Standard.Type16->Location = MemoryArrayLocationSystemBoard;
790 Table->CurrentPtr.Standard.Type16->Use = MemoryArrayUseSystemMemory;
791 Table->CurrentPtr.Standard.Type16->MemoryErrorCorrection = *Data->MemoryErrorCorrection;
795 Table->CurrentPtr.Standard.Type16->MemoryErrorInformationHandle = 0xFFFF;
796 Table->CurrentPtr.Standard.Type16->NumberOfMemoryDevices = Data->MemoryDevicesCount;
802 if (*Data->MemoryMaxCapacity < SIZE_2TB) {
803 Table->CurrentPtr.Standard.Type16->MaximumCapacity = (UINT32)(*Data->MemoryMaxCapacity / SIZE_1KB);
804 Table->CurrentPtr.Standard.Type16->ExtendedMaximumCapacity = 0;
806 Table->CurrentPtr.Standard.Type16->MaximumCapacity = SIZE_2TB / SIZE_1KB;
807 Table->CurrentPtr.Standard.Type16->ExtendedMaximumCapacity = *Data->MemoryMaxCapacity;
813 *
Handle = Table->CurrentPtr.Standard.Hdr->Handle;
828 IN SMBIOS_HANDLE MemoryArrayHandle,
839 MinLength =
sizeof (*Original.Standard.Type17);
853 SMBIOS_OVERRIDE_V (Table, Standard.Type17->FormFactor, Original, &FormFactor, NULL);
855 SMBIOS_OVERRIDE_S (Table, Standard.Type17->DeviceLocator, Original, NULL, &StringIndex, NULL);
856 SMBIOS_OVERRIDE_S (Table, Standard.Type17->BankLocator, Original, NULL, &StringIndex, NULL);
865 Table->CurrentPtr.Standard.Type17->MemoryArrayHandle = MemoryArrayHandle;
866 Table->CurrentPtr.Standard.Type17->MemoryErrorInformationHandle = 0xFFFF;
874 if (Table->CurrentPtr.Standard.Type17->Size > 0) {
875 SMBIOS_OVERRIDE_S (Table, Standard.Type17->Manufacturer, Original, NULL, &StringIndex,
"Unknown");
876 SMBIOS_OVERRIDE_S (Table, Standard.Type17->SerialNumber, Original, NULL, &StringIndex,
"Unknown");
877 SMBIOS_OVERRIDE_S (Table, Standard.Type17->AssetTag, Original, NULL, &StringIndex,
"Unknown");
878 SMBIOS_OVERRIDE_S (Table, Standard.Type17->PartNumber, Original, NULL, &StringIndex,
"Unknown");
881 Table->CurrentPtr.Standard.Type17->Manufacturer = StringIndex;
882 Table->CurrentPtr.Standard.Type17->SerialNumber = StringIndex;
883 Table->CurrentPtr.Standard.Type17->AssetTag = StringIndex;
884 Table->CurrentPtr.Standard.Type17->PartNumber = StringIndex;
889 SMBIOS_OVERRIDE_V (Table, Standard.Type17->ConfiguredMemoryClockSpeed, Original, NULL, NULL);
890 SMBIOS_OVERRIDE_V (Table, Standard.Type17->MinimumVoltage, Original, NULL, NULL);
891 SMBIOS_OVERRIDE_V (Table, Standard.Type17->MaximumVoltage, Original, NULL, NULL);
892 SMBIOS_OVERRIDE_V (Table, Standard.Type17->ConfiguredVoltage, Original, NULL, NULL);
897 *
Handle = Table->CurrentPtr.Standard.Hdr->Handle;
913 IN SMBIOS_HANDLE MemoryArrayHandle,
922 MinLength =
sizeof (*Table->CurrentPtr.Standard.Type17);
929 Table->CurrentPtr.Standard.Type17->TotalWidth = *Data->MemoryTotalWidth;
930 Table->CurrentPtr.Standard.Type17->DataWidth = *Data->MemoryDataWidth;
931 Table->CurrentPtr.Standard.Type17->FormFactor = *Data->MemoryFormFactor;
932 Table->CurrentPtr.Standard.Type17->MemoryType = *Data->MemoryType;
933 Table->CurrentPtr.Standard.Type17->TypeDetail = *((MEMORY_DEVICE_TYPE_DETAIL *)Data->MemoryTypeDetail);
934 Table->CurrentPtr.Standard.Type17->Speed = *DeviceData->Speed;
940 if ((UINT64)(*DeviceData->Size) * SIZE_1MB < SIZE_32GB - SIZE_1MB) {
941 Table->CurrentPtr.Standard.Type17->Size = (UINT16)*DeviceData->Size;
942 Table->CurrentPtr.Standard.Type17->ExtendedSize = 0;
944 Table->CurrentPtr.Standard.Type17->Size = 0x7FFF;
945 Table->CurrentPtr.Standard.Type17->ExtendedSize = *DeviceData->Size;
949 Table->CurrentPtr.Standard.Type17->AssetTag = StringIndex;
951 Table->CurrentPtr.Standard.Type17->BankLocator = StringIndex;
953 Table->CurrentPtr.Standard.Type17->DeviceLocator = StringIndex;
955 Table->CurrentPtr.Standard.Type17->Manufacturer = StringIndex;
957 Table->CurrentPtr.Standard.Type17->PartNumber = StringIndex;
959 Table->CurrentPtr.Standard.Type17->SerialNumber = StringIndex;
965 Table->CurrentPtr.Standard.Type17->MemoryArrayHandle = MemoryArrayHandle;
966 Table->CurrentPtr.Standard.Type17->MemoryErrorInformationHandle = 0xFFFF;
971 *
Handle = Table->CurrentPtr.Standard.Hdr->Handle;
986 IN SMBIOS_HANDLE MemoryArrayHandle,
990 IN OUT UINT16 *MappingNum
995 MinLength =
sizeof (*Original.Standard.Type19);
997 if (EFI_ERROR (
SmbiosInitialiseStruct (Table, SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, MinLength, Index))) {
1001 SMBIOS_OVERRIDE_V (Table, Standard.Type19->StartingAddress, Original, NULL, NULL);
1002 SMBIOS_OVERRIDE_V (Table, Standard.Type19->EndingAddress, Original, NULL, NULL);
1003 Table->CurrentPtr.Standard.Type19->MemoryArrayHandle = MemoryArrayHandle;
1004 SMBIOS_OVERRIDE_V (Table, Standard.Type19->PartitionWidth, Original, NULL, NULL);
1005 SMBIOS_OVERRIDE_V (Table, Standard.Type19->ExtendedStartingAddress, Original, NULL, NULL);
1006 SMBIOS_OVERRIDE_V (Table, Standard.Type19->ExtendedEndingAddress, Original, NULL, NULL);
1009 Mapping[*MappingNum].Old = Original.Standard.Hdr->Handle;
1010 Mapping[*MappingNum].New = Table->CurrentPtr.Standard.Hdr->Handle;
1016 DEBUG ((DEBUG_WARN,
"OCSMB: OC_SMBIOS_MAX_MAPPING exceeded\n"));
1034 IN SMBIOS_HANDLE MemoryDeviceHandle,
1036 IN UINT16 MappingNum
1042 MinLength =
sizeof (*Original.Standard.Type20);
1044 if (EFI_ERROR (
SmbiosInitialiseStruct (Table, SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, MinLength, Index))) {
1048 SMBIOS_OVERRIDE_V (Table, Standard.Type20->StartingAddress, Original, NULL, NULL);
1049 SMBIOS_OVERRIDE_V (Table, Standard.Type20->EndingAddress, Original, NULL, NULL);
1050 Table->CurrentPtr.Standard.Type20->MemoryDeviceHandle = MemoryDeviceHandle;
1052 Table->CurrentPtr.Standard.Type20->MemoryArrayMappedAddressHandle = 0xFFFF;
1053 if ((Original.Raw != NULL) &&
SMBIOS_ACCESSIBLE (Original, Standard.Type20->MemoryArrayMappedAddressHandle)) {
1054 for (MapIndex = 0; MapIndex < MappingNum; MapIndex++) {
1055 if (Mapping[MapIndex].Old == Original.Standard.Type20->MemoryArrayMappedAddressHandle) {
1056 Table->CurrentPtr.Standard.Type20->MemoryArrayMappedAddressHandle = Mapping[MapIndex].New;
1062 SMBIOS_OVERRIDE_V (Table, Standard.Type20->PartitionRowPosition, Original, NULL, NULL);
1063 SMBIOS_OVERRIDE_V (Table, Standard.Type20->InterleavePosition, Original, NULL, NULL);
1064 SMBIOS_OVERRIDE_V (Table, Standard.Type20->InterleavedDataDepth, Original, NULL, NULL);
1065 SMBIOS_OVERRIDE_V (Table, Standard.Type20->ExtendedStartingAddress, Original, NULL, NULL);
1066 SMBIOS_OVERRIDE_V (Table, Standard.Type20->ExtendedEndingAddress, Original, NULL, NULL);
1088 MinLength =
sizeof (*Original.
Standard.Type22);
1094 if (Original.
Raw == NULL) {
1102 SMBIOS_OVERRIDE_S (Table, Standard.Type22->Location, Original, NULL, &StringIndex, NULL);
1103 SMBIOS_OVERRIDE_S (Table, Standard.Type22->Manufacturer, Original, NULL, &StringIndex, NULL);
1104 SMBIOS_OVERRIDE_S (Table, Standard.Type22->ManufactureDate, Original, NULL, &StringIndex, NULL);
1105 SMBIOS_OVERRIDE_S (Table, Standard.Type22->SerialNumber, Original, NULL, &StringIndex, NULL);
1106 SMBIOS_OVERRIDE_S (Table, Standard.Type22->DeviceName, Original, NULL, &StringIndex, NULL);
1107 SMBIOS_OVERRIDE_V (Table, Standard.Type22->DeviceChemistry, Original, NULL, NULL);
1108 SMBIOS_OVERRIDE_V (Table, Standard.Type22->DeviceCapacity, Original, NULL, NULL);
1109 SMBIOS_OVERRIDE_V (Table, Standard.Type22->DesignVoltage, Original, NULL, NULL);
1110 SMBIOS_OVERRIDE_S (Table, Standard.Type22->SBDSVersionNumber, Original, NULL, &StringIndex, NULL);
1111 SMBIOS_OVERRIDE_V (Table, Standard.Type22->MaximumErrorInBatteryData, Original, NULL, NULL);
1112 SMBIOS_OVERRIDE_V (Table, Standard.Type22->SBDSSerialNumber, Original, NULL, NULL);
1113 SMBIOS_OVERRIDE_V (Table, Standard.Type22->SBDSManufactureDate, Original, NULL, NULL);
1114 SMBIOS_OVERRIDE_S (Table, Standard.Type22->SBDSDeviceChemistry, Original, NULL, &StringIndex, NULL);
1115 SMBIOS_OVERRIDE_V (Table, Standard.Type22->DesignCapacityMultiplier, Original, NULL, NULL);
1137 MinLength =
sizeof (*Original.
Standard.Type32);
1160 IN BOOLEAN HasAppleSMBIOS
1171 if (HasAppleSMBIOS) {
1174 Original.
Raw = NULL;
1177 MinLength =
sizeof (*Table->CurrentPtr.Type128);
1213 Original.
Raw = NULL;
1214 MinLength =
sizeof (*Table->CurrentPtr.Type131);
1220 SMBIOS_OVERRIDE_V (Table, Type131->ProcessorType.Type, Original, Data->ProcessorType, &CpuInfo->AppleProcessorType);
1239 #ifndef OC_PROVIDE_APPLE_PROCESSOR_BUS_SPEED
1249 MinLength =
sizeof (*Table->CurrentPtr.Type132);
1255 Table->CurrentPtr.Type132->ProcessorBusSpeed = CpuInfo->ExternalClock * 4;
1272 IN BOOLEAN HasAppleSMBIOS
1278 if (HasAppleSMBIOS) {
1281 Original.
Raw = NULL;
1287 if ((Data->PlatformFeature == NULL) && (Original.
Raw == NULL)) {
1291 MinLength =
sizeof (*Table->CurrentPtr.Type133);
1297 SMBIOS_OVERRIDE_V (Table, Type133->PlatformFeature, Original, Data->PlatformFeature, NULL);
1313 IN BOOLEAN HasAppleSMBIOS
1319 if (HasAppleSMBIOS) {
1322 Original.
Raw = NULL;
1328 if ((Data->SmcVersion == NULL) && (Original.
Raw == NULL)) {
1332 MinLength =
sizeof (*Table->CurrentPtr.Type134);
1338 SMBIOS_OVERRIDE_V (Table, Type134->SmcVersion, Original, Data->SmcVersion, NULL);
1357 MinLength =
sizeof (*Table->CurrentPtr.Standard.Type127);
1396 if (EFI_ERROR (Status)) {
1397 DEBUG ((DEBUG_INFO,
"OCSMB: LegacyRegionUnlock DMI anchor failure - %r\n", Status));
1411 if (EFI_ERROR (Status)) {
1412 DEBUG ((DEBUG_INFO,
"OCSMB: LegacyRegionUnlock DMI table failure - %r\n", Status));
1426 if (EFI_ERROR (Status)) {
1427 DEBUG ((DEBUG_INFO,
"OCSMB: LegacyRegionLock DMI table failure - %r\n", Status));
1441 if (EFI_ERROR (Status)) {
1442 DEBUG ((DEBUG_INFO,
"OCSMB: LegacyRegionLock DMI anchor failure - %r\n", Status));
1462 ZeroMem (SmbiosTable,
sizeof (*SmbiosTable));
1465 Status = EfiGetSystemConfigurationTable (
1474 if (!EFI_ERROR (Status)) {
1475 if (
mOriginalSmbios->EntryPointLength < sizeof (SMBIOS_TABLE_ENTRY_POINT)) {
1478 "OCSMB: SmbiosLookupHost entry is too small - %u/%u bytes\n",
1480 (UINT32)sizeof (SMBIOS_TABLE_ENTRY_POINT)
1486 && SMBIOS_TABLE_MAX_LENGTH == MAX_UINT16,
1487 "mOriginalTable->TableLength may exceed SMBIOS_TABLE_MAX_LENGTH"
1491 "OCSMB: SmbiosLookupHost entry has invalid table - %08X of %u bytes\n",
1498 DEBUG ((DEBUG_WARN,
"OCSMB: SmbiosLookupHost failed to lookup SMBIOSv1 - %r\n", Status));
1504 Status = EfiGetSystemConfigurationTable (
1509 if (!EFI_ERROR (Status)) {
1510 if (
mOriginalSmbios3->EntryPointLength < sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT)) {
1513 "OCSMB: SmbiosLookupHost v3 entry is too small - %u/%u bytes\n",
1515 (UINT32)sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT)
1521 && SMBIOS_3_0_TABLE_MAX_LENGTH == MAX_UINT32,
1522 "mOriginalSmbios3->TableMaximumSize may exceed SMBIOS_3_0_TABLE_MAX_LENGTH"
1526 "OCSMB: SmbiosLookupHost v3 entry has invalid table - %016LX of %u bytes\n",
1533 DEBUG ((DEBUG_INFO,
"OCSMB: SmbiosLookupHost failed to lookup SMBIOSv3 - %r\n", Status));
1551 "OCSMB: Found DMI Anchor %p v%u.%u Table Address %08LX Length %04X\n",
1563 "OCSMB: Found DMI Anchor %p v%u.%u Table Address %08LX Length %04X\n",
1573 if (EFI_ERROR (Status)) {
1574 DEBUG ((DEBUG_VERBOSE,
"OCSMB: SmbiosLookupHost failed to initialise smbios table - %r\n", Status));
1585 if (Table->Table != NULL) {
1586 FreePool (Table->Table);
1589 ZeroMem (Table,
sizeof (*Table));
1595 IN UINT16 TableLength,
1596 IN OUT SMBIOS_TABLE_ENTRY_POINT **TableEntryPoint,
1597 IN OUT SMBIOS_TABLE_3_0_ENTRY_POINT **TableEntryPoint3,
1598 IN OUT VOID **TableAddress,
1599 IN OUT VOID **TableAddress3
1604 EFI_PHYSICAL_ADDRESS TmpAddr;
1606 TablePages = EFI_SIZE_TO_PAGES (TableLength);
1607 *TableEntryPoint = NULL;
1608 *TableEntryPoint3 = NULL;
1609 *TableAddress = NULL;
1610 *TableAddress3 = NULL;
1612 TmpAddr = (BASE_4GB - 1);
1613 Status =
gBS->AllocatePages (AllocateMaxAddress, EfiReservedMemoryType, TablePages, &TmpAddr);
1614 if (!EFI_ERROR (Status)) {
1615 *TableAddress = (VOID *)(UINTN)TmpAddr;
1616 TmpAddr = (BASE_4GB - 1);
1617 Status =
gBS->AllocatePages (AllocateMaxAddress, EfiReservedMemoryType, 1, &TmpAddr);
1618 if (!EFI_ERROR (Status)) {
1619 *TableEntryPoint = (SMBIOS_TABLE_ENTRY_POINT *)(UINTN)TmpAddr;
1621 TmpAddr = (BASE_4GB - 1);
1622 Status =
gBS->AllocatePages (AllocateMaxAddress, EfiReservedMemoryType, 1, &TmpAddr);
1623 if (!EFI_ERROR (Status)) {
1624 *TableEntryPoint3 = (SMBIOS_TABLE_3_0_ENTRY_POINT *)(UINTN)TmpAddr;
1625 *TableAddress3 = *TableAddress;
1631 if (EFI_ERROR (Status)) {
1634 "OCSMB: SmbiosTableAllocate aborts as it cannot allocate SMBIOS pages with %d %d %d - %r\n",
1635 *TableEntryPoint != NULL,
1636 *TableAddress != NULL,
1637 *TableEntryPoint3 != NULL,
1640 if (*TableEntryPoint != NULL) {
1641 FreePages (*TableEntryPoint, 1);
1644 if (*TableEntryPoint3 != NULL) {
1645 FreePages (*TableEntryPoint3, 1);
1648 if (*TableAddress != NULL) {
1649 FreePages (*TableAddress, TablePages);
1655 ZeroMem (*TableAddress, TablePages * EFI_PAGE_SIZE);
1656 ZeroMem (*TableEntryPoint, EFI_PAGE_SIZE);
1658 ZeroMem (*TableEntryPoint3, EFI_PAGE_SIZE);
1673 SMBIOS_TABLE_ENTRY_POINT *TableEntryPoint;
1674 SMBIOS_TABLE_3_0_ENTRY_POINT *TableEntryPoint3;
1676 VOID *TableAddress3;
1688 TableLength = (UINT16)(SmbiosTable->CurrentPtr.Raw - SmbiosTable->Table);
1692 "OCSMB: Applying %u (%d) prev %p (%u/%u), %p (%u/%u)\n",
1693 (UINT32)TableLength,
1706 if (EFI_ERROR (Status)) {
1707 DEBUG ((DEBUG_WARN,
"OCSMB: Apply(%u) cannot handle legacy region - %r\n", Mode, Status));
1717 || (
mOriginalSmbios->EntryPointLength < sizeof (SMBIOS_TABLE_ENTRY_POINT)))
1721 "OCSMB: Apply(%u) cannot update old SMBIOS (%p, %u, %u) with %u\n",
1729 return EFI_OUT_OF_RESOURCES;
1737 || (
mOriginalSmbios3->EntryPointLength < sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT))))
1741 "OCSMB: Apply(%u) cannot fit SMBIOSv3 (%p, %u, %u) with %u\n",
1749 return EFI_OUT_OF_RESOURCES;
1768 if (EFI_ERROR (Status)) {
1774 TableAddress = (VOID *)(UINTN)TableEntryPoint->TableAddress;
1775 ZeroMem (TableEntryPoint,
sizeof (SMBIOS_TABLE_ENTRY_POINT));
1776 ZeroMem (TableAddress, TableEntryPoint->TableLength);
1777 if (TableEntryPoint3 != NULL) {
1778 TableAddress3 = (VOID *)(UINTN)TableEntryPoint3->TableAddress;
1779 ZeroMem (TableEntryPoint3,
sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT));
1780 ZeroMem (TableAddress3, TableEntryPoint3->TableMaximumSize);
1782 TableAddress3 = NULL;
1792 if ((TableAddress3 != NULL) && (TableAddress3 != TableAddress)) {
1800 TableEntryPoint->AnchorString[0] = (UINT8)
'_';
1801 TableEntryPoint->AnchorString[1] = (UINT8)
'S';
1802 TableEntryPoint->AnchorString[2] = (UINT8)
'M';
1803 TableEntryPoint->AnchorString[3] = (UINT8)
'_';
1804 TableEntryPoint->EntryPointLength =
sizeof (SMBIOS_TABLE_ENTRY_POINT);
1805 TableEntryPoint->MajorVersion = 3;
1806 TableEntryPoint->MinorVersion = 2;
1807 TableEntryPoint->MaxStructureSize = SmbiosTable->MaxStructureSize;
1808 TableEntryPoint->IntermediateAnchorString[0] = (UINT8)
'_';
1809 TableEntryPoint->IntermediateAnchorString[1] = (UINT8)
'D';
1810 TableEntryPoint->IntermediateAnchorString[2] = (UINT8)
'M';
1811 TableEntryPoint->IntermediateAnchorString[3] = (UINT8)
'I';
1812 TableEntryPoint->IntermediateAnchorString[4] = (UINT8)
'_';
1813 TableEntryPoint->TableLength = TableLength;
1814 TableEntryPoint->TableAddress = (UINT32)(UINTN)TableAddress;
1815 TableEntryPoint->NumberOfSmbiosStructures = SmbiosTable->NumberOfStructures;
1816 TableEntryPoint->SmbiosBcdRevision = 0x32;
1817 TableEntryPoint->IntermediateChecksum = CalculateCheckSum8 (
1818 (UINT8 *)TableEntryPoint + OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString),
1819 TableEntryPoint->EntryPointLength - OFFSET_OF (SMBIOS_TABLE_ENTRY_POINT, IntermediateAnchorString)
1821 TableEntryPoint->EntryPointStructureChecksum = CalculateCheckSum8 (
1822 (UINT8 *)TableEntryPoint,
1823 TableEntryPoint->EntryPointLength
1826 if (TableEntryPoint3 != NULL) {
1827 TableEntryPoint3->AnchorString[0] = (UINT8)
'_';
1828 TableEntryPoint3->AnchorString[1] = (UINT8)
'S';
1829 TableEntryPoint3->AnchorString[2] = (UINT8)
'M';
1830 TableEntryPoint3->AnchorString[3] = (UINT8)
'3';
1831 TableEntryPoint3->AnchorString[4] = (UINT8)
'_';
1832 TableEntryPoint3->EntryPointLength =
sizeof (SMBIOS_TABLE_3_0_ENTRY_POINT);
1833 TableEntryPoint3->MajorVersion = 3;
1834 TableEntryPoint3->MinorVersion = 2;
1835 TableEntryPoint3->EntryPointRevision = 1;
1836 TableEntryPoint3->TableMaximumSize = TableLength;
1837 TableEntryPoint3->TableAddress = (UINT64)(UINTN)TableAddress;
1838 TableEntryPoint3->EntryPointStructureChecksum = CalculateCheckSum8 (
1839 (UINT8 *)TableEntryPoint3,
1840 TableEntryPoint3->EntryPointLength
1846 "OCSMB: Patched %p v%d.%d Table Address %08LX Length %04X %X %X\n",
1848 TableEntryPoint->MajorVersion,
1849 TableEntryPoint->MinorVersion,
1850 (UINT64)TableEntryPoint->TableAddress,
1851 TableEntryPoint->TableLength,
1852 TableEntryPoint->EntryPointStructureChecksum,
1853 TableEntryPoint->IntermediateChecksum
1859 if (TableEntryPoint3 != NULL) {
1860 Status =
gBS->InstallConfigurationTable (
1865 if (EFI_ERROR (Status)) {
1866 DEBUG ((DEBUG_WARN,
"OCSMB: Failed to install v3 table - %r\n", Status));
1870 Status =
gBS->InstallConfigurationTable (
1875 if (EFI_ERROR (Status)) {
1876 DEBUG ((DEBUG_WARN,
"OCSMB: Failed to install v1 table - %r\n", Status));
1886 IN CONST UINT8 *SmcRevision,
1895 Temp = SmcRevision[0];
1905 SmcVersion[Index + 1] = ((Temp & 0x0F) | 0x30);
1912 Temp = SmcRevision[1];
1925 Temp = SmcRevision[2];
1927 if ((Temp & 0xF0) != 0) {
1955 Temp = SmcRevision[3];
1968 Temp = SmcRevision[4];
1981 Temp = SmcRevision[5];
1997 IN CONST CHAR8 *UpdateMode
2000 if (AsciiStrCmp (UpdateMode,
"TryOverwrite") == 0) {
2004 if (AsciiStrCmp (UpdateMode,
"Create") == 0) {
2008 if (AsciiStrCmp (UpdateMode,
"Overwrite") == 0) {
2012 if (AsciiStrCmp (UpdateMode,
"Custom") == 0) {
2016 DEBUG ((DEBUG_INFO,
"OCSMB: Invalid SMBIOS update mode %a\n", UpdateMode));
2034 SMBIOS_HANDLE MemoryArrayHandle;
2035 SMBIOS_HANDLE MemoryDeviceHandle;
2036 UINT16 NumMemoryArrays;
2037 UINT16 NumMemoryArrayMapped;
2038 UINT16 NumMemoryDevices;
2039 UINT16 NumMemoryDeviceMapped;
2040 UINT16 MemoryArrayNo;
2041 UINT16 MemoryArrayMappedNo;
2042 UINT16 MemoryDeviceNo;
2043 UINT16 MemoryDeviceMappedNo;
2044 UINT16 MemoryArrayNewIndex;
2045 UINT16 MemoryArrayMappedNewIndex;
2046 UINT16 MemoryDeviceNewIndex;
2047 UINT16 MemoryDeviceMappedNewIndex;
2051 BOOLEAN HasAppleSMBIOS;
2056 if (Mapping == NULL) {
2057 DEBUG ((DEBUG_WARN,
"OCSMB: Cannot allocate mapping table\n"));
2058 return EFI_OUT_OF_RESOURCES;
2075 if (Data->HasCustomMemory) {
2085 for (MemoryDeviceNo = 0; MemoryDeviceNo < Data->MemoryDevicesCount; MemoryDeviceNo++) {
2089 &Data->MemoryDevices[MemoryDeviceNo],
2101 MemoryArrayNewIndex = 1;
2102 MemoryArrayMappedNewIndex = 1;
2103 MemoryDeviceNewIndex = 1;
2104 MemoryDeviceMappedNewIndex = 1;
2106 for (MemoryArrayNo = 0; MemoryArrayNo < NumMemoryArrays; MemoryArrayNo++) {
2112 if ( (MemoryArray.
Raw == NULL)
2113 || (MemoryArray.
Standard.Type16->Use != MemoryArrayUseSystemMemory))
2125 MemoryArrayNewIndex,
2128 MemoryArrayNewIndex++;
2133 for (MemoryArrayMappedNo = 0; MemoryArrayMappedNo < NumMemoryArrayMapped; MemoryArrayMappedNo++) {
2136 if ( (MemoryArrayAddress.
Raw == NULL)
2137 || (MemoryArrayAddress.
Standard.Type19->MemoryArrayHandle != MemoryArray.
Standard.Type16->Hdr.Handle))
2147 MemoryArrayMappedNewIndex,
2151 MemoryArrayMappedNewIndex++;
2157 for (MemoryDeviceNo = 0; MemoryDeviceNo < NumMemoryDevices; MemoryDeviceNo++) {
2160 if ( (MemoryDeviceInfo.
Raw == NULL)
2161 || (MemoryDeviceInfo.
Standard.Type17->MemoryArrayHandle != MemoryArray.
Standard.Type16->Hdr.Handle))
2171 MemoryDeviceNewIndex,
2174 MemoryDeviceNewIndex++;
2179 for (MemoryDeviceMappedNo = 0; MemoryDeviceMappedNo < NumMemoryDeviceMapped; MemoryDeviceMappedNo++) {
2182 if ( (MemoryDeviceAddress.
Raw != NULL)
2184 && (MemoryDeviceAddress.
Standard.Type20->MemoryDeviceHandle ==
2185 MemoryDeviceInfo.
Standard.Type17->Hdr.Handle))
2190 MemoryDeviceAddress,
2191 MemoryDeviceMappedNewIndex,
2196 MemoryDeviceMappedNewIndex++;
2222 OUT CHAR8 *ProductName OPTIONAL,
2223 OUT CHAR8 *SerialNumber OPTIONAL,
2224 OUT EFI_GUID *SystemUuid OPTIONAL,
2225 OUT CHAR8 *Mlb OPTIONAL,
2226 OUT UINT8 *Rom OPTIONAL,
2227 IN BOOLEAN UuidIsRawEncoded,
2228 IN BOOLEAN UseVariableStorage
2232 CONST CHAR8 *SmProductName;
2233 CONST CHAR8 *SmManufacturer;
2234 CONST CHAR8 *SmBoard;
2243 SmProductName = NULL;
2244 SmManufacturer = NULL;
2248 if (Original.
Raw != NULL) {
2251 if ((SmProductName != NULL) && (ProductName != NULL)) {
2253 if (EFI_ERROR (Status)) {
2254 DEBUG ((DEBUG_INFO,
"OCSMB: Failed to copy SMBIOS product name %a\n", SmProductName));
2259 if ((SerialNumber != NULL) &&
SMBIOS_ACCESSIBLE (Original, Standard.Type1->SerialNumber)) {
2261 if (SmTmp != NULL) {
2263 if (EFI_ERROR (Status)) {
2264 DEBUG ((DEBUG_INFO,
"OCSMB: Failed to copy SMBIOS product serial %a\n", SmTmp));
2269 if ((SystemUuid != NULL) &&
SMBIOS_ACCESSIBLE (Original, Standard.Type1->Uuid)) {
2272 UuidWalker = (UINT8 *)&Original.
Standard.Type1->Uuid;
2273 for (Index = 0; Index <
sizeof (Original.
Standard.Type1->Uuid); ++Index) {
2274 if (UuidWalker[Index] == 0x00) {
2276 }
else if (UuidWalker[Index] == 0xFF) {
2281 if ((MinCount < 4) && (MaxCount < 4)) {
2286 if (!UuidIsRawEncoded) {
2287 SystemUuid->Data1 = SwapBytes32 (SystemUuid->Data1);
2288 SystemUuid->Data2 = SwapBytes16 (SystemUuid->Data2);
2289 SystemUuid->Data3 = SwapBytes16 (SystemUuid->Data3);
2294 "OCSMB: Ignoring UUID %g due to low entropy\n",
2302 if (Original.
Raw != NULL) {
2311 if ((Mlb != NULL) &&
SMBIOS_ACCESSIBLE (Original, Standard.Type2->SerialNumber)) {
2313 if (SmTmp != NULL) {
2315 if (EFI_ERROR (Status)) {
2316 DEBUG ((DEBUG_INFO,
"OCSMB: Failed to copy SMBIOS board serial %a\n", SmTmp));
2324 Status =
gRT->GetVariable (
2331 if (!EFI_ERROR (Status)) {
2333 DEBUG ((DEBUG_INFO,
"OCSMB: MLB from NVRAM took precedence: %a\n", Mlb));
2337 if (SerialNumber != NULL) {
2339 Status =
gRT->GetVariable (
2346 if (!EFI_ERROR (Status)) {
2348 DEBUG ((DEBUG_INFO,
"OCSMB: SSN from NVRAM took precedence: %a\n", SerialNumber));
2354 Status =
gRT->GetVariable (
2366 if (SystemUuid != NULL) {
2367 TmpSize =
sizeof (EFI_GUID);
2368 Status =
gRT->GetVariable (
2375 if (!EFI_ERROR (Status) && (TmpSize ==
sizeof (EFI_GUID))) {
2376 DEBUG ((DEBUG_INFO,
"OCSMB: UUID from NVRAM took precedence: %g\n", SystemUuid));
2377 }
else if (TmpSize !=
sizeof (EFI_GUID)) {
2378 ZeroMem (SystemUuid,
sizeof (EFI_GUID));
2384 "OCSMB: Current SMBIOS %a (%a made by %a)\n",
2390 if ((ProductName != NULL) && (SmProductName != NULL)) {
2392 if (EFI_ERROR (Status)) {
2393 DEBUG ((DEBUG_INFO,
"OCSMB: Failed to copy SMBIOS product name %a\n", SmProductName));
2397 if (UseVariableStorage) {
2398 if (SmProductName != NULL) {
2401 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2402 AsciiStrLen (SmProductName),
2403 (VOID *)SmProductName,
2406 if (EFI_ERROR (Status)) {
2407 DEBUG ((DEBUG_INFO,
"OCSMB: Cannot write OEM product\n"));
2411 if ((SmManufacturer != NULL) && (SmBoard != NULL)) {
2414 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2415 AsciiStrLen (SmManufacturer),
2416 (VOID *)SmManufacturer,
2419 if (EFI_ERROR (Status)) {
2420 DEBUG ((DEBUG_INFO,
"OCSMB: Cannot write OEM board manufacturer - %r\n", Status));
2425 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
2426 AsciiStrLen (SmBoard),
2430 if (EFI_ERROR (Status)) {
2431 DEBUG ((DEBUG_INFO,
"OCSMB: Cannot write OEM board - %r\n", Status));
UINT8 Vendor[11]
This is always 0x43f and can be used to identify an Apple Remote.
#define APPLE_SMBIOS_SMC_VERSION_SIZE
#define APPLE_SMBIOS_TYPE_PROCESSOR_BUS_SPEED
#define APPLE_SMBIOS_TYPE_FIRMWARE_INFORMATION
UINT8 SmcVersion[APPLE_SMBIOS_SMC_VERSION_SIZE]
#define APPLE_SMBIOS_TYPE_PROCESSOR_TYPE
#define APPLE_SMBIOS_TYPE_SMC_INFORMATION
UINT32 FirmwareFeaturesMask
#define APPLE_SMBIOS_TYPE_PLATFORM_FEATURE
UINT32 ExtendedFirmwareFeaturesMask
UINT32 ExtendedFirmwareFeatures
EFI_GUID gAppleVendorVariableGuid
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
UINT16 OcCpuFrequencyToDisplayFrequency(IN UINT64 Frequency)
#define OC_OEM_SERIAL_MAX
EFI_STATUS LegacyRegionLock(IN UINT32 LegacyAddress, IN UINT32 LegacyLength)
EFI_STATUS LegacyRegionUnlock(IN UINT32 LegacyAddress, IN UINT32 LegacyLength)
EFI_GUID gOcCustomSmbiosTableGuid
EFI_GUID gOcCustomSmbios3TableGuid
enum OC_SMBIOS_UPDATE_MODE_ OC_SMBIOS_UPDATE_MODE
@ OcSmbiosUpdateOverwrite
@ OcSmbiosUpdateTryOverwrite
APPLE_EVENT_HANDLE Handle
#define OC_OEM_PRODUCT_VARIABLE_NAME
#define OC_OEM_BOARD_VARIABLE_NAME
#define OC_OEM_VENDOR_VARIABLE_NAME
EFI_STATUS OcSetSystemVariable(IN CHAR16 *VariableName, IN UINT32 Attributes, IN UINTN DataSize, IN VOID *Data, IN EFI_GUID *VendorGuid OPTIONAL)
CHAR8 * SmbiosGetString(IN APPLE_SMBIOS_STRUCTURE_POINTER SmbiosTable, IN SMBIOS_TABLE_STRING String)
EFI_STATUS SmbiosExtendTable(IN OUT OC_SMBIOS_TABLE *Table, IN UINT32 Size)
EFI_STATUS SmbiosInitialiseStruct(IN OUT OC_SMBIOS_TABLE *Table, IN SMBIOS_TYPE Type, IN UINT8 MinLength, IN UINT16 Index)
APPLE_SMBIOS_STRUCTURE_POINTER SmbiosGetStructureOfType(IN APPLE_SMBIOS_STRUCTURE_POINTER SmbiosTable, IN UINT32 SmbiosTableSize, IN SMBIOS_TYPE Type, IN UINT16 Index)
UINT8 SmbiosOverrideString(IN OC_SMBIOS_TABLE *Table, IN CONST CHAR8 *Override OPTIONAL, IN UINT8 *Index)
VOID SmbiosFinaliseStruct(IN OUT OC_SMBIOS_TABLE *Table)
UINT16 SmbiosGetStructureCount(IN APPLE_SMBIOS_STRUCTURE_POINTER SmbiosTable, IN UINT32 SmbiosTableSize, IN SMBIOS_TYPE Type)
#define OC_SMBIOS_MAX_MAPPING
@ OcSmbiosSystemEnclosureHandle
@ OcSmbiosAutomaticHandle
OC_SMBIOS_UPDATE_MODE OcSmbiosGetUpdateMode(IN CONST CHAR8 *UpdateMode)
STATIC VOID PatchPortableBatteryDevice(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC APPLE_SMBIOS_STRUCTURE_POINTER SmbiosGetOriginalStructure(IN SMBIOS_TYPE Type, IN UINT16 Index)
STATIC UINT8 SmbiosGetFormFactor(IN OC_SMBIOS_DATA *Data, IN APPLE_SMBIOS_STRUCTURE_POINTER Original)
VOID OcSmbiosExtractOemInfo(IN OC_SMBIOS_TABLE *SmbiosTable, OUT CHAR8 *ProductName OPTIONAL, OUT CHAR8 *SerialNumber OPTIONAL, OUT EFI_GUID *SystemUuid OPTIONAL, OUT CHAR8 *Mlb OPTIONAL, OUT UINT8 *Rom OPTIONAL, IN BOOLEAN UuidIsRawEncoded, IN BOOLEAN UseVariableStorage)
VOID OcSmbiosTableFree(IN OUT OC_SMBIOS_TABLE *Table)
STATIC VOID PatchSystemInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC SMBIOS_TABLE_3_0_ENTRY_POINT * mOriginalSmbios3
STATIC EFI_STATUS SmbiosHandleLegacyRegion(BOOLEAN Unlock)
STATIC VOID PatchMemoryDevice(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN SMBIOS_HANDLE MemoryArrayHandle, IN APPLE_SMBIOS_STRUCTURE_POINTER Original, IN UINT16 Index, OUT SMBIOS_HANDLE *Handle)
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)
#define SMBIOS_OVERRIDE_S(Table, Field, Original, Value, Index, Fallback)
STATIC VOID CreateAppleProcessorType(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN OC_CPU_INFO *CpuInfo)
#define SMBIOS_ACCESSIBLE(Table, Field)
STATIC SMBIOS_TABLE_ENTRY_POINT * mOriginalSmbios
STATIC BOOLEAN SmbiosHasValidOemFormFactor(IN APPLE_SMBIOS_STRUCTURE_POINTER Original)
#define SMBIOS_OVERRIDE_V(Table, Field, Original, Value, Fallback)
STATIC VOID PatchMemoryMappedDevice(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN APPLE_SMBIOS_STRUCTURE_POINTER Original, IN UINT16 Index, IN SMBIOS_HANDLE MemoryDeviceHandle, IN OC_SMBIOS_MAPPING *Mapping, IN UINT16 MappingNum)
STATIC APPLE_SMBIOS_STRUCTURE_POINTER mOriginalTable
STATIC EFI_STATUS SmbiosTableAllocate(IN UINT16 TableLength, IN OUT SMBIOS_TABLE_ENTRY_POINT **TableEntryPoint, IN OUT SMBIOS_TABLE_3_0_ENTRY_POINT **TableEntryPoint3, IN OUT VOID **TableAddress, IN OUT VOID **TableAddress3)
STATIC VOID CreateSmBiosEndOfTable(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC VOID PatchSystemPorts(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC VOID PatchBaseboardInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC EFI_STATUS SmbiosTableApply(IN OUT OC_SMBIOS_TABLE *SmbiosTable, IN OC_SMBIOS_UPDATE_MODE Mode)
STATIC VOID CreateMemoryDevice(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN OC_SMBIOS_MEMORY_DEVICE_DATA *DeviceData, IN SMBIOS_HANDLE MemoryArrayHandle, IN UINT16 Index, OUT SMBIOS_HANDLE *Handle)
EFI_STATUS OcSmbiosTablePrepare(IN OUT OC_SMBIOS_TABLE *SmbiosTable)
STATIC VOID CreateMemoryArray(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, OUT SMBIOS_HANDLE *Handle)
STATIC VOID CreateOrPatchAppleSmcInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN BOOLEAN HasAppleSMBIOS)
STATIC VOID CreateOrPatchApplePlatformFeature(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN BOOLEAN HasAppleSMBIOS)
STATIC VOID PatchBootInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC VOID CreateAppleProcessorSpeed(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN OC_CPU_INFO *CpuInfo)
STATIC VOID PatchSystemSlots(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC VOID PatchMemoryArray(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN APPLE_SMBIOS_STRUCTURE_POINTER Original, IN UINT16 Index, OUT SMBIOS_HANDLE *Handle)
STATIC UINT16 SmbiosGetOriginalStructureCount(IN SMBIOS_TYPE Type)
STATIC VOID PatchMemoryMappedAddress(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN SMBIOS_HANDLE MemoryArrayHandle, IN APPLE_SMBIOS_STRUCTURE_POINTER Original, IN UINT16 Index, IN OUT OC_SMBIOS_MAPPING *Mapping, IN OUT UINT16 *MappingNum)
STATIC VOID PatchCacheInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN OUT UINT16 *Index, IN SMBIOS_HANDLE OriginalHandle, OUT SMBIOS_HANDLE *NewHandle)
STATIC UINT32 mOriginalTableSize
STATIC VOID PatchProcessorInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN OC_CPU_INFO *CpuInfo)
STATIC VOID PatchSystemEnclosure(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC BOOLEAN PatchBiosInformation(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data)
STATIC VOID CreateOrPatchAppleFirmwareVolume(IN OUT OC_SMBIOS_TABLE *Table, IN OC_SMBIOS_DATA *Data, IN BOOLEAN HasAppleSMBIOS)
VOID OcSmbiosGetSmcVersion(IN CONST UINT8 *SmcRevision, OUT UINT8 *SmcVersion)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiPciRootBridgeIoProtocolGuid
EFI_GUID gEfiSmbios3TableGuid
EFI_GUID gEfiSmbiosTableGuid
SMBIOS_STRUCTURE_POINTER Standard