Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 1119