Chameleon Applications

Chameleon Applications Svn Source Tree

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

Source at commit 298 created 12 years 10 months ago.
By ifabio, Latest trunk. Also add the Azi modules (Nvidia,AMD,ATI,Intel), added strings into localizable.strings. preparing the "make dmg".
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: 298