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

Archive Download this file

Revision: 789