Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 782