/*
* SMBIOS Table Patcher, part of the Chameleon Boot Loader Project
*
* Copyright 2010 by Islam M. Ahmed Zaid. All rights reserved.
*
*/
#include "boot.h"
#include "bootstruct.h"
#include "smbios_getters.h"
#ifndef DEBUG_SMBIOS
#define DEBUG_SMBIOS 0
#endif
#if DEBUG_SMBIOS
#define DBG(x...) printf(x)
#else
#define DBG(x...) msglog(x)
#endif
#define SMBPlist &bootInfo->smbiosConfig
/* ASSUMPTION: 16KB should be enough for the whole thing */
#define SMB_ALLOC_SIZE 16384
//-------------------------------------------------------------------------------------------------------------------------
// SMBIOS Plist Keys
//-------------------------------------------------------------------------------------------------------------------------
/* BIOS Information */
#define kSMBBIOSInformationVendorKey "SMbiosvendor"
#define kSMBBIOSInformationVersionKey "SMbiosversion"
#define kSMBBIOSInformationReleaseDateKey "SMbiosdate"
/* System Information */
#define kSMBSystemInformationManufacturerKey "SMmanufacturer"
#define kSMBSystemInformationProductNameKey "SMproductname"
#define kSMBSystemInformationVersionKey "SMsystemversion"
#define kSMBSystemInformationSerialNumberKey "SMserial"
#define kSMBSystemInformationFamilyKey "SMfamily"
/* Base Board */
#define kSMBBaseBoardManufacturerKey "SMboardmanufacturer"
#define kSMBBaseBoardProductKey "SMboardproduct"
#define kSMBBaseBoardSerialNumber "SMboardserial"
#define kSMBBaseBoardAssetTagNumber "SMboardassetag" // new
#define kSMBBaseBoardLocationInChassis "SMboardlocation" // new
#define kSMBBaseBoardType "SMboardtype" // new
/* Processor Information */
#define kSMBProcessorInformationExternalClockKey "SMexternalclock"
#define kSMBProcessorInformationMaximumClockKey "SMmaximalclock"
/* Memory Device */
#define kSMBMemoryDeviceDeviceLocatorKey "SMmemdevloc"
#define kSMBMemoryDeviceBankLocatorKey "SMmembankloc"
#define kSMBMemoryDeviceMemoryTypeKey "SMmemtype"
#define kSMBMemoryDeviceMemorySpeedKey "SMmemspeed"
#define kSMBMemoryDeviceManufacturerKey "SMmemmanufacturer"
#define kSMBMemoryDeviceSerialNumberKey "SMmemserial"
#define kSMBMemoryDevicePartNumberKey "SMmempart"
/* Apple Specific */
#define kSMBOemProcessorTypeKey "SMcputype"
#define kSMBOemProcessorBusSpeedKey "SMbusspeed"
//-------------------------------------------------------------------------------------------------------------------------
// Default SMBIOS Data
//-------------------------------------------------------------------------------------------------------------------------
/* Rewrite: use a struct */
#define kDefaultVendorManufacturer "Apple Inc."
#define kDefaultBIOSReleaseDate "11/06/2009"
#define kDefaultSerialNumber "SOMESRLNMBR"
#define kDefaultBoardProduct "Mac-F4208DC8"
#define kDefaultBoardType "10" // 0xA
#define kDefaultSystemVersion "1.0"
#define KDefaultBoardSerialNumber "C02140302D5DMT31M" // new C07019501PLDCVHAD
// J593902RA4MFE 3,1
// J5031046RCZJA 5,1
// J521101A5CZJC 3,1
// J593004RB1LUE MacPro4,1
// J513401PZBH8C 5,1
// J590802LC4ACB 3,1
// J594900AH1LUE 4,1
// J512500HZBH8C 5,1
// J522700H7BH8C MacPro5,1
#define KDefaultBoardAssetTagNumber "Pro-Enclosure" // new
#define kDefaultLocatioInChassis "Part Component" // new
//=========== MacBook ===========
// defaults for a MacBook
#define kDefaultMacBookFamily "MacBook"
#define kDefaultMacBook "MacBook4,1"
#define kDefaultMacBookBIOSVersion " MB41.88Z.0073.B00.0809221748"
#define kDefaultMacBookBIOSReleaseDate "09/22/08"
#define kDefaultMacBookBoardAssetTagNumber "MacBook-Black"
//=========== Mac mini ===========
// defaults for a Mac mini
#define kDefaultMacminiFamily "Macmini"
#define kDefaultMacmini "Macmini5,3"
#define kDefaultMacminiBIOSVersion " MM51.88Z.0077.B10.1201241549"
//#define kDefaultMacminiBoardProduct "Mac-F65AE981FFA204ED"
#define kDefaultMacminiBIOSReleaseDate "01/24/2012"
#define kDefaultMacminiBoardAssetTagNumber "Mini-Aluminum"
// defaults for a Mac mini 6,2
//#define kDefaultMacminiFamily "Macmini"
//#define kDefaultMacmini "Macmini6,2"
//#define kDefaultMacminiBIOSVersion " MM61.88Z.0106.B00.1208091121"
//#define kDefaultMacminiBoardProduct "Mac-F65AE981FFA204ED"
//#define kDefaultMacminiBIOSReleaseDate "10/14/2012"
//=========== MacBookPro ===========
// defaults for a MacBook Pro
#define kDefaultMacBookProFamily "MacBookPro"
#define kDefaultMacBookPro "MacBookPro8,1"
#define kDefaultMacBookProBIOSVersion " MBP81.88Z.0047.B24.1110141131"
#define kDefaultMacBookProBoardProduct "Mac-94245B3640C91C81"
#define kDefaultMacBookProBIOSReleaseDate "10/14/11"
#define kDefaultMacBookProBoardAssetTagNumber "MacBook-Aluminum"
// defaults for a MacBook Pro IVY
#define kDefaultMacBookProIvy "MacBookPro10,2"
#define kDefaultMacBookProIvyBIOSVersion " MBP102.88Z.0106.B01.1208311637"
#define kDefaultMacBookProIvyBoardProduct "Mac-AFD8A9D944EA4843"
#define kDefaultMacBookProIvyBIOSReleaseDate "10/02/2012"
//=========== iMac ===========
#define kDefaultiMacFamily "iMac"
#define kDefaultiMac "iMac8,1"
#define kDefaultiMacBIOSVersion " IM81.88Z.00C1.B00.0903051113"
#define kDefaultiMacBoardProduct "Mac-F227BEC8"
#define kDefaultiMacBoardAssetTagNumber "iMac-Aluminum"
// iMac10,1
// iMac11,1 core i3/i5/i7
#define kDefaultiMacNehalem "iMac11,1"
#define kDefaultiMacNehalemBIOSVersion " IM111.88Z.0034.B00.0910301727"
#define kDefaultiMacNehalemBIOSReleaseDate "10/30/09"
#define kDefaultiMacNehalemBoardProduct "Mac-F2268DAE"
// iMac11,2
// iMac11,3
// iMac12,1
// iMac12,2
#define kDefaultiMacSandy "iMac12,2"
#define kDefaultiMacSandyBIOSVersion " IM121.88Z.0047.B1D.1110171110"
#define kDefaultiMacSandyBIOSReleaseDate "10/17/2011"
#define kDefaultiMacSandyBoardProduct "Mac-942B59F58194171B"
// iMac13,2
#define kDefaultiMacIvy "iMac13,2"
#define kDefaultiMacIvyBIOSVersion " IM131.88Z.00CE.B00.1203281326"
#define kDefaultiMacIvyBIOSReleaseDate "03/28/2012"
#define kDefaultiMacIvyBoardProduct "Mac-FC02E91DDD3FA6A4"
//=========== MacPro ===========
// defaults for a Mac Pro
#define kDefaultMacProFamily "MacPro"
#define kDefaultMacPro "MacPro3,1"
#define kDefaultMacProBIOSVersion " MP31.88Z.006C.B05.0903051113"
#define kDefaultMacProBIOSReleaseDate "08/03/2010"
#define kDefaultMacProSystemVersion "1.3"
#define kDefaultMacProBoardProduct "Mac-F2268DC8"
#define KDefauktMacProBoardAssetTagNumber "Pro-Enclosure"
//#define kDefaultMacProBoardType "0xB" // 11
#define KDefaultMacProBoardSerialNumber "J593902RA4MFE"
// defaults for a Mac Pro 4,1 core i7/Xeon
#define kDefaultMacProNehalem "MacPro4,1"
#define kDefaultMacProNehalemBIOSVersion " MP41.88Z.0081.B04.0903051113"
#define kDefaultMacProNehalemBIOSReleaseDate "11/06/2009"
#define kDefaultMacProNehalemSystemVersion "1.4"
#define kDefaultMacProNehalemBoardProduct "Mac-F4238CC8"
#define KDefaultMacProNehalemBoardSerialNumber "J593004RB1LUE"
// defaults for a Mac Pro 5,1 core i7/Xeon
#define kDefaultMacProWestmere "MacPro5,1"
#define kDefaultMacProWestmereBIOSVersion " MP51.88Z.007F.B03.1010071432"
#define kDefaultMacProWestmereBIOSReleaseDate "10/07/2010"
#define kDefaultMacProWestmereSystemVersion "1.2"
#define kDefaultMacProWestmereBoardProduct "Mac-F221BEC8"
#define KDefaultMacProWestmereBoardSerialNumber "J522700H7BH8C"
//-------------------------------------------------------------------------------------------------------------------------
#define getFieldOffset(struct, field) ((uint8_t)(uint32_t)&(((struct *)0)->field))
typedef struct
{
SMBStructHeader *orig;
SMBStructHeader *new;
} SMBStructPtrs;
struct
{
char *vendor;
char *version;
char *releaseDate;
} defaultBIOSInfo;
struct
{
char *manufacturer;
char *productName;
char *version;
char *serialNumber;
char *family;
} defaultSystemInfo;
struct
{
char *manufacturer;
char *product;
char *serialNumber; //
char *boardType; //
char *assetTagNumber; //
char *locationInChassis; //
} defaultBaseBoard;
typedef struct
{
uint8_t type;
SMBValueType valueType;
uint8_t fieldOffset;
char *keyString;
bool (*getSMBValue)(returnType *);
char **defaultValue;
} SMBValueSetter;
SMBValueSetter SMBSetters[] =
{
//-------------------------------------------------------------------------------------------------------------------------
// BIOSInformation
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, vendor), kSMBBIOSInformationVendorKey,
NULL, &defaultBIOSInfo.vendor }, // AppleBiosVendor
{kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, version), kSMBBIOSInformationVersionKey,
NULL, &defaultBIOSInfo.version }, // AppleFirmwareVersion
{kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, releaseDate), kSMBBIOSInformationReleaseDateKey,
NULL, &defaultBIOSInfo.releaseDate }, // AppleReleaseDate
//-------------------------------------------------------------------------------------------------------------------------
// SystemInformation
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, manufacturer), kSMBSystemInformationManufacturerKey,
NULL, &defaultSystemInfo.manufacturer }, // AppleBiosVendor
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, productName), kSMBSystemInformationProductNameKey,
NULL, &defaultSystemInfo.productName }, // AppleProductName
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, version), kSMBSystemInformationVersionKey,
NULL, &defaultSystemInfo.version }, // AppleSystemVersion
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, serialNumber), kSMBSystemInformationSerialNumberKey,
NULL, &defaultSystemInfo.serialNumber }, // AppleSerialNumber
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, skuNumber), NULL,
NULL, NULL }, // AppleSkuNumber
{kSMBTypeSystemInformation, kSMBString, getFieldOffset(SMBSystemInformation, family), kSMBSystemInformationFamilyKey,
NULL, &defaultSystemInfo.family }, // AppleFamily
//-------------------------------------------------------------------------------------------------------------------------
// BaseBoard
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, manufacturer), kSMBBaseBoardManufacturerKey,
NULL, &defaultBaseBoard.manufacturer }, // AppleBiosVendor
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, product), kSMBBaseBoardProductKey,
NULL, &defaultBaseBoard.product }, // AppleBoardID
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, version), NULL,
NULL, NULL }, // AppleSystemVersion
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, serialNumber), kSMBBaseBoardSerialNumber,
NULL, &defaultBaseBoard.serialNumber }, // AppleBoard
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, assetTagNumber), kSMBBaseBoardAssetTagNumber,
NULL, &defaultBaseBoard.assetTagNumber }, // AppleChassisAsset
{kSMBTypeBaseBoard, kSMBString, getFieldOffset(SMBBaseBoard, locationInChassis), kSMBBaseBoardLocationInChassis,
NULL, &defaultBaseBoard.locationInChassis }, // AppleBoardLocation
{kSMBTypeBaseBoard, kSMBByte, getFieldOffset(SMBBaseBoard, boardType), kSMBBaseBoardType,
NULL, &defaultBaseBoard.boardType }, // AppleBoardType
//-------------------------------------------------------------------------------------------------------------------------
// SystemEnclosure
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeSystemEnclosure, kSMBString, getFieldOffset(SMBSystemEnclosure, manufacturer),
kSMBBaseBoardManufacturerKey, NULL, &defaultBaseBoard.manufacturer }, // AppleBiosVendor
//-------------------------------------------------------------------------------------------------------------------------
// ProcessorInformation
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, socketDesignation), NULL, NULL, NULL},
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, manufacturer), NULL, NULL, NULL},
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, processorVersion), NULL, NULL, NULL},
{kSMBTypeProcessorInformation, kSMBWord, getFieldOffset(SMBProcessorInformation, externalClock), kSMBProcessorInformationExternalClockKey,
getProcessorInformationExternalClock, NULL},
{kSMBTypeProcessorInformation, kSMBWord, getFieldOffset(SMBProcessorInformation, maximumClock), kSMBProcessorInformationMaximumClockKey,
getProcessorInformationMaximumClock, NULL},
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, serialNumber), /*SMBProcessorInformationSerialNumberKey,
getProcessorInformationSerialNumber, */NULL, NULL, NULL},
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, assetTag), NULL, NULL, NULL},
{kSMBTypeProcessorInformation, kSMBString, getFieldOffset(SMBProcessorInformation, partNumber), NULL, NULL, NULL},
//-------------------------------------------------------------------------------------------------------------------------
// Memory Device
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, deviceLocator), kSMBMemoryDeviceDeviceLocatorKey,
NULL, NULL},
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, bankLocator), kSMBMemoryDeviceBankLocatorKey,
NULL, NULL},
{kSMBTypeMemoryDevice, kSMBByte, getFieldOffset(SMBMemoryDevice, memoryType), kSMBMemoryDeviceMemoryTypeKey,
getSMBMemoryDeviceMemoryType, NULL},
{kSMBTypeMemoryDevice, kSMBWord, getFieldOffset(SMBMemoryDevice, memorySpeed), kSMBMemoryDeviceMemorySpeedKey,
getSMBMemoryDeviceMemorySpeed, NULL},
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, manufacturer), kSMBMemoryDeviceManufacturerKey,
getSMBMemoryDeviceManufacturer, NULL},
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, serialNumber), kSMBMemoryDeviceSerialNumberKey,
getSMBMemoryDeviceSerialNumber, NULL},
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, assetTag), NULL, NULL, NULL},
{kSMBTypeMemoryDevice, kSMBWord, getFieldOffset(SMBMemoryDevice, errorHandle), NULL, getSMBMemoryDeviceMemoryErrorHandle, NULL},
{kSMBTypeMemoryDevice, kSMBString, getFieldOffset(SMBMemoryDevice, partNumber), kSMBMemoryDevicePartNumberKey,
getSMBMemoryDevicePartNumber, NULL},
//-------------------------------------------------------------------------------------------------------------------------
// Apple Specific
//-------------------------------------------------------------------------------------------------------------------------
{kSMBTypeOemProcessorType, kSMBWord, getFieldOffset(SMBOemProcessorType, ProcessorType), kSMBOemProcessorTypeKey,
getSMBOemProcessorType, NULL},
{kSMBTypeOemProcessorBusSpeed, kSMBWord, getFieldOffset(SMBOemProcessorBusSpeed, ProcessorBusSpeed), kSMBOemProcessorBusSpeedKey,
getSMBOemProcessorBusSpeed, NULL}
};
int numOfSetters = sizeof(SMBSetters) / sizeof(SMBValueSetter);
SMBEntryPoint *origeps = 0;
SMBEntryPoint *neweps = 0;
static uint8_t stringIndex; // increament when a string is added and set the field value accordingly
static uint8_t stringsSize; // add string size
static SMBWord tableLength = 0;
static SMBWord handle = 0;
static SMBWord maxStructSize = 0;
static SMBWord structureCount = 0;
/*
if (gSettings.RtMLB == NULL && SNLen > 0) {
gSettings.RtMLB = AllocateCopyPool(SNLen + 1, gSettings.SerialNr);
}
if (gSettings.RtROM == NULL) {
// we can try to set it to MAC address from SMBIOS UUID - some boards have it there
gSettings.RtROMLen = 6;
gSettings.RtROM = AllocateCopyPool(gSettings.RtROMLen, ((UINT8*)&gSettings.SmUUID) + 10);
}
----------------
// RtVariables
dictPointer = GetProperty(dict, "RtVariables");
if (dictPointer) {
// ROM: bin data or base 64 encoded bin data
prop = GetProperty(dictPointer, "ROM");
if(prop) {
gSettings.RtROM = GetDataSetting(dictPointer, "ROM", &gSettings.RtROMLen);
if (gSettings.RtROM == NULL || gSettings.RtROMLen == 0) {
gSettings.RtROM = NULL;
gSettings.RtROMLen = 0;
}
}
// MLB: some value
prop = GetProperty(dictPointer, "MLB");
if(prop && AsciiStrLen(prop->string) > 0) {
gSettings.RtMLB = AllocateCopyPool(AsciiStrSize(prop->string), prop->string);
}
}
*/
/* Rewrite this function */
void setDefaultSMBData(void)
{
defaultBIOSInfo.vendor = kDefaultVendorManufacturer;
defaultBIOSInfo.releaseDate = kDefaultBIOSReleaseDate;
defaultSystemInfo.manufacturer = kDefaultVendorManufacturer;
defaultSystemInfo.version = kDefaultSystemVersion;
defaultSystemInfo.serialNumber = kDefaultSerialNumber;
defaultBaseBoard.manufacturer = kDefaultVendorManufacturer;
defaultBaseBoard.product = kDefaultBoardProduct;
defaultBaseBoard.boardType = kDefaultBoardType; // new
defaultBaseBoard.serialNumber = KDefaultBoardSerialNumber; //new
defaultBaseBoard.assetTagNumber = KDefaultBoardAssetTagNumber; //new
defaultBaseBoard.locationInChassis = kDefaultLocatioInChassis; //new
if (platformCPUFeature(CPU_FEATURE_MOBILE))
{
if (Platform.CPU.NoCores > 1)
{
defaultBIOSInfo.version = kDefaultMacBookProBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacBookProBIOSReleaseDate;
defaultBaseBoard.product = kDefaultMacBookProBoardProduct;
defaultSystemInfo.productName = kDefaultMacBookPro;
defaultSystemInfo.family = kDefaultMacBookProFamily;
defaultBaseBoard.assetTagNumber = kDefaultMacBookProBoardAssetTagNumber;
}
else
{
defaultBIOSInfo.version = kDefaultMacBookBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacBookBIOSReleaseDate;
defaultSystemInfo.productName = kDefaultMacBook;
defaultSystemInfo.family = kDefaultMacBookFamily;
defaultBaseBoard.assetTagNumber = kDefaultMacBookBoardAssetTagNumber;
}
}
else
{
switch (Platform.CPU.NoCores)
{
case 1:
defaultBIOSInfo.version = kDefaultMacminiBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacminiBIOSReleaseDate;
//defaultBaseBoard.product = kDefaultMacminiBoardProduct;
defaultSystemInfo.productName = kDefaultMacmini;
defaultSystemInfo.family = kDefaultMacminiFamily;
defaultBaseBoard.assetTagNumber = kDefaultMacminiBoardAssetTagNumber;
break;
case 2:
defaultBIOSInfo.version = kDefaultiMacBIOSVersion;
defaultBaseBoard.product = kDefaultiMacBoardProduct;
defaultSystemInfo.productName = kDefaultiMac;
defaultSystemInfo.family = kDefaultiMacFamily;
defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
break;
default:
{
switch (Platform.CPU.Family)
{
case 0x06:
{
switch (Platform.CPU.Model)
{
case CPU_MODEL_FIELDS: // Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
case CPU_MODEL_DALES:
case CPU_MODEL_CLARKDALE: // Intel Core i3, i5 LGA1156 (32nm)
defaultBIOSInfo.version = kDefaultiMacNehalemBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultiMacNehalemBIOSReleaseDate;
defaultBaseBoard.product = kDefaultiMacNehalemBoardProduct;
defaultSystemInfo.productName = kDefaultiMacNehalem;
defaultSystemInfo.family = kDefaultiMacFamily;
defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
break;
case CPU_MODEL_SANDYBRIDGE: // Intel Core i3, i5, i7 LGA1155 (32nm)
case CPU_MODEL_JAKETOWN: // Intel Core i7, Xeon E5 LGA2011 (32nm)
defaultBIOSInfo.version = kDefaultiMacSandyBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultiMacSandyBIOSReleaseDate;
defaultBaseBoard.product = kDefaultiMacSandyBoardProduct;
defaultSystemInfo.productName = kDefaultiMacSandy;
defaultSystemInfo.family = kDefaultiMacFamily;
defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
break;
case CPU_MODEL_IVYBRIDGE: // Intel Core i3, i5, i7 LGA1155 (22nm)
case CPU_MODEL_IVYBRIDGE_E5:
defaultBIOSInfo.version = kDefaultiMacIvyBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultiMacIvyBIOSReleaseDate;
defaultBaseBoard.product = kDefaultiMacIvyBoardProduct;
defaultSystemInfo.productName = kDefaultiMacIvy;
defaultSystemInfo.family = kDefaultiMacFamily;
defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
break;
case CPU_MODEL_NEHALEM: // Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
case CPU_MODEL_NEHALEM_EX: // Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
defaultBIOSInfo.version = kDefaultMacProNehalemBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacProNehalemBIOSReleaseDate;
defaultBaseBoard.product = kDefaultMacProNehalemBoardProduct;
//defaultBaseBoard.boardType = kDefaultMacProBoardType;
defaultBaseBoard.serialNumber = KDefaultMacProNehalemBoardSerialNumber;// BoardSerialNumber;
defaultSystemInfo.productName = kDefaultMacProNehalem;
defaultSystemInfo.family = kDefaultMacProFamily;
defaultSystemInfo.version = kDefaultMacProNehalemSystemVersion;
break;
case CPU_MODEL_WESTMERE: // Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
case CPU_MODEL_WESTMERE_EX: // Intel Xeon E7
defaultBIOSInfo.version = kDefaultMacProWestmereBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacProWestmereBIOSReleaseDate;
defaultBaseBoard.product = kDefaultMacProWestmereBoardProduct;
//defaultBaseBoard.boardType = kDefaultMacProBoardType;
defaultBaseBoard.serialNumber = KDefaultMacProWestmereBoardSerialNumber;// BoardSerialNumber;
defaultSystemInfo.productName = kDefaultMacProWestmere;
defaultSystemInfo.family = kDefaultMacProFamily;
defaultSystemInfo.version = kDefaultMacProWestmereSystemVersion;
break;
default:
defaultBIOSInfo.version = kDefaultMacProBIOSVersion;
defaultBIOSInfo.releaseDate = kDefaultMacProBIOSReleaseDate;
defaultBaseBoard.product = kDefaultMacProBoardProduct;
//defaultBaseBoard.boardType = kDefaultMacProBoardType;
defaultSystemInfo.productName = kDefaultMacPro;
defaultSystemInfo.family = kDefaultMacProFamily;
break;
}
break;
}
default:
defaultBIOSInfo.version = kDefaultMacProBIOSVersion;
//defaultBaseBoard.boardType = kDefaultMacProBoardType;
defaultSystemInfo.productName = kDefaultMacPro;
defaultSystemInfo.family = kDefaultMacProFamily;
break;
}
break;
}
}
}
}
/* Used for SM*n smbios.plist keys */
bool getSMBValueForKey(SMBStructHeader *structHeader, const char *keyString, const char **string, returnType *value)
{
static int idx = -1;
static int current = -1;
int len;
char key[24];
if (current != structHeader->handle)
{
idx++;
current = structHeader->handle;
}
sprintf(key, "%s%d", keyString, idx);
if (value)
{
if (getIntForKey(key, (int *)&(value->dword), SMBPlist))
{
return true;
}
}
else
{
if (getValueForKey(key, string, &len, SMBPlist))
{
return true;
}
}
return false;
}
char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field)
{
uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
if (!field)
{
return NULL;
}
for (field--; field != 0 && strlen((char *)stringPtr) > 0;
field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
return (char *)stringPtr;
}
void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field)
{
int strSize;
if (!field)
{
return;
}
if (!string)
{
*field = 0;
return;
}
strSize = strlen(string);
// remove any spaces found at the end
while ((strSize != 0) && (string[strSize - 1] == ' '))
{
strSize--;
}
if (strSize == 0)
{
*field = 0;
return;
}
memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize);
*field = stringIndex;
stringIndex++;
stringsSize += strSize + 1;
}
bool setSMBValue(SMBStructPtrs *structPtr, int idx, returnType *value)
{
const char *string = 0;
int len;
bool parsed;
int val;
if (numOfSetters <= idx)
{
return false;
}
switch (SMBSetters[idx].valueType)
{
case kSMBString:
if (SMBSetters[idx].keyString)
{
if (getValueForKey(SMBSetters[idx].keyString, &string, &len, SMBPlist))
{
break;
}
else
{
if (structPtr->orig->type == kSMBTypeMemoryDevice) // MemoryDevice only
{
if (getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, &string, NULL))
{
break;
}
}
}
}
if (SMBSetters[idx].getSMBValue)
{
if (SMBSetters[idx].getSMBValue((returnType *)&string))
{
break;
}
}
if ((SMBSetters[idx].defaultValue) && *(SMBSetters[idx].defaultValue))
{
string = *(SMBSetters[idx].defaultValue);
break;
}
string = getSMBStringForField(structPtr->orig, *(uint8_t *)value);
break;
case kSMBByte:
case kSMBWord:
case kSMBDWord:
//case kSMBQWord:
if (SMBSetters[idx].keyString)
{
parsed = getIntForKey(SMBSetters[idx].keyString, &val, SMBPlist);
if (!parsed)
{
if (structPtr->orig->type == kSMBTypeMemoryDevice) // MemoryDevice only
{
parsed = getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, NULL, (returnType *)&val);
}
}
if (parsed)
{
switch (SMBSetters[idx].valueType)
{
case kSMBByte:
value->byte = (uint8_t)val;
break;
case kSMBWord:
value->word = (uint16_t)val;
break;
case kSMBDWord:
default:
value->dword = (uint32_t)val;
break;
}
return true;
}
}
if (SMBSetters[idx].getSMBValue)
{
if (SMBSetters[idx].getSMBValue(value))
{
return true;
}
}
#if 0
if (*(SMBSetters[idx].defaultValue))
{
value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue);
return true;
}
#endif
break;
}
if (SMBSetters[idx].valueType == kSMBString && string)
{
setSMBStringForField(structPtr->new, string, &value->byte);
}
return true;
}
//-------------------------------------------------------------------------------------------------------------------------
// Apple Specific
//-------------------------------------------------------------------------------------------------------------------------
void addSMBFirmwareVolume(SMBStructPtrs *structPtr)
{
return;
}
void addSMBMemorySPD(SMBStructPtrs *structPtr)
{
/* SPD data from Platform.RAM.spd */
return;
}
void addSMBOemProcessorType(SMBStructPtrs *structPtr)
{
SMBOemProcessorType *p = (SMBOemProcessorType *)structPtr->new;
p->header.type = kSMBTypeOemProcessorType;
p->header.length = sizeof(SMBOemProcessorType);
p->header.handle = handle++;
setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->ProcessorType));
structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorType) + 2);
tableLength += sizeof(SMBOemProcessorType) + 2;
structureCount++;
}
void addSMBOemProcessorBusSpeed(SMBStructPtrs *structPtr)
{
SMBOemProcessorBusSpeed *p = (SMBOemProcessorBusSpeed *)structPtr->new;
switch (Platform.CPU.Family)
{
case 0x06:
{
switch (Platform.CPU.Model)
{
case CPU_MODEL_FIELDS: // Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
case CPU_MODEL_DALES:
case CPU_MODEL_CLARKDALE: // Intel Core i3, i5 LGA1156 (32nm)
case CPU_MODEL_NEHALEM: // Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
case CPU_MODEL_NEHALEM_EX: // Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
case CPU_MODEL_WESTMERE: // Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
case CPU_MODEL_WESTMERE_EX: // Intel Xeon E7
case CPU_MODEL_SANDYBRIDGE: // Intel Core i3, i5, i7 LGA1155 (32nm)
case CPU_MODEL_IVYBRIDGE: // Intel Core i3, i5, i7 LGA1155 (22nm)
case CPU_MODEL_IVYBRIDGE_E5:
case CPU_MODEL_JAKETOWN: // Intel Core i7, Xeon E5 LGA2011 (32nm)
break;
default:
return;
}
}
}
p->header.type = kSMBTypeOemProcessorBusSpeed;
p->header.length = sizeof(SMBOemProcessorBusSpeed);
p->header.handle = handle++;
setSMBValue(structPtr, numOfSetters -1, (returnType *)&(p->ProcessorBusSpeed));
structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorBusSpeed) + 2);
tableLength += sizeof(SMBOemProcessorBusSpeed) + 2;
structureCount++;
}
//-------------------------------------------------------------------------------------------------------------------------
// EndOfTable
//-------------------------------------------------------------------------------------------------------------------------
void addSMBEndOfTable(SMBStructPtrs *structPtr)
{
structPtr->new->type = kSMBTypeEndOfTable;
structPtr->new->length = sizeof(SMBStructHeader);
structPtr->new->handle = handle++;
structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBStructHeader) + 2);
tableLength += sizeof(SMBStructHeader) + 2;
structureCount++;
}
void setSMBStruct(SMBStructPtrs *structPtr)
{
bool setterFound = false;
uint8_t *ptr;
SMBWord structSize;
int i;
stringIndex = 1;
stringsSize = 0;
if (handle < structPtr->orig->handle)
{
handle = structPtr->orig->handle;
}
memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
for (i = 0; i < numOfSetters; i++)
{
if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structPtr->orig->length))
{
setterFound = true;
setSMBValue(structPtr, i, (returnType *)((uint8_t *)structPtr->new + SMBSetters[i].fieldOffset));
}
}
if (setterFound)
{
ptr = (uint8_t *)structPtr->new + structPtr->orig->length;
for (; ((uint16_t *)ptr)[0] != 0; ptr++);
if (((uint16_t *)ptr)[0] == 0)
{
ptr += 2;
}
structSize = ptr - (uint8_t *)structPtr->new;
}
else
{
ptr = (uint8_t *)structPtr->orig + structPtr->orig->length;
for (; ((uint16_t *)ptr)[0] != 0; ptr++);
if (((uint16_t *)ptr)[0] == 0)
{
ptr += 2;
}
structSize = ptr - (uint8_t *)structPtr->orig;
memcpy((void *)structPtr->new, structPtr->orig, structSize);
}
structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + structSize);
tableLength += structSize;
if (structSize > maxStructSize)
{
maxStructSize = structSize;
}
structureCount++;
}
void setupNewSMBIOSTable(SMBEntryPoint *eps, SMBStructPtrs *structPtr)
{
uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
structPtr->orig = (SMBStructHeader *)ptr;
for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structPtr->orig + sizeof(SMBStructHeader)));)
{
switch (structPtr->orig->type)
{
/* Skip all Apple Specific Structures */
case kSMBTypeFirmwareVolume:
case kSMBTypeMemorySPD:
case kSMBTypeOemProcessorType:
case kSMBTypeOemProcessorBusSpeed:
/* And this one too, to be added at the end */
case kSMBTypeEndOfTable:
break;
default:
/* Add */
setSMBStruct(structPtr);
break;
}
ptr = (uint8_t *)((uint32_t)structPtr->orig + structPtr->orig->length);
for (; ((uint16_t *)ptr)[0] != 0; ptr++);
if (((uint16_t *)ptr)[0] == 0)
{
ptr += 2;
}
structPtr->orig = (SMBStructHeader *)ptr;
}
addSMBFirmwareVolume(structPtr);
addSMBMemorySPD(structPtr);
addSMBOemProcessorType(structPtr);
addSMBOemProcessorBusSpeed(structPtr);
addSMBEndOfTable(structPtr);
}
void setupSMBIOSTable(void)
{
SMBStructPtrs *structPtr;
uint8_t *buffer;
bool setSMB = true;
if (!origeps)
{
return;
}
neweps = origeps;
structPtr = (SMBStructPtrs *)malloc(sizeof(SMBStructPtrs));
if (!structPtr)
{
return;
}
buffer = malloc(SMB_ALLOC_SIZE);
if (!buffer)
{
return;
}
bzero(buffer, SMB_ALLOC_SIZE);
structPtr->new = (SMBStructHeader *)buffer;
getBoolForKey(kSMBIOSdefaults, &setSMB, &bootInfo->chameleonConfig);
if (setSMB)
{
setDefaultSMBData();
}
setupNewSMBIOSTable(origeps, structPtr);
neweps = (SMBEntryPoint *)AllocateKernelMemory(sizeof(SMBEntryPoint));
if (!neweps)
{
return;
}
bzero(neweps, sizeof(SMBEntryPoint));
neweps->anchor[0] = '_';
neweps->anchor[1] = 'S';
neweps->anchor[2] = 'M';
neweps->anchor[3] = '_';
neweps->entryPointLength = sizeof(SMBEntryPoint);
neweps->majorVersion = 2;
neweps->minorVersion = 4;
neweps->maxStructureSize = maxStructSize;
neweps->entryPointRevision = 0;
neweps->dmi.anchor[0] = '_';
neweps->dmi.anchor[1] = 'D';
neweps->dmi.anchor[2] = 'M';
neweps->dmi.anchor[3] = 'I';
neweps->dmi.anchor[4] = '_';
neweps->dmi.tableLength = tableLength;
neweps->dmi.tableAddress = AllocateKernelMemory(tableLength);
neweps->dmi.structureCount = structureCount;
neweps->dmi.bcdRevision = 0x24;
if (!neweps->dmi.tableAddress)
{
return;
}
memcpy((void *)neweps->dmi.tableAddress, buffer, tableLength);
neweps->dmi.checksum = 0;
neweps->dmi.checksum = 0x100 - checksum8(&neweps->dmi, sizeof(DMIEntryPoint));
neweps->checksum = 0;
neweps->checksum = 0x100 - checksum8(neweps, sizeof(SMBEntryPoint));
free(buffer);
decodeSMBIOSTable(neweps);
}
void *getSmbios(int which)
{
switch (which)
{
case SMBIOS_ORIGINAL:
if (!origeps)
{
origeps = getAddressOfSmbiosTable();
}
return origeps;
case SMBIOS_PATCHED:
return neweps;
}
return 0;
}
/* Collect any information needed later */
void readSMBIOSInfo(SMBEntryPoint *eps)
{
uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
int dimmnbr = 0;
Platform.DMI.MaxMemorySlots = 0;
Platform.DMI.CntMemorySlots = 0;
Platform.DMI.MemoryModules = 0;
for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
{
switch (structHeader->type)
{
case kSMBTypeSystemInformation:
Platform.UUID = ((SMBSystemInformation *)structHeader)->uuid;
break;
case kSMBTypePhysicalMemoryArray:
Platform.DMI.MaxMemorySlots += ((SMBPhysicalMemoryArray *)structHeader)->numMemoryDevices;
break;
case kSMBTypeMemoryDevice:
Platform.DMI.CntMemorySlots++;
if (((SMBMemoryDevice *)structHeader)->memorySize != 0)
{
Platform.DMI.MemoryModules++;
}
if (((SMBMemoryDevice *)structHeader)->memorySpeed > 0)
{
Platform.RAM.DIMM[dimmnbr].Frequency = ((SMBMemoryDevice *)structHeader)->memorySpeed;
}
dimmnbr++;
break;
}
structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
if (((uint16_t *)structPtr)[0] == 0)
{
structPtr += 2;
}
structHeader = (SMBStructHeader *)structPtr;
}
}