Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/libsaio/smbios.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
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
47/* Processor Information */
48#define kSMBProcessorInformationExternalClockKey"SMexternalclock"
49#define kSMBProcessorInformationMaximumClockKey"SMmaximalclock"
50
51/* Memory Device */
52#define kSMBMemoryDeviceDeviceLocatorKey"SMmemdevloc"
53#define kSMBMemoryDeviceBankLocatorKey"SMmembankloc"
54#define kSMBMemoryDeviceMemoryTypeKey"SMmemtype"
55#define kSMBMemoryDeviceMemorySpeedKey"SMmemspeed"
56#define kSMBMemoryDeviceManufacturerKey"SMmemmanufacturer"
57#define kSMBMemoryDeviceSerialNumberKey"SMmemserial"
58#define kSMBMemoryDevicePartNumberKey"SMmempart"
59
60/* Apple Specific */
61#define kSMBOemProcessorTypeKey"SMcputype"
62#define kSMBOemProcessorBusSpeedKey"SMbusspeed"
63
64//-------------------------------------------------------------------------------------------------------------------------
65// Default SMBIOS Data
66//-------------------------------------------------------------------------------------------------------------------------
67/* Rewrite: use a struct */
68
69#define kDefaultVendorManufacturer"Apple Inc."
70#define kDefaultBIOSReleaseDate"11/06/2009"
71#define kDefaultSerialNumber"SOMESRLNMBR"
72#define kDefaultBoardProduct"Mac-F4208DC8"
73#define kDefaultSystemVersion"1.0"
74
75// defaults for a Mac mini
76#define kDefaultMacminiFamily"Macmini"
77#define kDefaultMacmini"Macmini1,1"
78#define kDefaultMacminiBIOSVersion" MM21.88Z.009A.B00.0903051113"
79
80// defaults for a MacBook
81#define kDefaultMacBookFamily"MacBook"
82#define kDefaultMacBook"MacBook4,1"
83#define kDefaultMacBookBIOSVersion" MB41.88Z.0073.B00.0903051113"
84
85// defaults for a MacBook Pro
86#define kDefaultMacBookProFamily"MacBookPro"
87#define kDefaultMacBookPro"MacBookPro4,1"
88#define kDefaultMacBookProBIOSVersion" MBP41.88Z.0073.B00.0903051113"
89
90// defaults for an iMac
91#define kDefaultiMacFamily"iMac"
92#define kDefaultiMac"iMac8,1"
93#define kDefaultiMacBIOSVersion" IM81.88Z.00C1.B00.0903051113"
94// defaults for an iMac11,1 core i3/i5/i7
95#define kDefaultiMacNehalem"iMac11,1"
96#define kDefaultiMacNehalemBIOSVersion" IM111.88Z.0034.B00.0903051113"
97// defaults for an iMac12,1
98#define kDefaultiMacSandy"iMac12,1"
99#define kDefaultiMacSandyBIOSVersion" IM121.88Z.0047.B00.1102091756"
100
101// defaults for a Mac Pro
102#define kDefaultMacProFamily"MacPro"
103#define kDefaultMacPro"MacPro3,1"
104#define kDefaultMacProBIOSVersion" MP31.88Z.006C.B05.0903051113"
105// defaults for a Mac Pro 4,1 core i7/Xeon
106#define kDefaultMacProNehalem"MacPro4,1"
107#define kDefaultMacProNehalemBIOSVersion" MP41.88Z.0081.B04.0903051113"
108// defaults for a Mac Pro 5,1 core i7/Xeon
109#define kDefaultMacProWestmere"MacPro5,1"
110#define kDefaultMacProWestmereBIOSVersion" MP51.88Z.007F.B00.1008031144"
111#define kDefaulMacProWestmereBIOSReleaseDate"08/03/10"
112//-------------------------------------------------------------------------------------------------------------------------
113
114
115#define getFieldOffset(struct, field)((uint8_t)(uint32_t)&(((struct *)0)->field))
116
117typedef struct {
118SMBStructHeader *orig;
119SMBStructHeader *new;
120} SMBStructPtrs;
121
122struct {
123char *vendor;
124char *version;
125char *releaseDate;
126} defaultBIOSInfo;
127
128struct {
129char *manufacturer;
130char *productName;
131char *version;
132char *serialNumber;
133char *family;
134} defaultSystemInfo;
135
136struct {
137char *manufacturer;
138char *product;
139} defaultBaseBoard;
140
141
142typedef struct {
143uint8_ttype;
144SMBValueTypevalueType;
145uint8_tfieldOffset;
146char*keyString;
147bool(*getSMBValue)(returnType *);
148char**defaultValue;
149} SMBValueSetter;
150
151SMBValueSetter SMBSetters[] =
152{
153//-------------------------------------------------------------------------------------------------------------------------
154// BIOSInformation
155//-------------------------------------------------------------------------------------------------------------------------
156{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, vendor),kSMBBIOSInformationVendorKey,
157NULL,&defaultBIOSInfo.vendor},
158
159{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, version),kSMBBIOSInformationVersionKey,
160NULL,&defaultBIOSInfo.version},
161
162{kSMBTypeBIOSInformation,kSMBString,getFieldOffset(SMBBIOSInformation, releaseDate),kSMBBIOSInformationReleaseDateKey,
163NULL,&defaultBIOSInfo.releaseDate},
164
165//-------------------------------------------------------------------------------------------------------------------------
166// SystemInformation
167//-------------------------------------------------------------------------------------------------------------------------
168{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, manufacturer),kSMBSystemInformationManufacturerKey,
169NULL,&defaultSystemInfo.manufacturer},
170
171{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, productName),kSMBSystemInformationProductNameKey,
172NULL,&defaultSystemInfo.productName},
173
174{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, version),kSMBSystemInformationVersionKey,
175NULL,&defaultSystemInfo.version},
176
177{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, serialNumber),kSMBSystemInformationSerialNumberKey,
178NULL,&defaultSystemInfo.serialNumber},
179
180{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, skuNumber),NULL,
181NULL,NULL},
182
183{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, family),kSMBSystemInformationFamilyKey,
184NULL,&defaultSystemInfo.family},
185
186
187//-------------------------------------------------------------------------------------------------------------------------
188// BaseBoard
189//-------------------------------------------------------------------------------------------------------------------------
190{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, manufacturer),kSMBBaseBoardManufacturerKey,
191NULL,&defaultBaseBoard.manufacturer},
192
193{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, product),kSMBBaseBoardProductKey,
194NULL,&defaultBaseBoard.product},
195
196{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, version),NULL,NULL,NULL},
197
198{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, serialNumber),NULL,NULL,NULL},
199
200{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, assetTagNumber),NULL,NULL,NULL},
201
202{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, locationInChassis),NULL,NULL,NULL},
203
204
205//-------------------------------------------------------------------------------------------------------------------------
206// ProcessorInformation
207//-------------------------------------------------------------------------------------------------------------------------
208{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, socketDesignation),NULL,NULL,NULL},
209
210{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, manufacturer),NULL,NULL,NULL},
211
212{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, processorVersion),NULL,NULL,NULL},
213
214{kSMBTypeProcessorInformation,kSMBWord,getFieldOffset(SMBProcessorInformation, externalClock),kSMBProcessorInformationExternalClockKey,
215getProcessorInformationExternalClock,NULL},
216
217{kSMBTypeProcessorInformation,kSMBWord,getFieldOffset(SMBProcessorInformation, maximumClock),kSMBProcessorInformationMaximumClockKey,
218getProcessorInformationMaximumClock,NULL},
219
220{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, serialNumber),NULL,NULL,NULL},
221
222{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, assetTag),NULL,NULL,NULL},
223
224{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, partNumber),NULL,NULL,NULL},
225
226//-------------------------------------------------------------------------------------------------------------------------
227// Memory Device
228//-------------------------------------------------------------------------------------------------------------------------
229{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, deviceLocator),kSMBMemoryDeviceDeviceLocatorKey,
230NULL,NULL},
231
232{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, bankLocator),kSMBMemoryDeviceBankLocatorKey,
233NULL,NULL},
234
235{kSMBTypeMemoryDevice,kSMBByte,getFieldOffset(SMBMemoryDevice, memoryType),kSMBMemoryDeviceMemoryTypeKey,
236getSMBMemoryDeviceMemoryType,NULL},
237
238{kSMBTypeMemoryDevice,kSMBWord,getFieldOffset(SMBMemoryDevice, memorySpeed),kSMBMemoryDeviceMemorySpeedKey,
239getSMBMemoryDeviceMemorySpeed,NULL},
240
241{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, manufacturer),kSMBMemoryDeviceManufacturerKey,
242getSMBMemoryDeviceManufacturer,NULL},
243
244{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, serialNumber),kSMBMemoryDeviceSerialNumberKey,
245getSMBMemoryDeviceSerialNumber,NULL},
246
247{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, assetTag),NULL,NULL,NULL},
248
249{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, partNumber),kSMBMemoryDevicePartNumberKey,
250getSMBMemoryDevicePartNumber,NULL},
251
252
253//-------------------------------------------------------------------------------------------------------------------------
254// Apple Specific
255//-------------------------------------------------------------------------------------------------------------------------
256{kSMBTypeOemProcessorType,kSMBWord,getFieldOffset(SMBOemProcessorType, ProcessorType),kSMBOemProcessorTypeKey,
257getSMBOemProcessorType,NULL},
258
259{kSMBTypeOemProcessorBusSpeed,kSMBWord,getFieldOffset(SMBOemProcessorBusSpeed, ProcessorBusSpeed),kSMBOemProcessorBusSpeedKey,
260getSMBOemProcessorBusSpeed,NULL}
261};
262
263int numOfSetters = sizeof(SMBSetters) / sizeof(SMBValueSetter);
264
265
266SMBEntryPoint *origeps= 0;
267SMBEntryPoint *neweps= 0;
268
269static uint8_t stringIndex;// increament when a string is added and set the field value accordingly
270static uint8_t stringsSize;// add string size
271
272static SMBWord tableLength= 0;
273static SMBWord handle= 0;
274static SMBWord maxStructSize= 0;
275static SMBWord structureCount= 0;
276
277/* Rewrite this function */
278void setDefaultSMBData(void)
279{
280defaultBIOSInfo.vendor= kDefaultVendorManufacturer;
281defaultBIOSInfo.releaseDate= kDefaultBIOSReleaseDate;
282
283defaultSystemInfo.manufacturer= kDefaultVendorManufacturer;
284defaultSystemInfo.version= kDefaultSystemVersion;
285defaultSystemInfo.serialNumber= kDefaultSerialNumber;
286
287defaultBaseBoard.manufacturer= kDefaultVendorManufacturer;
288defaultBaseBoard.product= kDefaultBoardProduct;
289
290if (platformCPUFeature(CPU_FEATURE_MOBILE))
291{
292if (Platform.CPU.NoCores > 1)
293{
294defaultBIOSInfo.version= kDefaultMacBookProBIOSVersion;
295defaultSystemInfo.productName= kDefaultMacBookPro;
296defaultSystemInfo.family= kDefaultMacBookProFamily;
297}
298else
299{
300defaultBIOSInfo.version= kDefaultMacBookBIOSVersion;
301defaultSystemInfo.productName= kDefaultMacBook;
302defaultSystemInfo.family= kDefaultMacBookFamily;
303}
304}
305else
306{
307switch (Platform.CPU.NoCores)
308{
309case 1:
310defaultBIOSInfo.version= kDefaultMacminiBIOSVersion;
311defaultSystemInfo.productName= kDefaultMacmini;
312defaultSystemInfo.family= kDefaultMacminiFamily;
313break;
314
315case 2:
316defaultBIOSInfo.version= kDefaultiMacBIOSVersion;
317defaultSystemInfo.productName= kDefaultiMac;
318defaultSystemInfo.family= kDefaultiMacFamily;
319break;
320default:
321{
322switch (Platform.CPU.Family)
323{
324case 0x06:
325{
326switch (Platform.CPU.Model)
327{
328case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
329case CPU_MODEL_DALES:
330case CPU_MODEL_DALES_32NM:// Intel Core i3, i5 LGA1156 (32nm)
331defaultBIOSInfo.version= kDefaultiMacNehalemBIOSVersion;
332defaultSystemInfo.productName= kDefaultiMacNehalem;
333defaultSystemInfo.family= kDefaultiMacFamily;
334break;
335
336case CPU_MODEL_SANDY:// Intel Core i3, i5, i7 LGA1155 (32nm)
337case CPU_MODEL_SANDY_XEON:// Intel Xeon E3
338defaultBIOSInfo.version= kDefaultiMacSandyBIOSVersion;
339defaultSystemInfo.productName= kDefaultiMacSandy;
340defaultSystemInfo.family= kDefaultiMacFamily;
341break;
342case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
343case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
344defaultBIOSInfo.version= kDefaultMacProNehalemBIOSVersion;
345defaultSystemInfo.productName= kDefaultMacProNehalem;
346defaultSystemInfo.family= kDefaultMacProFamily;
347break;
348
349case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
350case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
351defaultBIOSInfo.version= kDefaultMacProWestmereBIOSVersion;
352defaultBIOSInfo.releaseDate= kDefaulMacProWestmereBIOSReleaseDate;
353defaultSystemInfo.productName= kDefaultMacProWestmere;
354defaultSystemInfo.family= kDefaultMacProFamily;
355break;
356
357default:
358defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
359defaultSystemInfo.productName= kDefaultMacPro;
360defaultSystemInfo.family= kDefaultMacProFamily;
361break;
362}
363break;
364}
365default:
366defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
367defaultSystemInfo.productName= kDefaultMacPro;
368defaultSystemInfo.family= kDefaultMacProFamily;
369break;
370}
371break;
372}
373}
374}
375}
376
377/* Used for SM*n smbios.plist keys */
378bool getSMBValueForKey(SMBStructHeader *structHeader, const char *keyString, const char **string, returnType *value)
379{
380static int idx = -1;
381static int current = -1;
382int len;
383char key[24];
384
385if (current != structHeader->handle)
386{
387idx++;
388current = structHeader->handle;
389}
390
391sprintf(key, "%s%d", keyString, idx);
392
393if (value)
394if (getIntForKey(key, (int *)&(value->dword), SMBPlist))
395return true;
396else
397if (getValueForKey(key, string, &len, SMBPlist))
398return true;
399return false;
400}
401
402char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field)
403{
404uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
405
406if (!field)
407return NULL;
408
409for (field--; field != 0 && strlen((char *)stringPtr) > 0;
410field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
411
412return (char *)stringPtr;
413}
414
415void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field)
416{
417int strSize;
418
419if (!field)
420return;
421if (!string)
422{
423*field = 0;
424return;
425}
426
427strSize = strlen(string);
428
429// remove any spaces found at the end
430while ((strSize != 0) && (string[strSize - 1] == ' '))
431strSize--;
432
433if (strSize == 0)
434{
435*field = 0;
436return;
437}
438
439memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize);
440*field = stringIndex;
441
442stringIndex++;
443stringsSize += strSize + 1;
444}
445
446bool setSMBValue(SMBStructPtrs *structPtr, int idx, returnType *value)
447{
448const char *string = 0;
449int len;
450bool parsed;
451int val;
452
453if (numOfSetters <= idx)
454return false;
455
456switch (SMBSetters[idx].valueType)
457{
458case kSMBString:
459if (SMBSetters[idx].keyString)
460{
461if (getValueForKey(SMBSetters[idx].keyString, &string, &len, SMBPlist))
462break;
463else
464if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
465if (getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, &string, NULL))
466break;
467}
468if (SMBSetters[idx].getSMBValue)
469if (SMBSetters[idx].getSMBValue((returnType *)&string))
470break;
471if ((SMBSetters[idx].defaultValue) && *(SMBSetters[idx].defaultValue))
472{
473string = *(SMBSetters[idx].defaultValue);
474break;
475}
476string = getSMBStringForField(structPtr->orig, *(uint8_t *)value);
477break;
478
479case kSMBByte:
480case kSMBWord:
481case kSMBDWord:
482//case kSMBQWord:
483if (SMBSetters[idx].keyString)
484{
485parsed = getIntForKey(SMBSetters[idx].keyString, &val, SMBPlist);
486if (!parsed)
487if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
488parsed = getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, NULL, (returnType *)&val);
489if (parsed)
490{
491switch (SMBSetters[idx].valueType)
492{
493case kSMBByte:
494value->byte = (uint8_t)val;
495break;
496case kSMBWord:
497value->word = (uint16_t)val;
498break;
499case kSMBDWord:
500default:
501value->dword = (uint32_t)val;
502break;
503}
504return true;
505}
506}
507
508if (SMBSetters[idx].getSMBValue)
509if (SMBSetters[idx].getSMBValue(value))
510return true;
511#if 0
512if (*(SMBSetters[idx].defaultValue))
513{
514value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue);
515return true;
516}
517#endif
518break;
519}
520
521if (SMBSetters[idx].valueType == kSMBString && string)
522setSMBStringForField(structPtr->new, string, &value->byte);
523
524return true;
525}
526
527//-------------------------------------------------------------------------------------------------------------------------
528// Apple Specific
529//-------------------------------------------------------------------------------------------------------------------------
530void addSMBFirmwareVolume(SMBStructPtrs *structPtr)
531{
532return;
533}
534
535void addSMBMemorySPD(SMBStructPtrs *structPtr)
536{
537/* SPD data from Platform.RAM.spd */
538return;
539}
540
541void addSMBOemProcessorType(SMBStructPtrs *structPtr)
542{
543SMBOemProcessorType *p = (SMBOemProcessorType *)structPtr->new;
544
545p->header.type= kSMBTypeOemProcessorType;
546p->header.length= sizeof(SMBOemProcessorType);
547p->header.handle= handle++;
548
549setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->ProcessorType));
550
551structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorType) + 2);
552tableLength += sizeof(SMBOemProcessorType) + 2;
553structureCount++;
554}
555
556void addSMBOemProcessorBusSpeed(SMBStructPtrs *structPtr)
557{
558SMBOemProcessorBusSpeed *p = (SMBOemProcessorBusSpeed *)structPtr->new;
559
560switch (Platform.CPU.Family)
561{
562case 0x06:
563{
564switch (Platform.CPU.Model)
565{
566case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
567case CPU_MODEL_DALES:
568case CPU_MODEL_DALES_32NM:// Intel Core i3, i5 LGA1156 (32nm)
569case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
570case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
571case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
572case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
573break;
574
575default:
576return;
577}
578}
579}
580
581p->header.type= kSMBTypeOemProcessorBusSpeed;
582p->header.length= sizeof(SMBOemProcessorBusSpeed);
583p->header.handle= handle++;
584
585setSMBValue(structPtr, numOfSetters -1, (returnType *)&(p->ProcessorBusSpeed));
586
587structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorBusSpeed) + 2);
588tableLength += sizeof(SMBOemProcessorBusSpeed) + 2;
589structureCount++;
590}
591
592//-------------------------------------------------------------------------------------------------------------------------
593// EndOfTable
594//-------------------------------------------------------------------------------------------------------------------------
595void addSMBEndOfTable(SMBStructPtrs *structPtr)
596{
597structPtr->new->type= kSMBTypeEndOfTable;
598structPtr->new->length= sizeof(SMBStructHeader);
599structPtr->new->handle= handle++;
600
601structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBStructHeader) + 2);
602tableLength += sizeof(SMBStructHeader) + 2;
603structureCount++;
604}
605
606void setSMBStruct(SMBStructPtrs *structPtr)
607{
608bool setterFound = false;
609
610uint8_t *ptr;
611SMBWord structSize;
612int i;
613
614stringIndex = 1;
615stringsSize = 0;
616
617if (handle < structPtr->orig->handle)
618handle = structPtr->orig->handle;
619
620memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
621
622for (i = 0; i < numOfSetters; i++)
623if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structPtr->orig->length))
624{
625setterFound = true;
626setSMBValue(structPtr, i, (returnType *)((uint8_t *)structPtr->new + SMBSetters[i].fieldOffset));
627}
628
629if (setterFound)
630{
631ptr = (uint8_t *)structPtr->new + structPtr->orig->length;
632for (; ((uint16_t *)ptr)[0] != 0; ptr++);
633
634if (((uint16_t *)ptr)[0] == 0)
635ptr += 2;
636
637structSize = ptr - (uint8_t *)structPtr->new;
638}
639else
640{
641ptr = (uint8_t *)structPtr->orig + structPtr->orig->length;
642for (; ((uint16_t *)ptr)[0] != 0; ptr++);
643
644if (((uint16_t *)ptr)[0] == 0)
645ptr += 2;
646
647structSize = ptr - (uint8_t *)structPtr->orig;
648memcpy((void *)structPtr->new, structPtr->orig, structSize);
649}
650
651structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + structSize);
652
653tableLength += structSize;
654
655if (structSize > maxStructSize)
656maxStructSize = structSize;
657
658structureCount++;
659}
660
661void setupNewSMBIOSTable(SMBEntryPoint *eps, SMBStructPtrs *structPtr)
662{
663uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
664structPtr->orig = (SMBStructHeader *)ptr;
665
666for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structPtr->orig + sizeof(SMBStructHeader)));)
667{
668switch (structPtr->orig->type)
669{
670/* Skip all Apple Specific Structures */
671case kSMBTypeFirmwareVolume:
672case kSMBTypeMemorySPD:
673case kSMBTypeOemProcessorType:
674case kSMBTypeOemProcessorBusSpeed:
675/* And this one too, to be added at the end */
676case kSMBTypeEndOfTable:
677break;
678
679default:
680/* Add */
681setSMBStruct(structPtr);
682break;
683}
684
685ptr = (uint8_t *)((uint32_t)structPtr->orig + structPtr->orig->length);
686for (; ((uint16_t *)ptr)[0] != 0; ptr++);
687
688if (((uint16_t *)ptr)[0] == 0)
689ptr += 2;
690
691structPtr->orig = (SMBStructHeader *)ptr;
692}
693
694addSMBFirmwareVolume(structPtr);
695addSMBMemorySPD(structPtr);
696addSMBOemProcessorType(structPtr);
697addSMBOemProcessorBusSpeed(structPtr);
698
699addSMBEndOfTable(structPtr);
700}
701
702void setupSMBIOSTable(void)
703{
704SMBStructPtrs *structPtr;
705uint8_t *buffer;
706bool setSMB = true;
707
708if (!origeps)
709return;
710
711neweps = origeps;
712
713structPtr = (SMBStructPtrs *)malloc(sizeof(SMBStructPtrs));
714if (!structPtr)
715return;
716
717buffer = malloc(SMB_ALLOC_SIZE);
718if (!buffer)
719return;
720
721bzero(buffer, SMB_ALLOC_SIZE);
722structPtr->new = (SMBStructHeader *)buffer;
723
724getBoolForKey(kSMBIOSdefaults, &setSMB, &bootInfo->chameleonConfig);
725if (setSMB)
726setDefaultSMBData();
727
728setupNewSMBIOSTable(origeps, structPtr);
729
730neweps = (SMBEntryPoint *)AllocateKernelMemory(sizeof(SMBEntryPoint));
731if (!neweps)
732return;
733bzero(neweps, sizeof(SMBEntryPoint));
734
735neweps->anchor[0]= '_';
736neweps->anchor[1]= 'S';
737neweps->anchor[2]= 'M';
738neweps->anchor[3]= '_';
739neweps->entryPointLength= sizeof(SMBEntryPoint);
740neweps->majorVersion= 2;
741neweps->minorVersion= 4;
742neweps->maxStructureSize= maxStructSize;
743neweps->entryPointRevision= 0;
744
745neweps->dmi.anchor[0]= '_';
746neweps->dmi.anchor[1]= 'D';
747neweps->dmi.anchor[2]= 'M';
748neweps->dmi.anchor[3]= 'I';
749neweps->dmi.anchor[4]= '_';
750neweps->dmi.tableLength= tableLength;
751neweps->dmi.tableAddress= AllocateKernelMemory(tableLength);
752neweps->dmi.structureCount= structureCount;
753neweps->dmi.bcdRevision= 0x24;
754
755if (!neweps->dmi.tableAddress)
756return;
757
758memcpy((void *)neweps->dmi.tableAddress, buffer, tableLength);
759
760neweps->dmi.checksum= 0;
761neweps->dmi.checksum= 0x100 - checksum8(&neweps->dmi, sizeof(DMIEntryPoint));
762
763neweps->checksum= 0;
764neweps->checksum= 0x100 - checksum8(neweps, sizeof(SMBEntryPoint));
765
766free(buffer);
767decodeSMBIOSTable(neweps);
768}
769
770void *getSmbios(int which)
771{
772switch (which)
773{
774case SMBIOS_ORIGINAL:
775if (!origeps)
776origeps = getAddressOfSmbiosTable();
777return origeps;
778case SMBIOS_PATCHED:
779return neweps;
780}
781
782return 0;
783}
784
785/* Collect any information needed later */
786void readSMBIOSInfo(SMBEntryPoint *eps)
787{
788uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
789SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
790
791int dimmnbr = 0;
792Platform.DMI.MaxMemorySlots= 0;
793Platform.DMI.CntMemorySlots= 0;
794Platform.DMI.MemoryModules= 0;
795
796for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
797{
798switch (structHeader->type)
799{
800case kSMBTypeSystemInformation:
801Platform.UUID = ((SMBSystemInformation *)structHeader)->uuid;
802break;
803
804case kSMBTypePhysicalMemoryArray:
805Platform.DMI.MaxMemorySlots += ((SMBPhysicalMemoryArray *)structHeader)->numMemoryDevices;
806break;
807
808case kSMBTypeMemoryDevice:
809Platform.DMI.CntMemorySlots++;
810if (((SMBMemoryDevice *)structHeader)->memorySize != 0)
811Platform.DMI.MemoryModules++;
812if (((SMBMemoryDevice *)structHeader)->memorySpeed > 0)
813Platform.RAM.DIMM[dimmnbr].Frequency = ((SMBMemoryDevice *)structHeader)->memorySpeed;
814dimmnbr++;
815break;
816}
817
818structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
819for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
820
821if (((uint16_t *)structPtr)[0] == 0)
822structPtr += 2;
823
824structHeader = (SMBStructHeader *)structPtr;
825}
826}
827
828

Archive Download this file

Revision: 1808