Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch_Modules/i386/libsaio/smbios.c

1/*
2 * SMBIOS Table Patcher, part of the Chameleon Boot Loader Project
3 *
4 * Copyright 2010 by Islam M. Ahmed Zaid. All rights reserved.
5 *
6 */
7
8
9#include "boot.h"
10#include "bootstruct.h"
11#include "smbios_getters.h"
12
13#ifndef DEBUG_SMBIOS
14#define DEBUG_SMBIOS 0
15#endif
16
17#if DEBUG_SMBIOS
18#define DBG(x...)printf(x)
19#else
20#define DBG(x...)msglog(x)
21#endif
22
23#define SMBPlist&bootInfo->smbiosConfig
24/* ASSUMPTION: 16KB should be enough for the whole thing */
25#define SMB_ALLOC_SIZE16384
26
27
28//-------------------------------------------------------------------------------------------------------------------------
29// SMBIOS Plist Keys
30//-------------------------------------------------------------------------------------------------------------------------
31/* BIOS Information */
32#define kSMBBIOSInformationVendorKey"SMbiosvendor"
33#define kSMBBIOSInformationVersionKey"SMbiosversion"
34#define kSMBBIOSInformationReleaseDateKey"SMbiosdate"
35
36/* System Information */
37#define kSMBSystemInformationManufacturerKey"SMmanufacturer"
38#define kSMBSystemInformationProductNameKey"SMproductname"
39#define kSMBSystemInformationVersionKey"SMsystemversion"
40#define kSMBSystemInformationSerialNumberKey"SMserial"
41#define kSMBSystemInformationFamilyKey"SMfamily"
42
43/* Base Board */
44#define kSMBBaseBoardManufacturerKey"SMboardmanufacturer"
45#define kSMBBaseBoardProductKey"SMboardproduct"
46#define kSMBBaseBoardSerialNumber"SMboardserial"
47#define kSMBBaseBoardAssetTagNumber"SMboardassetag" // new
48#define kSMBBaseBoardLocationInChassis"SMboardlocation" // new
49#define kSMBBaseBoardType"SMboardtype" // new
50
51/* Processor Information */
52#define kSMBProcessorInformationExternalClockKey"SMexternalclock"
53#define kSMBProcessorInformationMaximumClockKey"SMmaximalclock"
54
55/* Memory Device */
56#define kSMBMemoryDeviceDeviceLocatorKey"SMmemdevloc"
57#define kSMBMemoryDeviceBankLocatorKey"SMmembankloc"
58#define kSMBMemoryDeviceMemoryTypeKey"SMmemtype"
59#define kSMBMemoryDeviceMemorySpeedKey"SMmemspeed"
60#define kSMBMemoryDeviceManufacturerKey"SMmemmanufacturer"
61#define kSMBMemoryDeviceSerialNumberKey"SMmemserial"
62#define kSMBMemoryDevicePartNumberKey"SMmempart"
63
64/* Apple Specific */
65#define kSMBOemProcessorTypeKey"SMcputype"
66#define kSMBOemProcessorBusSpeedKey"SMbusspeed"
67
68//-------------------------------------------------------------------------------------------------------------------------
69// Default SMBIOS Data
70//-------------------------------------------------------------------------------------------------------------------------
71/* Rewrite: use a struct */
72
73#define kDefaultVendorManufacturer"Apple Inc."
74#define kDefaultBIOSReleaseDate"11/06/2009"
75#define kDefaultSerialNumber"SOMESRLNMBR"
76#define kDefaultBoardProduct"Mac-F4208DC8"
77#define kDefaultBoardType"10" // 0xA
78#define kDefaultSystemVersion"1.0"
79#define KDefaultBoardSerialNumber"C02140302D5DMT31M" // new C07019501PLDCVHAD
80// J593902RA4MFE 3,1
81// J5031046RCZJA 5,1
82// J521101A5CZJC 3,1
83// J593004RB1LUE MacPro4,1
84// J513401PZBH8C 5,1
85// J590802LC4ACB 3,1
86// J594900AH1LUE 4,1
87// J512500HZBH8C 5,1
88// J522700H7BH8C MacPro5,1
89#define KDefaultBoardAssetTagNumber"Pro-Enclosure" // new
90#define kDefaultLocatioInChassis"Part Component" // new
91
92//=========== MacBook ===========
93// defaults for a MacBook
94#define kDefaultMacBookFamily"MacBook"
95#define kDefaultMacBook"MacBook4,1"
96#define kDefaultMacBookBIOSVersion" MB41.88Z.0073.B00.0809221748"
97#define kDefaultMacBookBIOSReleaseDate"09/22/08"
98#define kDefaultMacBookBoardAssetTagNumber"MacBook-Black"
99
100//=========== Mac mini ===========
101// defaults for a Mac mini
102#define kDefaultMacminiFamily"Macmini"
103#define kDefaultMacmini"Macmini5,3"
104#define kDefaultMacminiBIOSVersion" MM51.88Z.0077.B10.1201241549"
105//#define kDefaultMacminiBoardProduct"Mac-F65AE981FFA204ED"
106#define kDefaultMacminiBIOSReleaseDate"01/24/2012"
107#define kDefaultMacminiBoardAssetTagNumber"Mini-Aluminum"
108// defaults for a Mac mini 6,2
109//#define kDefaultMacminiFamily"Macmini"
110//#define kDefaultMacmini"Macmini6,2"
111//#define kDefaultMacminiBIOSVersion" MM61.88Z.0106.B00.1208091121"
112//#define kDefaultMacminiBoardProduct"Mac-F65AE981FFA204ED"
113//#define kDefaultMacminiBIOSReleaseDate"10/14/2012"
114
115//=========== MacBookPro ===========
116// defaults for a MacBook Pro
117#define kDefaultMacBookProFamily"MacBookPro"
118#define kDefaultMacBookPro"MacBookPro8,1"
119#define kDefaultMacBookProBIOSVersion" MBP81.88Z.0047.B24.1110141131"
120#define kDefaultMacBookProBoardProduct"Mac-94245B3640C91C81"
121#define kDefaultMacBookProBIOSReleaseDate"10/14/11"
122#define kDefaultMacBookProBoardAssetTagNumber"MacBook-Aluminum"
123// defaults for a MacBook Pro IVY
124#define kDefaultMacBookProIvy"MacBookPro10,2"
125#define kDefaultMacBookProIvyBIOSVersion" MBP102.88Z.0106.B01.1208311637"
126#define kDefaultMacBookProIvyBoardProduct"Mac-AFD8A9D944EA4843"
127#define kDefaultMacBookProIvyBIOSReleaseDate"10/02/2012"
128
129//=========== iMac ===========
130#define kDefaultiMacFamily"iMac"
131#define kDefaultiMac"iMac8,1"
132#define kDefaultiMacBIOSVersion" IM81.88Z.00C1.B00.0903051113"
133#define kDefaultiMacBoardProduct"Mac-F227BEC8"
134#define kDefaultiMacBoardAssetTagNumber"iMac-Aluminum"
135// iMac10,1
136// iMac11,1 core i3/i5/i7
137#define kDefaultiMacNehalem"iMac11,1"
138#define kDefaultiMacNehalemBIOSVersion" IM111.88Z.0034.B00.0910301727"
139#define kDefaultiMacNehalemBIOSReleaseDate"10/30/09"
140#define kDefaultiMacNehalemBoardProduct"Mac-F2268DAE"
141// iMac11,2
142// iMac11,3
143// iMac12,1
144// iMac12,2
145#define kDefaultiMacSandy"iMac12,2"
146#define kDefaultiMacSandyBIOSVersion" IM121.88Z.0047.B1D.1110171110"
147#define kDefaultiMacSandyBIOSReleaseDate"10/17/2011"
148#define kDefaultiMacSandyBoardProduct"Mac-942B59F58194171B"
149// iMac13,2
150#define kDefaultiMacIvy"iMac13,2"
151#define kDefaultiMacIvyBIOSVersion" IM131.88Z.00CE.B00.1203281326"
152#define kDefaultiMacIvyBIOSReleaseDate"03/28/2012"
153#define kDefaultiMacIvyBoardProduct"Mac-FC02E91DDD3FA6A4"
154
155//=========== MacPro ===========
156// defaults for a Mac Pro
157#define kDefaultMacProFamily"MacPro"
158#define kDefaultMacPro"MacPro3,1"
159#define kDefaultMacProBIOSVersion" MP31.88Z.006C.B05.0903051113"
160#define kDefaultMacProBIOSReleaseDate"08/03/2010"
161#define kDefaultMacProSystemVersion"1.3"
162#define kDefaultMacProBoardProduct"Mac-F2268DC8"
163#define KDefauktMacProBoardAssetTagNumber"Pro-Enclosure"
164//#define kDefaultMacProBoardType"0xB" // 11
165#define KDefaultMacProBoardSerialNumber"J593902RA4MFE"
166// defaults for a Mac Pro 4,1 core i7/Xeon
167#define kDefaultMacProNehalem"MacPro4,1"
168#define kDefaultMacProNehalemBIOSVersion" MP41.88Z.0081.B04.0903051113"
169#define kDefaultMacProNehalemBIOSReleaseDate"11/06/2009"
170#define kDefaultMacProNehalemSystemVersion"1.4"
171#define kDefaultMacProNehalemBoardProduct"Mac-F4238CC8"
172#define KDefaultMacProNehalemBoardSerialNumber"J593004RB1LUE"
173// defaults for a Mac Pro 5,1 core i7/Xeon
174#define kDefaultMacProWestmere"MacPro5,1"
175#define kDefaultMacProWestmereBIOSVersion" MP51.88Z.007F.B03.1010071432"
176#define kDefaultMacProWestmereBIOSReleaseDate"10/07/2010"
177#define kDefaultMacProWestmereSystemVersion"1.2"
178#define kDefaultMacProWestmereBoardProduct"Mac-F221BEC8"
179#define KDefaultMacProWestmereBoardSerialNumber"J522700H7BH8C"
180//-------------------------------------------------------------------------------------------------------------------------
181
182
183#define getFieldOffset(struct, field)((uint8_t)(uint32_t)&(((struct *)0)->field))
184
185typedef struct
186{
187SMBStructHeader *orig;
188SMBStructHeader *new;
189} SMBStructPtrs;
190
191struct
192{
193char *vendor;
194char *version;
195char *releaseDate;
196} defaultBIOSInfo;
197
198struct
199{
200char *manufacturer;
201char *productName;
202char *version;
203char *serialNumber;
204char *family;
205} defaultSystemInfo;
206
207struct
208{
209char *manufacturer;
210char *product;
211char *serialNumber; //
212char *boardType; //
213char *assetTagNumber; //
214char *locationInChassis; //
215} defaultBaseBoard;
216
217
218typedef struct
219{
220uint8_ttype;
221SMBValueTypevalueType;
222uint8_tfieldOffset;
223char*keyString;
224bool(*getSMBValue)(returnType *);
225char**defaultValue;
226} SMBValueSetter;
227
228SMBValueSetter SMBSetters[] =
229{
230//-------------------------------------------------------------------------------------------------------------------------
231// BIOSInformation
232//-------------------------------------------------------------------------------------------------------------------------
233{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, vendor),kSMBBIOSInformationVendorKey,
234NULL,&defaultBIOSInfo.vendor}, // AppleBiosVendor
235
236{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, version),kSMBBIOSInformationVersionKey,
237NULL,&defaultBIOSInfo.version}, // AppleFirmwareVersion
238
239{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, releaseDate),kSMBBIOSInformationReleaseDateKey,
240NULL,&defaultBIOSInfo.releaseDate}, // AppleReleaseDate
241
242//-------------------------------------------------------------------------------------------------------------------------
243// SystemInformation
244//-------------------------------------------------------------------------------------------------------------------------
245{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, manufacturer),kSMBSystemInformationManufacturerKey,
246NULL,&defaultSystemInfo.manufacturer}, // AppleBiosVendor
247
248{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, productName),kSMBSystemInformationProductNameKey,
249NULL,&defaultSystemInfo.productName}, // AppleProductName
250
251{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, version),kSMBSystemInformationVersionKey,
252NULL,&defaultSystemInfo.version}, // AppleSystemVersion
253
254{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, serialNumber),kSMBSystemInformationSerialNumberKey,
255NULL,&defaultSystemInfo.serialNumber}, // AppleSerialNumber
256
257{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, skuNumber),NULL,
258NULL,NULL}, // AppleSkuNumber
259
260{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, family),kSMBSystemInformationFamilyKey,
261NULL,&defaultSystemInfo.family}, // AppleFamily
262
263
264//-------------------------------------------------------------------------------------------------------------------------
265// BaseBoard
266//-------------------------------------------------------------------------------------------------------------------------
267{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, manufacturer),kSMBBaseBoardManufacturerKey,
268NULL,&defaultBaseBoard.manufacturer}, // AppleBiosVendor
269
270{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, product),kSMBBaseBoardProductKey,
271NULL,&defaultBaseBoard.product}, // AppleBoardID
272
273{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, version),NULL,
274 NULL,NULL}, // AppleSystemVersion
275
276{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, serialNumber),kSMBBaseBoardSerialNumber,
277 NULL,&defaultBaseBoard.serialNumber }, // AppleBoard
278
279{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, assetTagNumber),kSMBBaseBoardAssetTagNumber,
280 NULL,&defaultBaseBoard.assetTagNumber }, // AppleChassisAsset
281
282{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, locationInChassis),kSMBBaseBoardLocationInChassis,
283 NULL,&defaultBaseBoard.locationInChassis }, // AppleBoardLocation
284
285{kSMBTypeBaseBoard,kSMBByte,getFieldOffset(SMBBaseBoard, boardType),kSMBBaseBoardType,
286 NULL,&defaultBaseBoard.boardType }, // AppleBoardType
287//-------------------------------------------------------------------------------------------------------------------------
288// SystemEnclosure
289//-------------------------------------------------------------------------------------------------------------------------
290{kSMBTypeSystemEnclosure,kSMBString,getFieldOffset(SMBSystemEnclosure, manufacturer),
291kSMBBaseBoardManufacturerKey,NULL,&defaultBaseBoard.manufacturer}, // AppleBiosVendor
292
293//-------------------------------------------------------------------------------------------------------------------------
294// ProcessorInformation
295//-------------------------------------------------------------------------------------------------------------------------
296{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, socketDesignation),NULL,NULL,NULL},
297
298{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, manufacturer),NULL,NULL,NULL},
299
300{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, processorVersion),NULL,NULL,NULL},
301
302{kSMBTypeProcessorInformation,kSMBWord,getFieldOffset(SMBProcessorInformation, externalClock),kSMBProcessorInformationExternalClockKey,
303getProcessorInformationExternalClock,NULL},
304
305{kSMBTypeProcessorInformation,kSMBWord,getFieldOffset(SMBProcessorInformation, maximumClock),kSMBProcessorInformationMaximumClockKey,
306getProcessorInformationMaximumClock,NULL},
307
308{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, serialNumber),/*SMBProcessorInformationSerialNumberKey,
309 getProcessorInformationSerialNumber, */NULL,NULL,NULL},
310
311{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, assetTag),NULL,NULL,NULL},
312
313{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, partNumber),NULL,NULL,NULL},
314
315//-------------------------------------------------------------------------------------------------------------------------
316// Memory Device
317//-------------------------------------------------------------------------------------------------------------------------
318{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, deviceLocator),kSMBMemoryDeviceDeviceLocatorKey,
319NULL,NULL},
320
321{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, bankLocator),kSMBMemoryDeviceBankLocatorKey,
322NULL,NULL},
323
324{kSMBTypeMemoryDevice,kSMBByte,getFieldOffset(SMBMemoryDevice, memoryType),kSMBMemoryDeviceMemoryTypeKey,
325getSMBMemoryDeviceMemoryType,NULL},
326
327{kSMBTypeMemoryDevice,kSMBWord,getFieldOffset(SMBMemoryDevice, memorySpeed),kSMBMemoryDeviceMemorySpeedKey,
328getSMBMemoryDeviceMemorySpeed,NULL},
329
330{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, manufacturer),kSMBMemoryDeviceManufacturerKey,
331getSMBMemoryDeviceManufacturer,NULL},
332
333{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, serialNumber),kSMBMemoryDeviceSerialNumberKey,
334getSMBMemoryDeviceSerialNumber,NULL},
335
336{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, assetTag),NULL,NULL,NULL},
337
338{kSMBTypeMemoryDevice,kSMBWord,getFieldOffset(SMBMemoryDevice, errorHandle), NULL, getSMBMemoryDeviceMemoryErrorHandle, NULL},
339
340{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, partNumber),kSMBMemoryDevicePartNumberKey,
341getSMBMemoryDevicePartNumber,NULL},
342
343
344//-------------------------------------------------------------------------------------------------------------------------
345// Apple Specific
346//-------------------------------------------------------------------------------------------------------------------------
347{kSMBTypeOemProcessorType,kSMBWord,getFieldOffset(SMBOemProcessorType, ProcessorType),kSMBOemProcessorTypeKey,
348getSMBOemProcessorType,NULL},
349
350{kSMBTypeOemProcessorBusSpeed,kSMBWord,getFieldOffset(SMBOemProcessorBusSpeed, ProcessorBusSpeed),kSMBOemProcessorBusSpeedKey,
351getSMBOemProcessorBusSpeed,NULL}
352};
353
354int numOfSetters = sizeof(SMBSetters) / sizeof(SMBValueSetter);
355
356
357SMBEntryPoint *origeps= 0;
358SMBEntryPoint *neweps= 0;
359
360static uint8_t stringIndex;// increament when a string is added and set the field value accordingly
361static uint8_t stringsSize;// add string size
362
363static SMBWord tableLength= 0;
364static SMBWord handle= 0;
365static SMBWord maxStructSize= 0;
366static SMBWord structureCount= 0;
367/*
368 if (gSettings.RtMLB == NULL && SNLen > 0) {
369 gSettings.RtMLB = AllocateCopyPool(SNLen + 1, gSettings.SerialNr);
370 }
371
372 if (gSettings.RtROM == NULL) {
373 // we can try to set it to MAC address from SMBIOS UUID - some boards have it there
374 gSettings.RtROMLen = 6;
375 gSettings.RtROM = AllocateCopyPool(gSettings.RtROMLen, ((UINT8*)&gSettings.SmUUID) + 10);
376 }
377
378
379 ----------------
380 // RtVariables
381 dictPointer = GetProperty(dict, "RtVariables");
382 if (dictPointer) {
383
384 // ROM: <data>bin data</data> or <string>base 64 encoded bin data</string>
385 prop = GetProperty(dictPointer, "ROM");
386 if(prop) {
387 gSettings.RtROM = GetDataSetting(dictPointer, "ROM", &gSettings.RtROMLen);
388 if (gSettings.RtROM == NULL || gSettings.RtROMLen == 0) {
389 gSettings.RtROM = NULL;
390 gSettings.RtROMLen = 0;
391 }
392 }
393
394 // MLB: <string>some value</string>
395 prop = GetProperty(dictPointer, "MLB");
396 if(prop && AsciiStrLen(prop->string) > 0) {
397 gSettings.RtMLB = AllocateCopyPool(AsciiStrSize(prop->string), prop->string);
398 }
399
400 }
401
402
403
404
405 */
406/* Rewrite this function */
407void setDefaultSMBData(void)
408{
409defaultBIOSInfo.vendor = kDefaultVendorManufacturer;
410defaultBIOSInfo.releaseDate = kDefaultBIOSReleaseDate;
411
412defaultSystemInfo.manufacturer = kDefaultVendorManufacturer;
413defaultSystemInfo.version = kDefaultSystemVersion;
414defaultSystemInfo.serialNumber = kDefaultSerialNumber;
415
416defaultBaseBoard.manufacturer = kDefaultVendorManufacturer;
417defaultBaseBoard.product = kDefaultBoardProduct;
418defaultBaseBoard.boardType = kDefaultBoardType; // new
419defaultBaseBoard.serialNumber = KDefaultBoardSerialNumber; //new
420defaultBaseBoard.assetTagNumber = KDefaultBoardAssetTagNumber; //new
421defaultBaseBoard.locationInChassis = kDefaultLocatioInChassis; //new
422
423if (platformCPUFeature(CPU_FEATURE_MOBILE))
424{
425if (Platform.CPU.NoCores > 1)
426{
427defaultBIOSInfo.version= kDefaultMacBookProBIOSVersion;
428defaultBIOSInfo.releaseDate= kDefaultMacBookProBIOSReleaseDate;
429defaultBaseBoard.product= kDefaultMacBookProBoardProduct;
430defaultSystemInfo.productName= kDefaultMacBookPro;
431defaultSystemInfo.family= kDefaultMacBookProFamily;
432defaultBaseBoard.assetTagNumber= kDefaultMacBookProBoardAssetTagNumber;
433}
434else
435{
436defaultBIOSInfo.version= kDefaultMacBookBIOSVersion;
437defaultBIOSInfo.releaseDate= kDefaultMacBookBIOSReleaseDate;
438defaultSystemInfo.productName= kDefaultMacBook;
439defaultSystemInfo.family= kDefaultMacBookFamily;
440defaultBaseBoard.assetTagNumber= kDefaultMacBookBoardAssetTagNumber;
441}
442}
443else
444{
445switch (Platform.CPU.NoCores)
446{
447case 1:
448defaultBIOSInfo.version= kDefaultMacminiBIOSVersion;
449defaultBIOSInfo.releaseDate= kDefaultMacminiBIOSReleaseDate;
450//defaultBaseBoard.product= kDefaultMacminiBoardProduct;
451defaultSystemInfo.productName= kDefaultMacmini;
452defaultSystemInfo.family= kDefaultMacminiFamily;
453defaultBaseBoard.assetTagNumber= kDefaultMacminiBoardAssetTagNumber;
454break;
455
456case 2:
457defaultBIOSInfo.version= kDefaultiMacBIOSVersion;
458defaultBaseBoard.product= kDefaultiMacBoardProduct;
459defaultSystemInfo.productName= kDefaultiMac;
460defaultSystemInfo.family= kDefaultiMacFamily;
461defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
462break;
463default:
464{
465switch (Platform.CPU.Family)
466{
467case 0x06:
468{
469switch (Platform.CPU.Model)
470{
471case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
472case CPU_MODEL_DALES:
473case CPU_MODEL_CLARKDALE:// Intel Core i3, i5 LGA1156 (32nm)
474defaultBIOSInfo.version= kDefaultiMacNehalemBIOSVersion;
475defaultBIOSInfo.releaseDate= kDefaultiMacNehalemBIOSReleaseDate;
476defaultBaseBoard.product= kDefaultiMacNehalemBoardProduct;
477defaultSystemInfo.productName= kDefaultiMacNehalem;
478defaultSystemInfo.family= kDefaultiMacFamily;
479defaultBaseBoard.assetTagNumber= kDefaultiMacBoardAssetTagNumber;
480break;
481
482case CPU_MODEL_SANDYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (32nm)
483case CPU_MODEL_JAKETOWN:// Intel Core i7, Xeon E5 LGA2011 (32nm)
484defaultBIOSInfo.version= kDefaultiMacSandyBIOSVersion;
485defaultBIOSInfo.releaseDate= kDefaultiMacSandyBIOSReleaseDate;
486defaultBaseBoard.product= kDefaultiMacSandyBoardProduct;
487defaultSystemInfo.productName= kDefaultiMacSandy;
488defaultSystemInfo.family= kDefaultiMacFamily;
489defaultBaseBoard.assetTagNumber = kDefaultiMacBoardAssetTagNumber;
490break;
491
492case CPU_MODEL_IVYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (22nm)
493case CPU_MODEL_IVYBRIDGE_E5:
494defaultBIOSInfo.version= kDefaultiMacIvyBIOSVersion;
495defaultBIOSInfo.releaseDate= kDefaultiMacIvyBIOSReleaseDate;
496defaultBaseBoard.product= kDefaultiMacIvyBoardProduct;
497defaultSystemInfo.productName= kDefaultiMacIvy;
498defaultSystemInfo.family= kDefaultiMacFamily;
499defaultBaseBoard.assetTagNumber= kDefaultiMacBoardAssetTagNumber;
500break;
501
502case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
503case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
504defaultBIOSInfo.version= kDefaultMacProNehalemBIOSVersion;
505defaultBIOSInfo.releaseDate= kDefaultMacProNehalemBIOSReleaseDate;
506defaultBaseBoard.product= kDefaultMacProNehalemBoardProduct;
507//defaultBaseBoard.boardType= kDefaultMacProBoardType;
508defaultBaseBoard.serialNumber= KDefaultMacProNehalemBoardSerialNumber;// BoardSerialNumber;
509defaultSystemInfo.productName= kDefaultMacProNehalem;
510defaultSystemInfo.family= kDefaultMacProFamily;
511defaultSystemInfo.version= kDefaultMacProNehalemSystemVersion;
512break;
513
514case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
515case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
516defaultBIOSInfo.version= kDefaultMacProWestmereBIOSVersion;
517defaultBIOSInfo.releaseDate= kDefaultMacProWestmereBIOSReleaseDate;
518defaultBaseBoard.product= kDefaultMacProWestmereBoardProduct;
519//defaultBaseBoard.boardType= kDefaultMacProBoardType;
520defaultBaseBoard.serialNumber= KDefaultMacProWestmereBoardSerialNumber;// BoardSerialNumber;
521defaultSystemInfo.productName= kDefaultMacProWestmere;
522defaultSystemInfo.family= kDefaultMacProFamily;
523defaultSystemInfo.version= kDefaultMacProWestmereSystemVersion;
524break;
525
526default:
527defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
528defaultBIOSInfo.releaseDate= kDefaultMacProBIOSReleaseDate;
529defaultBaseBoard.product= kDefaultMacProBoardProduct;
530//defaultBaseBoard.boardType= kDefaultMacProBoardType;
531defaultSystemInfo.productName= kDefaultMacPro;
532defaultSystemInfo.family= kDefaultMacProFamily;
533break;
534}
535break;
536}
537default:
538defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
539//defaultBaseBoard.boardType= kDefaultMacProBoardType;
540defaultSystemInfo.productName= kDefaultMacPro;
541defaultSystemInfo.family= kDefaultMacProFamily;
542break;
543}
544break;
545}
546}
547}
548}
549
550/* Used for SM*n smbios.plist keys */
551bool getSMBValueForKey(SMBStructHeader *structHeader, const char *keyString, const char **string, returnType *value)
552{
553static int idx = -1;
554static int current = -1;
555int len;
556char key[24];
557
558if (current != structHeader->handle)
559{
560idx++;
561current = structHeader->handle;
562}
563
564sprintf(key, "%s%d", keyString, idx);
565
566if (value)
567{
568if (getIntForKey(key, (int *)&(value->dword), SMBPlist))
569{
570return true;
571}
572}
573else
574{
575if (getValueForKey(key, string, &len, SMBPlist))
576{
577return true;
578}
579}
580return false;
581}
582
583char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field)
584{
585uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
586
587if (!field)
588{
589return NULL;
590}
591
592for (field--; field != 0 && strlen((char *)stringPtr) > 0;
593field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
594
595return (char *)stringPtr;
596}
597
598void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field)
599{
600int strSize;
601
602if (!field)
603{
604return;
605}
606
607if (!string)
608{
609*field = 0;
610return;
611}
612
613strSize = strlen(string);
614
615// remove any spaces found at the end
616while ((strSize != 0) && (string[strSize - 1] == ' '))
617{
618strSize--;
619}
620
621if (strSize == 0)
622{
623*field = 0;
624return;
625}
626
627memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize);
628*field = stringIndex;
629
630stringIndex++;
631stringsSize += strSize + 1;
632}
633
634bool setSMBValue(SMBStructPtrs *structPtr, int idx, returnType *value)
635{
636const char *string = 0;
637int len;
638bool parsed;
639int val;
640
641if (numOfSetters <= idx)
642{
643return false;
644}
645
646switch (SMBSetters[idx].valueType)
647{
648case kSMBString:
649if (SMBSetters[idx].keyString)
650{
651if (getValueForKey(SMBSetters[idx].keyString, &string, &len, SMBPlist))
652{
653break;
654}
655else
656{
657if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
658{
659if (getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, &string, NULL))
660{
661break;
662}
663}
664}
665
666}
667if (SMBSetters[idx].getSMBValue)
668{
669if (SMBSetters[idx].getSMBValue((returnType *)&string))
670{
671break;
672}
673}
674if ((SMBSetters[idx].defaultValue) && *(SMBSetters[idx].defaultValue))
675{
676string = *(SMBSetters[idx].defaultValue);
677break;
678}
679string = getSMBStringForField(structPtr->orig, *(uint8_t *)value);
680break;
681
682case kSMBByte:
683case kSMBWord:
684case kSMBDWord:
685//case kSMBQWord:
686if (SMBSetters[idx].keyString)
687{
688parsed = getIntForKey(SMBSetters[idx].keyString, &val, SMBPlist);
689if (!parsed)
690{
691if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
692{
693parsed = getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, NULL, (returnType *)&val);
694}
695}
696if (parsed)
697{
698switch (SMBSetters[idx].valueType)
699{
700case kSMBByte:
701value->byte = (uint8_t)val;
702break;
703case kSMBWord:
704value->word = (uint16_t)val;
705break;
706case kSMBDWord:
707default:
708value->dword = (uint32_t)val;
709break;
710}
711return true;
712}
713}
714
715if (SMBSetters[idx].getSMBValue)
716{
717if (SMBSetters[idx].getSMBValue(value))
718{
719return true;
720}
721}
722#if 0
723if (*(SMBSetters[idx].defaultValue))
724{
725value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue);
726return true;
727}
728#endif
729break;
730}
731
732if (SMBSetters[idx].valueType == kSMBString && string)
733{
734setSMBStringForField(structPtr->new, string, &value->byte);
735}
736return true;
737}
738
739//-------------------------------------------------------------------------------------------------------------------------
740// Apple Specific
741//-------------------------------------------------------------------------------------------------------------------------
742void addSMBFirmwareVolume(SMBStructPtrs *structPtr)
743{
744return;
745}
746
747void addSMBMemorySPD(SMBStructPtrs *structPtr)
748{
749/* SPD data from Platform.RAM.spd */
750return;
751}
752
753void addSMBOemProcessorType(SMBStructPtrs *structPtr)
754{
755SMBOemProcessorType *p = (SMBOemProcessorType *)structPtr->new;
756
757p->header.type= kSMBTypeOemProcessorType;
758p->header.length= sizeof(SMBOemProcessorType);
759p->header.handle= handle++;
760
761setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->ProcessorType));
762
763structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorType) + 2);
764tableLength += sizeof(SMBOemProcessorType) + 2;
765structureCount++;
766}
767
768void addSMBOemProcessorBusSpeed(SMBStructPtrs *structPtr)
769{
770SMBOemProcessorBusSpeed *p = (SMBOemProcessorBusSpeed *)structPtr->new;
771
772switch (Platform.CPU.Family)
773{
774case 0x06:
775{
776switch (Platform.CPU.Model)
777{
778case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
779case CPU_MODEL_DALES:
780case CPU_MODEL_CLARKDALE:// Intel Core i3, i5 LGA1156 (32nm)
781case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
782case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
783case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
784case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
785case CPU_MODEL_SANDYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (32nm)
786case CPU_MODEL_IVYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (22nm)
787case CPU_MODEL_IVYBRIDGE_E5:
788case CPU_MODEL_JAKETOWN:// Intel Core i7, Xeon E5 LGA2011 (32nm)
789break;
790
791default:
792return;
793}
794}
795}
796
797p->header.type= kSMBTypeOemProcessorBusSpeed;
798p->header.length= sizeof(SMBOemProcessorBusSpeed);
799p->header.handle= handle++;
800
801setSMBValue(structPtr, numOfSetters -1, (returnType *)&(p->ProcessorBusSpeed));
802
803structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorBusSpeed) + 2);
804tableLength += sizeof(SMBOemProcessorBusSpeed) + 2;
805structureCount++;
806}
807
808//-------------------------------------------------------------------------------------------------------------------------
809// EndOfTable
810//-------------------------------------------------------------------------------------------------------------------------
811void addSMBEndOfTable(SMBStructPtrs *structPtr)
812{
813structPtr->new->type= kSMBTypeEndOfTable;
814structPtr->new->length= sizeof(SMBStructHeader);
815structPtr->new->handle= handle++;
816
817structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBStructHeader) + 2);
818tableLength += sizeof(SMBStructHeader) + 2;
819structureCount++;
820}
821
822void setSMBStruct(SMBStructPtrs *structPtr)
823{
824bool setterFound = false;
825
826uint8_t *ptr;
827SMBWord structSize;
828int i;
829
830stringIndex = 1;
831stringsSize = 0;
832
833if (handle < structPtr->orig->handle)
834{
835handle = structPtr->orig->handle;
836}
837
838memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
839
840for (i = 0; i < numOfSetters; i++)
841{
842if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structPtr->orig->length))
843{
844setterFound = true;
845setSMBValue(structPtr, i, (returnType *)((uint8_t *)structPtr->new + SMBSetters[i].fieldOffset));
846}
847}
848
849if (setterFound)
850{
851ptr = (uint8_t *)structPtr->new + structPtr->orig->length;
852for (; ((uint16_t *)ptr)[0] != 0; ptr++);
853
854if (((uint16_t *)ptr)[0] == 0)
855{
856ptr += 2;
857}
858structSize = ptr - (uint8_t *)structPtr->new;
859}
860else
861{
862ptr = (uint8_t *)structPtr->orig + structPtr->orig->length;
863for (; ((uint16_t *)ptr)[0] != 0; ptr++);
864
865if (((uint16_t *)ptr)[0] == 0)
866{
867ptr += 2;
868}
869
870structSize = ptr - (uint8_t *)structPtr->orig;
871memcpy((void *)structPtr->new, structPtr->orig, structSize);
872}
873
874structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + structSize);
875
876tableLength += structSize;
877
878if (structSize > maxStructSize)
879{
880maxStructSize = structSize;
881}
882
883structureCount++;
884}
885
886void setupNewSMBIOSTable(SMBEntryPoint *eps, SMBStructPtrs *structPtr)
887{
888uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
889structPtr->orig = (SMBStructHeader *)ptr;
890
891for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structPtr->orig + sizeof(SMBStructHeader)));)
892{
893switch (structPtr->orig->type)
894{
895/* Skip all Apple Specific Structures */
896case kSMBTypeFirmwareVolume:
897case kSMBTypeMemorySPD:
898case kSMBTypeOemProcessorType:
899case kSMBTypeOemProcessorBusSpeed:
900/* And this one too, to be added at the end */
901case kSMBTypeEndOfTable:
902break;
903
904default:
905/* Add */
906setSMBStruct(structPtr);
907break;
908}
909
910ptr = (uint8_t *)((uint32_t)structPtr->orig + structPtr->orig->length);
911for (; ((uint16_t *)ptr)[0] != 0; ptr++);
912
913if (((uint16_t *)ptr)[0] == 0)
914{
915ptr += 2;
916}
917
918structPtr->orig = (SMBStructHeader *)ptr;
919}
920
921addSMBFirmwareVolume(structPtr);
922addSMBMemorySPD(structPtr);
923addSMBOemProcessorType(structPtr);
924addSMBOemProcessorBusSpeed(structPtr);
925
926addSMBEndOfTable(structPtr);
927}
928
929void setupSMBIOSTable(void)
930{
931SMBStructPtrs *structPtr;
932uint8_t *buffer;
933bool setSMB = true;
934
935if (!origeps)
936{
937return;
938}
939
940neweps = origeps;
941
942structPtr = (SMBStructPtrs *)malloc(sizeof(SMBStructPtrs));
943if (!structPtr)
944{
945return;
946}
947
948buffer = malloc(SMB_ALLOC_SIZE);
949if (!buffer)
950{
951return;
952}
953
954bzero(buffer, SMB_ALLOC_SIZE);
955structPtr->new = (SMBStructHeader *)buffer;
956
957getBoolForKey(kSMBIOSdefaults, &setSMB, &bootInfo->chameleonConfig);
958if (setSMB)
959{
960setDefaultSMBData();
961}
962
963setupNewSMBIOSTable(origeps, structPtr);
964
965neweps = (SMBEntryPoint *)AllocateKernelMemory(sizeof(SMBEntryPoint));
966if (!neweps)
967{
968return;
969}
970bzero(neweps, sizeof(SMBEntryPoint));
971
972neweps->anchor[0]= '_';
973neweps->anchor[1]= 'S';
974neweps->anchor[2]= 'M';
975neweps->anchor[3]= '_';
976neweps->entryPointLength= sizeof(SMBEntryPoint);
977neweps->majorVersion= 2;
978neweps->minorVersion= 4;
979neweps->maxStructureSize= maxStructSize;
980neweps->entryPointRevision= 0;
981
982neweps->dmi.anchor[0]= '_';
983neweps->dmi.anchor[1]= 'D';
984neweps->dmi.anchor[2]= 'M';
985neweps->dmi.anchor[3]= 'I';
986neweps->dmi.anchor[4]= '_';
987neweps->dmi.tableLength= tableLength;
988neweps->dmi.tableAddress= AllocateKernelMemory(tableLength);
989neweps->dmi.structureCount= structureCount;
990neweps->dmi.bcdRevision= 0x24;
991
992if (!neweps->dmi.tableAddress)
993{
994return;
995}
996
997memcpy((void *)neweps->dmi.tableAddress, buffer, tableLength);
998
999neweps->dmi.checksum= 0;
1000neweps->dmi.checksum= 0x100 - checksum8(&neweps->dmi, sizeof(DMIEntryPoint));
1001
1002neweps->checksum= 0;
1003neweps->checksum= 0x100 - checksum8(neweps, sizeof(SMBEntryPoint));
1004
1005free(buffer);
1006decodeSMBIOSTable(neweps);
1007}
1008
1009void *getSmbios(int which)
1010{
1011switch (which)
1012{
1013case SMBIOS_ORIGINAL:
1014if (!origeps)
1015{
1016origeps = getAddressOfSmbiosTable();
1017}
1018return origeps;
1019case SMBIOS_PATCHED:
1020return neweps;
1021}
1022
1023return 0;
1024}
1025
1026/* Collect any information needed later */
1027void readSMBIOSInfo(SMBEntryPoint *eps)
1028{
1029uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
1030SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
1031
1032int dimmnbr = 0;
1033Platform.DMI.MaxMemorySlots= 0;
1034Platform.DMI.CntMemorySlots= 0;
1035Platform.DMI.MemoryModules= 0;
1036
1037for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
1038{
1039switch (structHeader->type)
1040{
1041case kSMBTypeSystemInformation:
1042Platform.UUID = ((SMBSystemInformation *)structHeader)->uuid;
1043break;
1044
1045case kSMBTypePhysicalMemoryArray:
1046Platform.DMI.MaxMemorySlots += ((SMBPhysicalMemoryArray *)structHeader)->numMemoryDevices;
1047break;
1048
1049case kSMBTypeMemoryDevice:
1050Platform.DMI.CntMemorySlots++;
1051if (((SMBMemoryDevice *)structHeader)->memorySize != 0)
1052{
1053Platform.DMI.MemoryModules++;
1054}
1055if (((SMBMemoryDevice *)structHeader)->memorySpeed > 0)
1056{
1057Platform.RAM.DIMM[dimmnbr].Frequency = ((SMBMemoryDevice *)structHeader)->memorySpeed;
1058}
1059dimmnbr++;
1060break;
1061}
1062
1063structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
1064for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
1065
1066if (((uint16_t *)structPtr)[0] == 0)
1067{
1068structPtr += 2;
1069}
1070
1071structHeader = (SMBStructHeader *)structPtr;
1072}
1073}
1074

Archive Download this file

Revision: 2238