Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/libsaio/smbios.c

Source at commit 307 created 12 years 11 months ago.
By ifabio, merge changes from trunk (929). Also merge the module changes from Azimutz branche (fix compile error) Also edited the info.plist into AHCIPortInjector.kext: http://forum.voodooprojects.org/index.php/topic,1170.0.html
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// 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 LGA1156 (45nm)
329case CPU_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) ???
330case CPU_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm) (Clarkdale, Arrandale)
331case 0x19:// Intel Core i5 650 @3.20 Ghz
332defaultBIOSInfo.version= kDefaultiMacNehalemBIOSVersion;
333defaultSystemInfo.productName= kDefaultiMacNehalem;
334defaultSystemInfo.family= kDefaultiMacFamily;
335break;
336
337case CPU_MODEL_SANDY:
338case CPU_MODEL_SANDY_XEON:
339defaultBIOSInfo.version= kDefaultiMacSandyBIOSVersion;
340defaultSystemInfo.productName= kDefaultiMacSandy;
341defaultSystemInfo.family= kDefaultiMacFamily;
342break;
343
344case CPU_MODEL_NEHALEM:
345case CPU_MODEL_NEHALEM_EX:
346defaultBIOSInfo.version= kDefaultMacProNehalemBIOSVersion;
347defaultSystemInfo.productName= kDefaultMacProNehalem;
348defaultSystemInfo.family= kDefaultMacProFamily;
349break;
350
351case CPU_MODEL_WESTMERE:
352case CPU_MODEL_WESTMERE_EX:
353defaultBIOSInfo.version= kDefaultMacProWestmereBIOSVersion;
354defaultBIOSInfo.releaseDate= kDefaulMacProWestmereBIOSReleaseDate;
355defaultSystemInfo.productName= kDefaultMacProWestmere;
356defaultSystemInfo.family= kDefaultMacProFamily;
357break;
358
359default:
360defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
361defaultSystemInfo.productName= kDefaultMacPro;
362defaultSystemInfo.family= kDefaultMacProFamily;
363break;
364}
365break;
366}
367default:
368defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
369defaultSystemInfo.productName= kDefaultMacPro;
370defaultSystemInfo.family= kDefaultMacProFamily;
371break;
372}
373break;
374}
375}
376}
377}
378
379/* Used for SM*n smbios.plist keys */
380bool getSMBValueForKey(SMBStructHeader *structHeader, const char *keyString, const char **string, returnType *value)
381{
382static int idx = -1;
383static int current = -1;
384int len;
385char key[24];
386
387if (current != structHeader->handle)
388{
389idx++;
390current = structHeader->handle;
391}
392
393sprintf(key, "%s%d", keyString, idx);
394
395if (value)
396if (getIntForKey(key, (int *)&(value->dword), SMBPlist))
397return true;
398else
399if (getValueForKey(key, string, &len, SMBPlist))
400return true;
401return false;
402}
403
404char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field)
405{
406uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
407
408if (!field)
409return NULL;
410
411for (field--; field != 0 && strlen((char *)stringPtr) > 0;
412field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
413
414return (char *)stringPtr;
415}
416
417void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field)
418{
419int strSize;
420
421if (!field)
422return;
423if (!string)
424{
425*field = 0;
426return;
427}
428
429strSize = strlen(string);
430
431// remove any spaces found at the end
432while ((strSize != 0) && (string[strSize - 1] == ' '))
433strSize--;
434
435if (strSize == 0)
436{
437*field = 0;
438return;
439}
440
441memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize);
442*field = stringIndex;
443
444stringIndex++;
445stringsSize += strSize + 1;
446}
447
448bool setSMBValue(SMBStructPtrs *structPtr, int idx, returnType *value)
449{
450const char *string = 0;
451int len;
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{
485if (getIntForKey(SMBSetters[idx].keyString, (int *)&(value->dword), SMBPlist))
486return true;
487else
488if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
489if (getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, NULL, value))
490return true;
491}
492if (SMBSetters[idx].getSMBValue)
493if (SMBSetters[idx].getSMBValue(value))
494return true;
495#if 0
496if (*(SMBSetters[idx].defaultValue))
497{
498value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue);
499return true;
500}
501#endif
502break;
503}
504
505if (SMBSetters[idx].valueType == kSMBString && string)
506setSMBStringForField(structPtr->new, string, &value->byte);
507
508return true;
509}
510
511//-------------------------------------------------------------------------------------------------------------------------
512// Apple Specific
513//-------------------------------------------------------------------------------------------------------------------------
514void addSMBFirmwareVolume(SMBStructPtrs *structPtr)
515{
516return;
517}
518
519void addSMBMemorySPD(SMBStructPtrs *structPtr)
520{
521/* SPD data from Platform.RAM.spd */
522return;
523}
524
525void addSMBOemProcessorType(SMBStructPtrs *structPtr)
526{
527SMBOemProcessorType *p = (SMBOemProcessorType *)structPtr->new;
528
529p->header.type= kSMBTypeOemProcessorType;
530p->header.length= sizeof(SMBOemProcessorType);
531p->header.handle= handle++;
532
533setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->ProcessorType));
534
535structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorType) + 2);
536tableLength += sizeof(SMBOemProcessorType) + 2;
537structureCount++;
538}
539
540void addSMBOemProcessorBusSpeed(SMBStructPtrs *structPtr)
541{
542SMBOemProcessorBusSpeed *p = (SMBOemProcessorBusSpeed *)structPtr->new;
543
544switch (Platform.CPU.Family)
545{
546case 0x06:
547{
548switch (Platform.CPU.Model)
549{
550case 0x19:// Intel Core i5 650 @3.20 Ghz
551case CPU_MODEL_FIELDS:// Intel Core i5, i7 LGA1156 (45nm)
552case CPU_MODEL_DALES:// Intel Core i5, i7 LGA1156 (45nm) ???
553case CPU_MODEL_DALES_32NM:// Intel Core i3, i5, i7 LGA1156 (32nm)
554case CPU_MODEL_NEHALEM:// Intel Core i7 LGA1366 (45nm)
555case CPU_MODEL_NEHALEM_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
556case CPU_MODEL_WESTMERE:// Intel Core i7 LGA1366 (32nm) 6 Core
557case CPU_MODEL_WESTMERE_EX:// Intel Core i7 LGA1366 (45nm) 6 Core ???
558break;
559
560default:
561return;
562}
563}
564}
565
566p->header.type= kSMBTypeOemProcessorBusSpeed;
567p->header.length= sizeof(SMBOemProcessorBusSpeed);
568p->header.handle= handle++;
569
570setSMBValue(structPtr, numOfSetters -1, (returnType *)&(p->ProcessorBusSpeed));
571
572structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorBusSpeed) + 2);
573tableLength += sizeof(SMBOemProcessorBusSpeed) + 2;
574structureCount++;
575}
576
577//-------------------------------------------------------------------------------------------------------------------------
578// EndOfTable
579//-------------------------------------------------------------------------------------------------------------------------
580void addSMBEndOfTable(SMBStructPtrs *structPtr)
581{
582structPtr->new->type= kSMBTypeEndOfTable;
583structPtr->new->length= sizeof(SMBStructHeader);
584structPtr->new->handle= handle++;
585
586structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBStructHeader) + 2);
587tableLength += sizeof(SMBStructHeader) + 2;
588structureCount++;
589}
590
591void setSMBStruct(SMBStructPtrs *structPtr)
592{
593bool setterFound = false;
594
595uint8_t *ptr;
596SMBWord structSize;
597int i;
598
599stringIndex = 1;
600stringsSize = 0;
601
602if (handle < structPtr->orig->handle)
603handle = structPtr->orig->handle;
604
605memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
606
607for (i = 0; i < numOfSetters; i++)
608if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structPtr->orig->length))
609{
610if (SMBSetters[i].fieldOffset > structPtr->orig->length)
611continue;
612setterFound = true;
613setSMBValue(structPtr, i, (returnType *)((uint8_t *)structPtr->new + SMBSetters[i].fieldOffset));
614}
615
616if (setterFound)
617{
618ptr = (uint8_t *)structPtr->new + structPtr->orig->length;
619for (; ((uint16_t *)ptr)[0] != 0; ptr++);
620
621if (((uint16_t *)ptr)[0] == 0)
622ptr += 2;
623
624structSize = ptr - (uint8_t *)structPtr->new;
625}
626else
627{
628ptr = (uint8_t *)structPtr->orig + structPtr->orig->length;
629for (; ((uint16_t *)ptr)[0] != 0; ptr++);
630
631if (((uint16_t *)ptr)[0] == 0)
632ptr += 2;
633
634structSize = ptr - (uint8_t *)structPtr->orig;
635memcpy((void *)structPtr->new, structPtr->orig, structSize);
636}
637
638structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + structSize);
639
640tableLength += structSize;
641
642if (structSize > maxStructSize)
643maxStructSize = structSize;
644
645structureCount++;
646}
647
648void setupNewSMBIOSTable(SMBEntryPoint *eps, SMBStructPtrs *structPtr)
649{
650uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
651structPtr->orig = (SMBStructHeader *)ptr;
652
653for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structPtr->orig + sizeof(SMBStructHeader)));)
654{
655switch (structPtr->orig->type)
656{
657/* Skip all Apple Specific Structures */
658case kSMBTypeFirmwareVolume:
659case kSMBTypeMemorySPD:
660case kSMBTypeOemProcessorType:
661case kSMBTypeOemProcessorBusSpeed:
662/* And this one too, to be added at the end */
663case kSMBTypeEndOfTable:
664break;
665
666default:
667/* Add */
668setSMBStruct(structPtr);
669break;
670}
671
672ptr = (uint8_t *)((uint32_t)structPtr->orig + structPtr->orig->length);
673for (; ((uint16_t *)ptr)[0] != 0; ptr++);
674
675if (((uint16_t *)ptr)[0] == 0)
676ptr += 2;
677
678structPtr->orig = (SMBStructHeader *)ptr;
679}
680
681addSMBFirmwareVolume(structPtr);
682addSMBMemorySPD(structPtr);
683addSMBOemProcessorType(structPtr);
684addSMBOemProcessorBusSpeed(structPtr);
685
686addSMBEndOfTable(structPtr);
687}
688
689void setupSMBIOSTable(void)
690{
691SMBStructPtrs *structPtr;
692uint8_t *buffer;
693bool setSMB = true;
694
695if (!origeps)
696return;
697
698neweps = origeps;
699
700structPtr = (SMBStructPtrs *)malloc(sizeof(SMBStructPtrs));
701if (!structPtr)
702return;
703
704buffer = malloc(SMB_ALLOC_SIZE);
705if (!buffer)
706return;
707
708bzero(buffer, SMB_ALLOC_SIZE);
709structPtr->new = (SMBStructHeader *)buffer;
710
711getBoolForKey(kSMBIOSdefaults, &setSMB, &bootInfo->bootConfig);
712if (setSMB)
713setDefaultSMBData();
714
715setupNewSMBIOSTable(origeps, structPtr);
716
717neweps = (SMBEntryPoint *)AllocateKernelMemory(sizeof(SMBEntryPoint));
718if (!neweps)
719return;
720bzero(neweps, sizeof(SMBEntryPoint));
721
722neweps->anchor[0]= '_';
723neweps->anchor[1]= 'S';
724neweps->anchor[2]= 'M';
725neweps->anchor[3]= '_';
726neweps->entryPointLength= sizeof(SMBEntryPoint);
727neweps->majorVersion= 2;
728neweps->minorVersion= 4;
729neweps->maxStructureSize= maxStructSize;
730neweps->entryPointRevision= 0;
731
732neweps->dmi.anchor[0]= '_';
733neweps->dmi.anchor[1]= 'D';
734neweps->dmi.anchor[2]= 'M';
735neweps->dmi.anchor[3]= 'I';
736neweps->dmi.anchor[4]= '_';
737neweps->dmi.tableLength= tableLength;
738neweps->dmi.tableAddress= AllocateKernelMemory(tableLength);
739neweps->dmi.structureCount= structureCount;
740neweps->dmi.bcdRevision= 0x24;
741
742if (!neweps->dmi.tableAddress)
743return;
744
745memcpy((void *)neweps->dmi.tableAddress, buffer, tableLength);
746
747neweps->dmi.checksum= 0;
748neweps->dmi.checksum= 0x100 - checksum8(&neweps->dmi, sizeof(DMIEntryPoint));
749
750neweps->checksum= 0;
751neweps->checksum= 0x100 - checksum8(neweps, sizeof(SMBEntryPoint));
752
753free(buffer);
754decodeSMBIOSTable(neweps);
755}
756
757void *getSmbios(int which)
758{
759switch (which)
760{
761case SMBIOS_ORIGINAL:
762if (!origeps)
763origeps = getAddressOfSmbiosTable();
764return origeps;
765case SMBIOS_PATCHED:
766return neweps;
767}
768
769return 0;
770}
771
772/* Collect any information needed later */
773void readSMBIOSInfo(SMBEntryPoint *eps)
774{
775uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
776SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
777
778int dimmnbr = 0;
779Platform.DMI.MaxMemorySlots= 0;
780Platform.DMI.CntMemorySlots= 0;
781Platform.DMI.MemoryModules= 0;
782
783for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
784{
785switch (structHeader->type)
786{
787case kSMBTypeSystemInformation:
788Platform.UUID = ((SMBSystemInformation *)structHeader)->uuid;
789break;
790
791case kSMBTypePhysicalMemoryArray:
792Platform.DMI.MaxMemorySlots += ((SMBPhysicalMemoryArray *)structHeader)->numMemoryDevices;
793break;
794
795case kSMBTypeMemoryDevice:
796Platform.DMI.CntMemorySlots++;
797if (((SMBMemoryDevice *)structHeader)->memorySize != 0)
798Platform.DMI.MemoryModules++;
799if (((SMBMemoryDevice *)structHeader)->memorySpeed > 0)
800Platform.RAM.DIMM[dimmnbr].Frequency = ((SMBMemoryDevice *)structHeader)->memorySpeed;
801dimmnbr++;
802break;
803}
804
805structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
806for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
807
808if (((uint16_t *)structPtr)[0] == 0)
809structPtr += 2;
810
811structHeader = (SMBStructHeader *)structPtr;
812}
813}
814
815

Archive Download this file

Revision: 307