Chameleon

Chameleon Svn Source Tree

Root/branches/ErmaC/Enoch/i386/libsaio/smbios.c

1/*
2 * SMBIOS Table Patcher, part of the Chameleon Boot Loader Project
3 *
4 * Copyright 2010 by Islam M. Ahmed Zaid. All rights reserved.
5 *
6 */
7
8
9#include "boot.h"
10#include "bootstruct.h"
11#include "smbios_getters.h"
12// Bungo
13#include "convert.h"
14
15#ifndef DEBUG_SMBIOS
16#define DEBUG_SMBIOS 0
17#endif
18
19#if DEBUG_SMBIOS
20#define DBG(x...)printf(x)
21#else
22#define DBG(x...)msglog(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
34/* =======================
35 BIOS Information (Type 0)
36 ========================= */
37#define kSMBBIOSInformationVendorKey "SMbiosvendor" // Apple Inc.
38#define kSMBBIOSInformationVersionKey "SMbiosversion" // MP31.88Z.006C.B05.0802291410
39#define kSMBBIOSInformationReleaseDateKey "SMbiosdate" // 02/29/08
40// Bungo
41#define kSMBBIOSInformationReleaseKey "SMbiosrelease" // BIOS Revision
42// example: BIOS Revision: 1.23 --> 2 bytes: Major=0x01, Minor=0x17 --> after swap: 0x1701hex = 5889dec (SMBIOS_spec_DSP0134_2.7.1)
43
44/* =========================
45 System Information (Type 1)
46 =========================== */
47#define kSMBSystemInformationManufacturerKey "SMmanufacturer" // Apple Inc.
48#define kSMBSystemInformationProductNameKey "SMproductname" // MacPro3,1
49#define kSMBSystemInformationVersionKey "SMsystemversion" // 1.0
50#define kSMBSystemInformationSerialNumberKey "SMserial" // Serial number
51//Bungo
52#define kSMBSystemInformationUUIDKey "SMsystemuuid" // ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s\n", line[4]); }'
53#define kSMBSystemInformationSKUNumberKey "SMskunumber" // System SKU#
54
55#define kSMBSystemInformationFamilyKey "SMfamily" // MacPro
56
57/* =========================================
58 Base Board (or Module) Information (Type 2)
59 =========================================== */
60#define kSMBBaseBoardManufacturerKey "SMboardmanufacturer" // Apple Inc.
61#define kSMBBaseBoardProductKey "SMboardproduct" // Mac-F2268DC8
62// Bungo
63#define kSMBBaseBoardVersionKey "SMboardversion" // MacPro3,1
64#define kSMBBaseBoardSerialNumberKey "SMboardserial" // C02140302D5DMT31M
65#define kSMBBaseBoardAssetTagKey "SMboardassettag" // Base Board Asset Tag# Bungo: renamed folowing convention
66#define kSMBBaseBoardLocationInChassisKey "SMboardlocation" // Part Component
67
68// ErmaC BoardType 0x0a(10) or 0x0b(11) MacPro Family
69#define kSMBBaseBoardTypeKey "SMboardtype" // 10 (Motherboard) all model, 11 (Processor+Memory Module) MacPro
70
71// Bungo
72/* =======================
73 System Enclosure (Type 3)
74 ========================= */
75#define kSMBSystemEnclosureManufacturerKey "SMchassismanufacturer" // Apple Inc.
76#define kSMBSystemEnclosureTypeKey "SMchassistype" // 7 Desktop
77#define kSMBSystemEnclosureVersionKey "SMchassisversion" // Mac-F42C88C8
78#define kSMBSystemEnclosureSerialNumberKey "SMchassisserial" // Serial number
79#define kSMBSystemEnclosureAssetTagKey "SMchassisassettag" // Pro-Enclosure Bungo: renamed folowing convention
80
81/* ============================
82 Processor Information (Type 4)
83 ============================== */
84// Bungo
85#define kSMBProcessorInformationSocketKey "SMcpusocket"
86#define kSMBProcessorInformationManufacturerKey "SMcpumanufacturer"
87#define kSMBProcessorInformationVersionKey "SMcpuversion"
88//
89#define kSMBProcessorInformationExternalClockKey"SMexternalclock"
90#define kSMBProcessorInformationMaximumClockKey"SMmaximalclock"
91// Bungo
92#define kSMBProcessorInformationCurrentClockKey "SMcurrentclock"
93#define kSMBProcessorInformationUpgradeKey "SMcpuupgrade"
94#define kSMBProcessorInformationSerialNumberKey "SMcpuserial"
95#define kSMBProcessorInformationAssetTagKey "SMcpuassettag" // Bungo: renamed folowing convention
96#define kSMBProcessorInformationPartNumberKey "SMcpupartnumber"
97
98/* =====================
99 Memory Device (Type 17)
100 ======================= */
101#define kSMBMemoryDeviceDeviceLocatorKey "SMmemdevloc" //
102#define kSMBMemoryDeviceBankLocatorKey "SMmembankloc" //
103#define kSMBMemoryDeviceMemoryTypeKey "SMmemtype" //
104#define kSMBMemoryDeviceMemorySpeedKey "SMmemspeed" //
105#define kSMBMemoryDeviceManufacturerKey "SMmemmanufacturer" //
106#define kSMBMemoryDeviceSerialNumberKey "SMmemserial" //
107#define kSMBMemoryDevicePartNumberKey "SMmempart" //
108// Bungo:
109#define kSMBMemoryDeviceAssetTagKey "SMmemassettag" //
110
111/* ===========================================
112 Memory SPD Data (Apple Specific - Type 130)
113 ============================================= */
114
115/* ============================================
116 OEM Processor Type (Apple Specific - Type 131)
117 ============================================== */
118#define kSMBOemProcessorTypeKey "SMoemcputype" // Bungo: renamed from SMcputype
119
120/* =================================================
121 OEM Processor Bus Speed (Apple Specific - Type 132)
122 =================================================== */
123#define kSMBOemProcessorBusSpeedKey "SMoemcpubusspeed" // Bungo: renamed from SMbusspeed
124
125/* ==============================================
126 OEM Platform Feature (Apple Specific - Type 133)
127 ================================================ */
128//#define kSMBOemPlatformFeatureKey "SMoemplatformfeature"
129
130/* ==================================================*/
131#define getFieldOffset(struct, field)((uint8_t)(uint32_t)&(((struct *)0)->field))
132
133typedef struct
134{
135SMBStructHeader *orig;
136SMBStructHeader *new;
137} SMBStructPtrs;
138
139/* =======================
140 BIOS Information (Type 0)
141 ========================= */
142typedef struct
143{
144char *vendor;
145char *version;
146char *releaseDate;
147uint16_t release; // Bungo
148} defaultBIOSInfo_t;
149
150defaultBIOSInfo_t defaultBIOSInfo;
151
152/* =========================
153 System Information (Type 1)
154 =========================== */
155typedef struct
156{
157char *manufacturer;
158char *productName;
159char *version;
160char *serialNumber;
161char *skuNumber;// ErmaC
162char *family;
163} defaultSystemInfo_t;
164
165defaultSystemInfo_t defaultSystemInfo;
166
167/* =========================================
168 Base Board (or Module) Information (Type 2)
169 =========================================== */
170typedef struct
171{
172char *manufacturer;
173char *product;
174char *version;// Bungo
175char *serialNumber;// ErmaC
176char *assetTag;// ErmaC Bungo: renamed folowing convention
177char *locationInChassis;// ErmaC
178uint8_t boardType;// ErmaC
179} defaultBaseBoard_t;
180
181defaultBaseBoard_t defaultBaseBoard;
182
183// Bungo
184typedef struct {
185char*manufacturer;
186uint8_tchassisType;
187char*version;
188char*serialNumber;
189char*assetTag;
190char*skuNumber;
191} defaultChassis_t;
192
193defaultChassis_t defaultChassis;
194
195typedef struct
196{
197uint8_ttype;
198SMBValueTypevalueType;
199uint8_tfieldOffset;
200char*keyString;
201bool(*getSMBValue)(returnType *);
202char**defaultValue;
203} SMBValueSetter;
204
205SMBValueSetter SMBSetters[] =
206{
207/* =======================
208 BIOS Information (Type 0)
209 ========================= */
210{ kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, vendor),
211kSMBBIOSInformationVendorKey, NULL, &defaultBIOSInfo.vendor }, // SMbiosvendor - Apple Inc.
212
213{ kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, version),
214kSMBBIOSInformationVersionKey, NULL, &defaultBIOSInfo.version }, // SMbiosversion - MP31.88Z.006C.B05.0802291410
215
216{ kSMBTypeBIOSInformation, kSMBString, getFieldOffset(SMBBIOSInformation, releaseDate),
217kSMBBIOSInformationReleaseDateKey, NULL, &defaultBIOSInfo.releaseDate }, // SMbiosdate - 02/29/08
218
219// Bungo
220{ kSMBTypeBIOSInformation, kSMBWord, getFieldOffset(SMBBIOSInformation, releaseMajor),
221kSMBBIOSInformationReleaseKey, NULL,(char **)&defaultBIOSInfo.release }, // SMbiosrelease - 0.1 (256)
222
223/* =========================
224 System Information (Type 1)
225 =========================== */
226{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, manufacturer),
227kSMBSystemInformationManufacturerKey, NULL,&defaultSystemInfo.manufacturer}, // SMmanufacturer - Apple Inc.
228
229{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, productName),
230kSMBSystemInformationProductNameKey, NULL, &defaultSystemInfo.productName }, // SMproductname - MacPro3,1
231
232{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, version),
233kSMBSystemInformationVersionKey, NULL, &defaultSystemInfo.version }, // SMsystemversion - 1.0
234
235{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, serialNumber),
236kSMBSystemInformationSerialNumberKey, NULL, &defaultSystemInfo.serialNumber }, // SMserial - Serial number
237/* Bungo:
238{kSMBTypeSystemInformation,kSMBByte,getFieldOffset(SMBSystemInformation, uuid),
239kSMBSystemInformationUUIDKey, NULL, NULL}, // SMsystemuuid
240
241{kSMBTypeSystemInformation,kSMBByte,getFieldOffset(SMBSystemInformation, wakeupReason),
242NULL, NULL, NULL}, // reason for system wakeup
243*/
244
245// Bungo
246{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, skuNumber),
247kSMBSystemInformationSKUNumberKey, NULL, &defaultSystemInfo.skuNumber}, // SMskunumber - System SKU#
248
249{kSMBTypeSystemInformation,kSMBString,getFieldOffset(SMBSystemInformation, family),
250kSMBSystemInformationFamilyKey,NULL,&defaultSystemInfo.family}, // SMfamily - MacPro
251
252
253/* =========================================
254 Base Board (or Module) Information (Type 2)
255 =========================================== */
256{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, manufacturer),
257kSMBBaseBoardManufacturerKey, NULL, &defaultBaseBoard.manufacturer }, // SMboardmanufacturer - Apple Inc.
258
259{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, product),
260kSMBBaseBoardProductKey, NULL, &defaultBaseBoard.product }, // SMboardproduct - Mac-F2268DC8
261
262// Bungo
263{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, version),
264kSMBBaseBoardVersionKey, NULL, &defaultBaseBoard.version }, // SMboardversion - MacPro3,1
265
266{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, serialNumber),
267kSMBBaseBoardSerialNumberKey, NULL, &defaultBaseBoard.serialNumber }, // SMboardserial - C02140302D5DMT31M
268
269{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, assetTag),
270kSMBBaseBoardAssetTagKey, NULL, &defaultBaseBoard.assetTag }, // SMboardassetag - Base Board Asset Tag#
271
272{kSMBTypeBaseBoard,kSMBString,getFieldOffset(SMBBaseBoard, locationInChassis),
273kSMBBaseBoardLocationInChassisKey, NULL, &defaultBaseBoard.locationInChassis }, // SMboardlocation - Part Component
274
275{kSMBTypeBaseBoard,kSMBByte,getFieldOffset(SMBBaseBoard, boardType),
276kSMBBaseBoardTypeKey,NULL, (char **)&defaultBaseBoard.boardType }, // SMboardtype - 10 (Motherboard) all model, 11 (Processor+Memory Module) MacPro
277
278/*{kSMBTypeBaseBoard,kSMBByte, getFieldOffset(SMBBaseBoard, numberOfContainedHandles),
279NULL , NULL, NULL }, // numberOfContainedHandles = 0
280*/
281//
282
283// Bungo
284/* =======================
285 System Enclosure (Type 3)
286 ========================= */
287{kSMBTypeSystemEnclosure,kSMBString,getFieldOffset(SMBSystemEnclosure, manufacturer),
288kSMBSystemEnclosureManufacturerKey, NULL,&defaultChassis.manufacturer }, // SMchassismanufacturer - Apple Inc.
289
290{kSMBTypeSystemEnclosure, kSMBByte,getFieldOffset(SMBSystemEnclosure, chassisType),
291kSMBSystemEnclosureTypeKey, NULL, (char **)&defaultChassis.chassisType}, // SMchassistype - 7
292
293{kSMBTypeSystemEnclosure, kSMBString, getFieldOffset(SMBSystemEnclosure, version),
294kSMBSystemEnclosureVersionKey, NULL, &defaultChassis.version }, // SMchassisversion - Mac-F42C88C8
295
296{kSMBTypeSystemEnclosure, kSMBString, getFieldOffset(SMBSystemEnclosure, serialNumber),
297kSMBSystemEnclosureSerialNumberKey, NULL, &defaultChassis.serialNumber }, // SMchassisserial
298
299{kSMBTypeSystemEnclosure, kSMBString, getFieldOffset(SMBSystemEnclosure, assetTag),
300kSMBSystemEnclosureAssetTagKey, NULL, &defaultChassis.assetTag }, // SMchassisassettag - Pro Enclosure
301
302/*
303{kSMBTypeSystemEnclosure, kSMBString, getFieldOffset(SMBSystemEnclosure, skuNumber),
304NULL, NULL, &defaultChassis.skuNumber },
305*/
306
307/* ============================
308 Processor Information (Type 4)
309 ============================== */
310{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, socketDesignation),
311kSMBProcessorInformationSocketKey, NULL, NULL}, // SMcpusocket -
312
313{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, manufacturer),
314kSMBProcessorInformationManufacturerKey, NULL, NULL}, // SMcpumanufacturer - Intel(R) Corporation
315
316{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, processorVersion),
317kSMBProcessorInformationVersionKey, NULL, NULL}, // SMcpuversion
318
319{kSMBTypeProcessorInformation,kSMBWord, getFieldOffset(SMBProcessorInformation, externalClock),
320kSMBProcessorInformationExternalClockKey, getProcessorInformationExternalClock,NULL}, // SMcpuexternalclock
321
322{kSMBTypeProcessorInformation,kSMBWord, getFieldOffset(SMBProcessorInformation, maximumClock),
323kSMBProcessorInformationMaximumClockKey, getProcessorInformationMaximumClock,NULL}, // SMcpumaximumclock
324// Bungo
325{kSMBTypeProcessorInformation,kSMBWord,getFieldOffset(SMBProcessorInformation, currentClock),
326kSMBProcessorInformationCurrentClockKey, NULL, NULL}, // SMcpucurrentclock
327
328{kSMBTypeProcessorInformation,kSMBByte,getFieldOffset(SMBProcessorInformation, processorUpgrade),
329kSMBProcessorInformationUpgradeKey, NULL, NULL}, // SMcpuupgrade
330//
331{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, serialNumber),
332kSMBProcessorInformationSerialNumberKey, NULL, NULL},
333
334// Bungo
335{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, assetTag),
336kSMBProcessorInformationAssetTagKey, NULL, NULL}, // SMcpuassettag
337//
338{kSMBTypeProcessorInformation,kSMBString,getFieldOffset(SMBProcessorInformation, partNumber),
339kSMBProcessorInformationPartNumberKey, NULL, NULL},
340
341/* =====================
342 Memory Device (Type 17)
343 ======================= */
344{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, deviceLocator),
345kSMBMemoryDeviceDeviceLocatorKey, NULL, NULL},
346
347{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, bankLocator),
348kSMBMemoryDeviceBankLocatorKey, NULL, NULL},
349
350{kSMBTypeMemoryDevice,kSMBByte,getFieldOffset(SMBMemoryDevice, memoryType),
351kSMBMemoryDeviceMemoryTypeKey, getSMBMemoryDeviceMemoryType,NULL},
352
353{kSMBTypeMemoryDevice,kSMBWord,getFieldOffset(SMBMemoryDevice, memorySpeed),
354kSMBMemoryDeviceMemorySpeedKey, getSMBMemoryDeviceMemorySpeed,NULL},
355
356{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, manufacturer),
357kSMBMemoryDeviceManufacturerKey, getSMBMemoryDeviceManufacturer, NULL},
358
359{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, serialNumber),
360kSMBMemoryDeviceSerialNumberKey, getSMBMemoryDeviceSerialNumber, NULL},
361
362{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, assetTag),
363kSMBMemoryDeviceAssetTagKey, NULL, NULL},
364
365{kSMBTypeMemoryDevice,kSMBWord,getFieldOffset(SMBMemoryDevice, errorHandle),
366NULL, getSMBMemoryDeviceMemoryErrorHandle, NULL},
367
368{kSMBTypeMemoryDevice,kSMBString,getFieldOffset(SMBMemoryDevice, partNumber),
369kSMBMemoryDevicePartNumberKey, getSMBMemoryDevicePartNumber, NULL},
370
371//-------------------------------------------------------------------------------------------------------------------------
372// Apple Specific
373//-------------------------------------------------------------------------------------------------------------------------
374// OEM Processor Type (Apple Specific - Type 131)
375{kSMBTypeOemProcessorType,kSMBWord,getFieldOffset(SMBOemProcessorType, ProcessorType),kSMBOemProcessorTypeKey,
376getSMBOemProcessorType,NULL},
377
378// OEM Processor Bus Speed (Apple Specific - Type 132)
379{kSMBTypeOemProcessorBusSpeed,kSMBWord,getFieldOffset(SMBOemProcessorBusSpeed, ProcessorBusSpeed),kSMBOemProcessorBusSpeedKey,
380getSMBOemProcessorBusSpeed,NULL}
381
382// OEM Platform Feature (Apple Specific - Type 133)
383/*
384{kSMBTypeOemPlatformFeature,kSMBWord,getFieldOffset(SMBOemPlatformFeature, PlatformFeature),kSMBOemPlatformFeatureKey,
385getSMBOemPlatformFeature,NULL}
386*/
387};
388
389int numOfSetters = sizeof(SMBSetters) / sizeof(SMBValueSetter);
390
391
392SMBEntryPoint *origeps= 0;
393SMBEntryPoint *neweps= 0;
394
395static uint8_t stringIndex;// increament when a string is added and set the field value accordingly
396static uint8_t stringsSize;// add string size
397
398static SMBWord tableLength= 0;
399static SMBWord handle= 0;
400static SMBWord maxStructSize= 0;
401static SMBWord structureCount= 0;
402
403//-------------------------------------------------------------------------------------------------------------------------
404// Default SMBIOS Data
405//-------------------------------------------------------------------------------------------------------------------------
406/* Rewrite: use a struct */
407
408// Bungo: suggest to not mixing data from different Mac models, use real Mac SMBIOS dumps
409
410#define kDefaultVendorManufacturer"Apple Inc."
411//#define kDefaultBIOSReleaseDate"11/06/2009"
412#define kDefaultSerialNumber"SOMESRLNMBR"
413//Bungo
414#define kDefaultSkuNumber"Default SKU#"
415#define kDefaultAssetTag"Default Asset Tag#"
416//#define kDefaultBoardType"10" // 0xA
417//#define kDefaultBoardProcessorType"11" // 0xB
418#define kDefaultSystemVersion"1.0"
419#define kDefaultBIOSRelease256 // 256 = 0x0100 -> swap bytes: 0x0001 -> Release: 0.1 (see SMBIOS spec. table Type 0)
420//#define kDefaultLocatioInChassis"Part Component"
421//#define KDefaultBoardSerialNumber"C02140302D5DMT31M" // new C07019501PLDCVHAD - C02032101R5DC771H
422
423//=========== Mac mini ===========
424#define kDefaultMacMiniFamily"Napa Mac" // Macmini2,1 family = "Napa Mac" not "Mac mini"
425//#define kDefaultMacMiniBoardAssetTagNumber"Mini-Aluminum"
426
427#define kDefaultMacMini"Macmini2,1"
428#define kDefaultMacMiniBIOSVersion" MM21.88Z.009A.B00.0706281359"
429#define kDefaultMacMiniBIOSReleaseDate"06/28/07"
430#define kDefaultMacMiniBoardProduct"Mac-F4208EAA"
431
432// MacMini5,1 Mac-8ED6AF5B48C039E1 - MM51.88Z.0077.B0F.1110201309
433// MacMini5,2 Mac-4BC72D62AD45599E
434// MacMini5,3
435//#define kDefaultMacMini"Macmini5,3"
436//#define kDefaultMacMiniBIOSVersion" MM51.88Z.0077.B10.1201241549"
437//#define kDefaultMacMiniBoardProduct"Mac-F65AE981FFA204ED"
438//#define kDefaultMacMiniBIOSReleaseDate"01/24/2012"
439
440// MacMini 6,1 - Mac-F65AE981FFA204ED
441// MacMini 6,2
442//#define kDefaultMacMini62"Macmini6,2"
443//#define kDefaultMacMini62BIOSVersion" MM61.88Z.0106.B00.1208091121"
444//#define kDefaultMacMini62BoardProduct"Mac-F65AE981FFA204ED"
445//#define kDefaultMacMini62BIOSReleaseDate"10/14/2012"
446
447//=========== MacBook ===========
448#define kDefaultMacBookFamily"MacBook"
449//#define kDefaultMacBookBoardAssetTagNumber"MacBook-Black"
450
451#define kDefaultMacBook"MacBook4,1"
452#define kDefaultMacBookBIOSVersion" MB41.88Z.00C1.B00.0802091535"
453#define kDefaultMacBookBIOSReleaseDate"02/09/08"
454#define kDefaultMacBookBoardProduct"Mac-F22788A9"
455
456//=========== MacBookAir ===========
457#define kDefaultMacBookAirFamily"MacBook Air"
458
459// MacBookAir4,1 - Mac-C08A6BB70A942AC2
460// MacBookAir4,2 - Mac-742912EFDBEE19B3
461#define kDefaultMacBookAir"MacBookAir5,2"
462#define kDefaultMacBookAirBIOSVersion" MBA51.88Z.00EF.B00.1205221442"
463#define kDefaultMacBookAirBIOSReleaseDate"05/10/12"
464#define kDefaultMacBookBoardAirProduct"Mac-2E6FAB96566FE58C"
465
466// MacBookAir6,1 - Mac-35C1E88140C3E6CF - MBA61.88Z.0099.B04.1309271229
467// MacBookAir6,2 - Mac-7DF21CB3ED6977E5 - MBA62.88Z.00EF.B00.1205221442
468
469//=========== MacBookPro ===========
470#define kDefaultMacBookProFamily"MacBook Pro"
471//#define kDefaultMacBookProBoardAssetTagNumber"MacBook-Aluminum"
472
473#define kDefaultMacBookPro"MacBookPro4,1"
474#define kDefaultMacBookProBIOSVersion" MBP41.88Z.00C1.B03.0802271651"
475#define kDefaultMacBookProBIOSReleaseDate"02/27/08"
476#define kDefaultMacBookProBoardProduct"Mac-F42C89C8"
477
478//#define kDefaultMacBookPro"MacBookPro8,1"
479//#define kDefaultMacBookProBIOSVersion" MBP81.88Z.0047.B24.1110141131"
480//#define kDefaultMacBookProBoardProduct"Mac-94245B3640C91C81"
481//#define kDefaultMacBookProBIOSReleaseDate"10/14/11"
482
483// MacBookPro8,2 - Mac_94245A3940C91C80
484// MacBookPro8,3 - Mac-942459F5819B171B
485
486// MacBookPro10,2
487//#define kDefaultMacBookProIvy"MacBookPro10,2"
488//#define kDefaultMacBookProIvyBIOSVersion" MBP102.88Z.0106.B01.1208311637"
489//#define kDefaultMacBookProIvyBoardProduct"Mac-AFD8A9D944EA4843"
490//#define kDefaultMacBookProIvyBIOSReleaseDate"10/02/2012"
491
492// MacBookPro11,2 - Mac-3CBD00234E554E41 - MBP112.88Z.0138.B03.1310291227
493// MacBookPro11,3 - Mac-2BD1B31983FE1663 - MBP112.88Z.0138.B02.1310181745
494
495//=========== iMac ===========
496#define kDefaultiMacFamily"iMac"
497//#define kDefaultiMacBoardAssetTagNumber"iMac-Aluminum"
498
499#define kDefaultiMac"iMac8,1"
500#define kDefaultiMacBIOSVersion" IM81.88Z.00C1.B00.0903051113"
501#define kDefaultiMacBIOSReleaseDate"02/09/08"
502#define kDefaultiMacBoardProduct"Mac-F227BEC8"
503#define kDefaultMacFamily"Mac" // iMac8,1 family = "Mac" not "iMac"
504
505// iMac10,1
506// iMac11,1 core i3/i5/i7
507#define kDefaultiMacNehalem"iMac11,1"
508#define kDefaultiMacNehalemBIOSVersion" IM111.88Z.0034.B02.1003171314"
509#define kDefaultiMacNehalemBIOSReleaseDate"03/30/10"
510#define kDefaultiMacNehalemBoardProduct"Mac-F2268DAE"
511// iMac11,2
512// iMac11,3
513
514// iMac12,1
515#define kDefaultiMacSandy"iMac12,1"
516#define kDefaultiMacSandyBIOSVersion" IM121.88Z.0047.B00.1102091756"
517#define kDefaultiMacSandyBIOSReleaseDate"01/02/08"
518#define kDefaultiMacSandyBoardProduct"Mac-942B5BF58194151B"
519
520// iMac12,2 Mac-942B59F58194171B
521//#define kDefaultiMacSandy"iMac12,2"
522//#define kDefaultiMacSandyBIOSVersion" IM121.88Z.0047.B1D.1110171110"
523//#define kDefaultiMacSandyBIOSReleaseDate"10/17/11"
524//#define kDefaultiMacSandyBoardProduct"Mac-942B59F58194171B"
525
526// iMac13,1
527// Bios: IM131.88Z.010A.B05.1211151146
528// Data: 11/15/2012
529// Board: Mac-00BE6ED71E35EB86
530
531// iMac13,2
532//#define kDefaultiMacIvy"iMac13,2"
533//#define kDefaultiMacIvyBIOSVersion" IM131.88Z.00CE.B00.1203281326"
534//#define kDefaultiMacIvyBIOSReleaseDate"03/28/2012"
535//#define kDefaultiMacIvyBoardProduct"Mac-FC02E91DDD3FA6A4"
536
537//=========== MacPro ===========
538#define kDefaultMacProFamily"MacPro" // MacPro's family = "MacPro" not "Mac Pro"
539//#define KDefauktMacProBoardAssetTagNumber"Pro-Enclosure"
540//#define kDefaultMacProBoardType"0xB" // 11
541
542#define kDefaultMacPro"MacPro3,1"
543#define kDefaultMacProBIOSVersion" MP31.88Z.006C.B05.0903051113"
544#define kDefaultMacProBIOSReleaseDate"08/03/2010"
545//#define kDefaultMacProSystemVersion"1.3"
546#define kDefaultMacProBoardProduct"Mac-F42C88C8"
547//#define KDefaultMacProBoardSerialNumber"J593902RA4MFE"
548
549// Mac Pro 4,1 core i7/Xeon
550#define kDefaultMacProNahWestSystemVersion"0.0"
551
552#define kDefaultMacProNehalem"MacPro4,1"
553#define kDefaultMacProNehalemBIOSVersion" MP41.88Z.0081.B07.0910130729"
554#define kDefaultMacProNehalemBIOSReleaseDate"10/13/09"
555//#define kDefaultMacProNehalemSystemVersion"1.4"
556#define kDefaultMacProNehalemBoardProduct"Mac-F221BEC8"
557//#define KDefaultMacProNehalemBoardSerialNumber"J593004RB1LUE"
558//"J591302R61LUC " // 2-cpu board
559//"J591002JV4MFB " // 1-cpu board
560
561// Mac Pro 5,1 core i7/Xeon
562#define kDefaultMacProWestmere"MacPro5,1"
563#define kDefaultMacProWestmereBIOSVersion" MP51.88Z.007F.B03.1010071432"
564#define kDefaultMacProWestmereBIOSReleaseDate"10/07/10"
565//#define kDefaultMacProWestmereSystemVersion"1.2"
566#define kDefaultMacProWestmereBoardProduct"Mac-F221BEC8"
567//#define KDefaultMacProWestmereBoardSerialNumber"J522700H7BH8C"
568//"J503104H1BH8A " // 2-cpu board
569
570// Mac Pro 6,1
571#define kDefaultMacProHaswell"MacPro6,1"
572#define kDefaultMacProHaswellBIOSVersion"MP61.88Z.0116.B04.1312061508"
573#define kDefaultMacProHaswellBIOSReleaseDate"12/06/2013"
574//#define kDefaultMacProHaswellSystemVersion"1.?"
575#define kDefaultMacProHaswellBoardProduct"Mac-F60DEB81FF30ACF6"
576//#define KDefaultMacProHaswellBoardSerialNumber"F5K3474008JFNN215"
577
578//#define KDefaultBoardSerialNumber"C02140302D5DMT31M"
579// "C07019501PLDCVHAD"
580// "C02032101R5DC771H"
581
582// J593902RA4MFE 3,1
583// J5031046RCZJA 5,1
584// J521101A5CZJC 3,1
585// J593004RB1LUE MacPro4,1
586// J513401PZBH8C 5,1
587// J590802LC4ACB 3,1
588// J594900AH1LUE 4,1
589// J512500HZBH8C 5,1
590// J522700H7BH8C MacPro5,1
591
592/* ============================================ */
593
594bool useSMBIOSdefaults = true; // Bungo
595
596SMBByte PlatformType= 1; // Bungo: same as Platfom.Type in platform.h. Because can't get from ACPI FADT PM profile and platformCPUFeature(CPU_FEATURE_MOBILE)) doesn't work as expect, FIXING NEEDED.
597
598/* Rewrite this function */
599void setDefaultSMBData(void) // Bungo: setting data from real Macs
600{
601defaultBIOSInfo.vendor = kDefaultVendorManufacturer;
602defaultBIOSInfo.release = kDefaultBIOSRelease; // Bungo
603
604defaultSystemInfo.manufacturer = kDefaultVendorManufacturer;
605defaultSystemInfo.version = kDefaultSystemVersion;
606defaultSystemInfo.serialNumber = kDefaultSerialNumber;
607defaultSystemInfo.skuNumber = kDefaultSkuNumber; // Bungo
608
609defaultBaseBoard.manufacturer = kDefaultVendorManufacturer;
610defaultBaseBoard.serialNumber = kDefaultSerialNumber;
611defaultBaseBoard.assetTag = kDefaultAssetTag;
612
613defaultChassis.manufacturer = kDefaultVendorManufacturer;
614defaultChassis.serialNumber = kDefaultSerialNumber;
615defaultChassis.assetTag = kDefaultAssetTag;
616defaultChassis.skuNumber = kDefaultSkuNumber;
617
618// if (platformCPUFeature(CPU_FEATURE_MOBILE)) Bungo: doesn't recognise correctly, need fixing
619if (PlatformType == 2) // this works but it's a substitute
620{
621if (Platform.CPU.NoCores > 1)
622{
623defaultSystemInfo.productName = kDefaultMacBookPro;
624defaultBIOSInfo.version = kDefaultMacBookProBIOSVersion;
625defaultBIOSInfo.releaseDate = kDefaultMacBookProBIOSReleaseDate;
626defaultSystemInfo.family = kDefaultMacBookProFamily;
627defaultBaseBoard.product = kDefaultMacBookProBoardProduct;
628defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
629defaultChassis.chassisType = kSMBchassisUnknown;
630} else {
631defaultSystemInfo.productName = kDefaultMacBook;
632defaultBIOSInfo.version = kDefaultMacBookBIOSVersion;
633defaultBIOSInfo.releaseDate = kDefaultMacBookBIOSReleaseDate;
634defaultSystemInfo.family = kDefaultMacBookFamily;
635defaultBaseBoard.product = kDefaultMacBookBoardProduct;
636defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
637defaultChassis.chassisType = kSMBchassisUnknown;
638}
639} else {
640switch (Platform.CPU.NoCores)
641{
642case 1:
643defaultBIOSInfo.version = kDefaultMacMiniBIOSVersion;
644defaultBIOSInfo.releaseDate = kDefaultMacMiniBIOSReleaseDate;
645defaultSystemInfo.productName = kDefaultMacMini;
646defaultSystemInfo.family = kDefaultMacMiniFamily;
647defaultBaseBoard.product = kDefaultMacMiniBoardProduct;
648defaultBaseBoard.boardType = kSMBBaseBoardUnknown;
649defaultChassis.chassisType = kSMBchassisLPDesktop;
650break;
651
652case 2:
653defaultBIOSInfo.version = kDefaultiMacBIOSVersion;
654defaultBIOSInfo.releaseDate = kDefaultiMacBIOSReleaseDate;
655defaultSystemInfo.productName = kDefaultiMac;
656defaultSystemInfo.family = kDefaultMacFamily; // iMac8,1 family = Mac
657defaultBaseBoard.product = kDefaultiMacBoardProduct;
658defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
659defaultChassis.chassisType = kSMBchassisAllInOne;
660break;
661default:
662{
663switch (Platform.CPU.Family)
664{
665case 0x06:
666{
667switch (Platform.CPU.Model)
668{
669case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
670case CPU_MODEL_DALES:
671case CPU_MODEL_DALES_32NM:// Intel Core i3, i5 LGA1156 (32nm)
672defaultBIOSInfo.version= kDefaultiMacNehalemBIOSVersion;
673defaultBIOSInfo.releaseDate= kDefaultiMacNehalemBIOSReleaseDate;
674defaultSystemInfo.productName= kDefaultiMacNehalem;
675defaultSystemInfo.family= kDefaultiMacFamily;
676defaultBaseBoard.product = kDefaultiMacNehalemBoardProduct;
677defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
678defaultChassis.chassisType = kSMBchassisAllInOne;
679break;
680
681case CPU_MODEL_SANDYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (32nm)
682case CPU_MODEL_IVYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (22nm)
683case CPU_MODEL_IVYBRIDGE_XEON:
684defaultBIOSInfo.version = kDefaultiMacSandyBIOSVersion;
685defaultBIOSInfo.releaseDate = kDefaultiMacSandyBIOSReleaseDate;
686defaultSystemInfo.productName= kDefaultiMacSandy;
687defaultSystemInfo.family = kDefaultiMacFamily;
688defaultBaseBoard.product = kDefaultiMacSandyBoardProduct;
689defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
690defaultChassis.chassisType = kSMBchassisAllInOne;
691break;
692
693case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
694case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
695defaultBIOSInfo.version= kDefaultMacProNehalemBIOSVersion;
696defaultBIOSInfo.releaseDate= kDefaultMacProNehalemBIOSReleaseDate;
697defaultSystemInfo.productName= kDefaultMacProNehalem;
698defaultSystemInfo.version = kDefaultMacProNahWestSystemVersion;
699defaultSystemInfo.family= kDefaultMacProFamily;
700defaultBaseBoard.product = kDefaultMacProNehalemBoardProduct;
701defaultBaseBoard.boardType = kSMBBaseBoardProcessorMemoryModule;
702defaultChassis.chassisType = kSMBchassisTower;
703break;
704
705case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
706case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
707case CPU_MODEL_JAKETOWN:// Intel Core i7, Xeon E5 LGA2011 (32nm)
708defaultBIOSInfo.version= kDefaultMacProWestmereBIOSVersion;
709defaultBIOSInfo.releaseDate= kDefaultMacProWestmereBIOSReleaseDate;
710defaultSystemInfo.productName= kDefaultMacProWestmere;
711defaultSystemInfo.version = kDefaultMacProNahWestSystemVersion;
712defaultSystemInfo.family= kDefaultMacProFamily;
713defaultBaseBoard.product = kDefaultMacProWestmereBoardProduct;
714defaultBaseBoard.boardType = kSMBBaseBoardProcessorMemoryModule;
715defaultChassis.chassisType = kSMBchassisTower;
716break;
717
718default:
719defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
720defaultBIOSInfo.releaseDate= kDefaultMacProBIOSReleaseDate;
721defaultSystemInfo.productName= kDefaultMacPro;
722defaultSystemInfo.family= kDefaultMacProFamily;
723defaultBaseBoard.product = kDefaultMacProBoardProduct;
724defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
725defaultChassis.chassisType = kSMBchassisUnknown;
726break;
727}
728break;
729}
730default:
731defaultBIOSInfo.version= kDefaultMacProBIOSVersion;
732defaultBIOSInfo.releaseDate= kDefaultMacProBIOSReleaseDate;
733defaultSystemInfo.productName= kDefaultMacPro;
734defaultSystemInfo.family= kDefaultMacProFamily;
735defaultBaseBoard.product = kDefaultMacProBoardProduct;
736defaultBaseBoard.boardType = kSMBBaseBoardMotherboard;
737defaultChassis.chassisType = kSMBchassisUnknown;
738break;
739}
740break;
741}
742}
743}
744}
745
746/* Used for SM*n smbios.plist keys */
747bool getSMBValueForKey(SMBStructHeader *structHeader, const char *keyString, const char **string, returnType *value)
748{
749static int idx = -1;
750static int current = -1;
751int len;
752char key[24];
753
754if (current != structHeader->handle) {
755idx++;
756current = structHeader->handle;
757}
758
759sprintf(key, "%s%d", keyString, idx);
760
761if (value) {
762if (getIntForKey(key, (int *)&(value->dword), SMBPlist)) {
763return true;
764}
765} else {
766if (getValueForKey(key, string, &len, SMBPlist)) {
767return true;
768}
769}
770return false;
771}
772
773char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field)
774{
775uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
776
777if (!field) {
778return NULL;
779}
780
781for (field--; field != 0 && strlen((char *)stringPtr) > 0;
782field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
783
784return (char *)stringPtr;
785}
786
787void setSMBStringForField(SMBStructHeader *structHeader, const char *string, uint8_t *field)
788{
789int strSize;
790
791if (!field) {
792return;
793}
794
795if (!string) {
796*field = 0;
797return;
798}
799
800strSize = strlen(string);
801
802// remove any spaces found at the end but only in MemoryDevice
803if (structHeader->type == kSMBTypeMemoryDevice) {
804while ((strSize != 0) && (string[strSize - 1] == ' ')) {
805strSize--;
806}
807}
808
809if (strSize == 0) {
810*field = 0;
811return;
812}
813
814memcpy((uint8_t *)structHeader + structHeader->length + stringsSize, string, strSize);
815*field = stringIndex;
816
817stringIndex++;
818stringsSize += strSize + 1;
819}
820
821bool setSMBValue(SMBStructPtrs *structPtr, int idx, returnType *value)
822{
823const char *string = 0;
824int len;
825bool parsed;
826int val;
827
828if (numOfSetters <= idx) {
829return false;
830}
831
832switch (SMBSetters[idx].valueType) {
833case kSMBString:
834{
835if (SMBSetters[idx].keyString)
836{
837if (getValueForKey(SMBSetters[idx].keyString, &string, &len, SMBPlist))
838{
839break;
840} else {
841if (structPtr->orig->type == kSMBTypeMemoryDevice)// MemoryDevice only
842{
843if (getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, &string, NULL))
844{
845break;
846}
847}
848}
849
850}
851if (SMBSetters[idx].getSMBValue) {
852if (SMBSetters[idx].getSMBValue((returnType *)&string)) {
853break;
854}
855}
856// if ((SMBSetters[idx].defaultValue) && *(SMBSetters[idx].defaultValue)) Bungo
857if (useSMBIOSdefaults && SMBSetters[idx].defaultValue && *(SMBSetters[idx].defaultValue)) {
858string = *(SMBSetters[idx].defaultValue);
859break;
860}
861string = getSMBStringForField(structPtr->orig, *(uint8_t *)value);
862break;
863}
864case kSMBByte:
865case kSMBWord:
866case kSMBDWord:
867case kSMBQWord:
868if (SMBSetters[idx].keyString) {
869parsed = getIntForKey(SMBSetters[idx].keyString, &val, SMBPlist);
870if (!parsed)
871{
872if (structPtr->orig->type == kSMBTypeMemoryDevice) { // MemoryDevice only
873parsed = getSMBValueForKey(structPtr->orig, SMBSetters[idx].keyString, NULL, (returnType *)&val);
874}
875}
876if (parsed) {
877switch (SMBSetters[idx].valueType) {
878case kSMBByte:
879value->byte = (uint8_t)val;
880break;
881case kSMBWord:
882value->word = (uint16_t)val;
883break;
884case kSMBQWord:
885value->qword = (uint64_t)val;
886break;
887case kSMBDWord:
888default:
889value->dword = (uint32_t)val;
890break;
891}
892return true;
893}
894}
895
896if (SMBSetters[idx].getSMBValue) {
897if (SMBSetters[idx].getSMBValue(value)) {
898return true;
899}
900}
901// #if 0 Bungo: enables code below
902// if (*(SMBSetters[idx].defaultValue)) Bungo
903if (useSMBIOSdefaults && SMBSetters[idx].defaultValue && *(SMBSetters[idx].defaultValue)) {
904// value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue); Bungo
905switch (SMBSetters[idx].valueType) {
906case kSMBByte:
907value->byte = *(uint8_t *)(SMBSetters[idx].defaultValue);
908break;
909case kSMBWord:
910value->word = *(uint16_t *)(SMBSetters[idx].defaultValue);
911break;
912case kSMBQWord:
913value->qword = *(uint64_t *)(SMBSetters[idx].defaultValue);
914break;
915case kSMBDWord:
916default:
917value->dword = *(uint32_t *)(SMBSetters[idx].defaultValue);
918break;
919}
920return true;
921}
922// #endif Bungo
923break;
924}
925
926// if (SMBSetters[idx].valueType == kSMBString && string) Bungo: use null string too -> "Not Specified"
927if ((SMBSetters[idx].valueType == kSMBString) && string) {
928setSMBStringForField(structPtr->new, string, &value->byte);
929}
930return true;
931}
932
933//-------------------------------------------------------------------------------------------------------------------------
934// Apple Specific
935//-------------------------------------------------------------------------------------------------------------------------
936
937/* ===========================================
938 Firmware Volume (Apple Specific - Type 128)
939 ============================================= */
940void addSMBFirmwareVolume(SMBStructPtrs *structPtr)
941{
942return;
943}
944
945/* ===========================================
946 Memory SPD Data (Apple Specific - Type 130)
947 ============================================= */
948void addSMBMemorySPD(SMBStructPtrs *structPtr)
949{
950/* SPD data from Platform.RAM.spd */
951return;
952}
953
954/* ============================================
955 OEM Processor Type (Apple Specific - Type 131)
956 ============================================== */
957void addSMBOemProcessorType(SMBStructPtrs *structPtr)
958{
959SMBOemProcessorType *p = (SMBOemProcessorType *)structPtr->new;
960
961p->header.type= kSMBTypeOemProcessorType;
962p->header.length= sizeof(SMBOemProcessorType);
963p->header.handle= handle++;
964
965setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->ProcessorType));
966
967structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorType) + 2);
968tableLength += sizeof(SMBOemProcessorType) + 2;
969structureCount++;
970}
971
972/* =================================================
973 OEM Processor Bus Speed (Apple Specific - Type 132)
974 =================================================== */
975void addSMBOemProcessorBusSpeed(SMBStructPtrs *structPtr)
976{
977SMBOemProcessorBusSpeed *p = (SMBOemProcessorBusSpeed *)structPtr->new;
978
979switch (Platform.CPU.Family)
980{
981case 0x06:
982{
983switch (Platform.CPU.Model)
984{
985case 0x19:// Intel Core i5 650 @3.20 Ghz
986case CPU_MODEL_FIELDS:// Intel Core i5, i7, Xeon X34xx LGA1156 (45nm)
987case CPU_MODEL_DALES:
988case CPU_MODEL_DALES_32NM:// Intel Core i3, i5 LGA1156 (32nm)
989case CPU_MODEL_NEHALEM:// Intel Core i7, Xeon W35xx, Xeon X55xx, Xeon E55xx LGA1366 (45nm)
990case CPU_MODEL_NEHALEM_EX:// Intel Xeon X75xx, Xeon X65xx, Xeon E75xx, Xeon E65x
991case CPU_MODEL_WESTMERE:// Intel Core i7, Xeon X56xx, Xeon E56xx, Xeon W36xx LGA1366 (32nm) 6 Core
992case CPU_MODEL_WESTMERE_EX:// Intel Xeon E7
993case CPU_MODEL_SANDYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (32nm)
994case CPU_MODEL_IVYBRIDGE:// Intel Core i3, i5, i7 LGA1155 (22nm)
995case CPU_MODEL_IVYBRIDGE_XEON:
996case CPU_MODEL_JAKETOWN:// Intel Core i7, Xeon E5 LGA2011 (32nm)
997case CPU_MODEL_HASWELL:
998case CPU_MODEL_HASWELL_SVR:
999case CPU_MODEL_HASWELL_ULT:
1000case CPU_MODEL_CRYSTALWELL:
1001
1002break;
1003
1004default:
1005return;
1006}
1007}
1008}
1009
1010p->header.type= kSMBTypeOemProcessorBusSpeed;
1011p->header.length= sizeof(SMBOemProcessorBusSpeed);
1012p->header.handle= handle++;
1013
1014setSMBValue(structPtr, numOfSetters -1, (returnType *)&(p->ProcessorBusSpeed));
1015
1016structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemProcessorBusSpeed) + 2);
1017tableLength += sizeof(SMBOemProcessorBusSpeed) + 2;
1018structureCount++;
1019}
1020
1021/* ==============================================
1022 OEM Platform Feature (Apple Specific - Type 133)
1023 ================================================ */
1024 /*void addSMBOemPlatformFeature(SMBStructPtrs *structPtr) {
1025SMBOemPlatformFeature *p = (SMBOemPlatformFeature *)structPtr->new;
1026
1027p->header.type= kSMBTypeOemPlatformFeature;
1028p->header.length= sizeof(SMBOemPlatformFeature);
1029p->header.handle= handle++;
1030
1031setSMBValue(structPtr, numOfSetters - 2 , (returnType *)&(p->PlatformFeature));
1032
1033structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBOemPPlatformFeature) + 2);
1034tableLength += sizeof(SMBOemPlatformFeature) + 2;
1035structureCount++;
1036 }*/
1037
1038//-------------------------------------------------------------------------------------------------------------------------
1039// EndOfTable
1040//-------------------------------------------------------------------------------------------------------------------------
1041void addSMBEndOfTable(SMBStructPtrs *structPtr)
1042{
1043structPtr->new->type= kSMBTypeEndOfTable;
1044structPtr->new->length= sizeof(SMBStructHeader);
1045structPtr->new->handle= handle++;
1046
1047structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + sizeof(SMBStructHeader) + 2);
1048tableLength += sizeof(SMBStructHeader) + 2;
1049structureCount++;
1050}
1051
1052void setSMBStruct(SMBStructPtrs *structPtr)
1053{
1054bool setterFound = false;
1055
1056uint8_t *ptr;
1057SMBWord structSize;
1058int i;
1059
1060/* Bungo: not needed because of tables lengths fix in next lines
1061// http://forge.voodooprojects.org/p/chameleon/issues/361/
1062bool forceFullMemInfo = false;
1063
1064if (structPtr->orig->type == kSMBTypeMemoryDevice) {
1065getBoolForKey(kMemFullInfo, &forceFullMemInfo, &bootInfo->chameleonConfig);
1066if (forceFullMemInfo) {
1067structPtr->orig->length = 27;
1068}
1069}*/
1070
1071stringIndex = 1;
1072stringsSize = 0;
1073
1074if (handle < structPtr->orig->handle) {
1075handle = structPtr->orig->handle;
1076}
1077// Bungo: fix unsuported tables lengths from original smbios: extend smaller or truncate bigger - we use SMBIOS rev. 2.4 like Apple uses
1078switch (structPtr->orig->type) {
1079case kSMBTypeBIOSInformation:
1080structSize = sizeof(SMBBIOSInformation);
1081break;
1082case kSMBTypeSystemInformation:
1083structSize = sizeof(SMBSystemInformation);
1084break;
1085case kSMBTypeBaseBoard:
1086structSize = sizeof(SMBBaseBoard);
1087break;
1088case kSMBTypeSystemEnclosure:
1089structSize = sizeof(SMBSystemEnclosure);
1090break;
1091case kSMBTypeProcessorInformation:
1092structSize = sizeof(SMBProcessorInformation);
1093break;
1094case kSMBTypeMemoryDevice:
1095structSize = sizeof(SMBMemoryDevice);
1096break;
1097default:
1098structSize = structPtr->orig->length; // doesn't change a length for unpatched
1099break;
1100}
1101
1102// memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
1103if (structPtr->orig->length <= structSize) {
1104memcpy((void *)structPtr->new, structPtr->orig, structPtr->orig->length);
1105} else {
1106memcpy((void *)structPtr->new, structPtr->orig, structSize);
1107}
1108
1109structPtr->new->length = structSize;
1110
1111for (i = 0; i < numOfSetters; i++) {
1112// Bungo:
1113//if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structPtr->orig->length)) {
1114if ((structPtr->orig->type == SMBSetters[i].type) && (SMBSetters[i].fieldOffset < structSize)) {
1115setterFound = true;
1116setSMBValue(structPtr, i, (returnType *)((uint8_t *)structPtr->new + SMBSetters[i].fieldOffset));
1117}
1118}
1119
1120if (setterFound) {
1121// Bungo:
1122// ptr = (uint8_t *)structPtr->new + structPtr->orig->length;
1123ptr = (uint8_t *)structPtr->new + structPtr->new->length;
1124for (; ((uint16_t *)ptr)[0] != 0; ptr++);
1125
1126if (((uint16_t *)ptr)[0] == 0) {
1127ptr += 2;
1128}
1129structSize = ptr - (uint8_t *)structPtr->new;
1130} else {
1131ptr = (uint8_t *)structPtr->orig + structPtr->orig->length;
1132for (; ((uint16_t *)ptr)[0] != 0; ptr++);
1133
1134if (((uint16_t *)ptr)[0] == 0) {
1135ptr += 2;
1136}
1137
1138structSize = ptr - (uint8_t *)structPtr->orig;
1139memcpy((void *)structPtr->new, structPtr->orig, structSize);
1140}
1141
1142structPtr->new = (SMBStructHeader *)((uint8_t *)structPtr->new + structSize);
1143
1144tableLength += structSize;
1145
1146if (structSize > maxStructSize) {
1147maxStructSize = structSize;
1148}
1149
1150structureCount++;
1151}
1152
1153void setupNewSMBIOSTable(SMBEntryPoint *eps, SMBStructPtrs *structPtr)
1154{
1155uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
1156structPtr->orig = (SMBStructHeader *)ptr;
1157
1158for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structPtr->orig + sizeof(SMBStructHeader)));) {
1159switch (structPtr->orig->type) {
1160/* Skip all Apple Specific Structures */
1161case kSMBTypeFirmwareVolume:
1162case kSMBTypeMemorySPD:
1163case kSMBTypeOemProcessorType:
1164case kSMBTypeOemProcessorBusSpeed:
1165/* And this one too, to be added at the end */
1166case kSMBTypeEndOfTable:
1167break;
1168
1169default:
1170{
1171/* Add */
1172setSMBStruct(structPtr);
1173break;
1174}
1175}
1176
1177ptr = (uint8_t *)((uint32_t)structPtr->orig + structPtr->orig->length);
1178for (; ((uint16_t *)ptr)[0] != 0; ptr++);
1179
1180if (((uint16_t *)ptr)[0] == 0) {
1181ptr += 2;
1182}
1183
1184structPtr->orig = (SMBStructHeader *)ptr;
1185}
1186
1187addSMBFirmwareVolume(structPtr);
1188addSMBMemorySPD(structPtr);
1189addSMBOemProcessorType(structPtr);
1190addSMBOemProcessorBusSpeed(structPtr);
1191
1192addSMBEndOfTable(structPtr);
1193}
1194
1195// Bungo: does fix system uuid in SMBIOS (and EFI) instead of in EFI only
1196uint8_t *FixSystemUUID()
1197{
1198uint8_t *ptr = (uint8_t *)neweps->dmi.tableAddress;
1199SMBStructHeader *structHeader = (SMBStructHeader *)ptr;
1200int i, isZero, isOnes;
1201uint8_t FixedUUID[UUID_LEN] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
1202const char *sysId = getStringForKey(kSMBSystemInformationUUIDKey, SMBPlist);
1203uint8_t *ret = (uint8_t *)getUUIDFromString(sysId);
1204
1205for (;(structHeader->type != kSMBTypeSystemInformation);) // find System Information Table (Type 1) in patched SMBIOS
1206{
1207ptr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
1208for (; ((uint16_t *)ptr)[0] != 0; ptr++);
1209
1210if (((uint16_t *)ptr)[0] == 0) {
1211ptr += 2;
1212}
1213
1214structHeader = (SMBStructHeader *)ptr;
1215}
1216
1217ptr = ((SMBSystemInformation *)structHeader)->uuid;
1218
1219if (!sysId || !ret) { // no or bad custom UUID,...
1220sysId = 0;
1221ret = Platform.UUID; // ...try bios dmi system uuid extraction
1222}
1223
1224for (i=0, isZero=1, isOnes=1; i<UUID_LEN; i++) // check if empty or setable, means: no uuid present
1225{
1226if (ret[i] != 0x00) {
1227isZero = 0;
1228}
1229
1230if (ret[i] != 0xff) {
1231isOnes = 0;
1232}
1233}
1234
1235if (isZero || isOnes) { // if empty or setable...
1236verbose("No UUID present in SMBIOS System Information Table\n");
1237ret = FixedUUID; // ...set a fixed value for system-id = 000102030405060708090A0B0C0D0E0F
1238}
1239
1240memcpy(ptr, ret, UUID_LEN); // fix uuid in the table
1241return ptr;
1242} // Bungo: end fix
1243
1244void setupSMBIOSTable(void)
1245{
1246SMBStructPtrs *structPtr;
1247uint8_t *buffer;
1248// bool setSMB = true; Bungo: now we use useSMBIOSdefaults
1249
1250if (!origeps) {
1251return;
1252}
1253
1254neweps = origeps;
1255
1256structPtr = (SMBStructPtrs *)malloc(sizeof(SMBStructPtrs));
1257if (!structPtr) {
1258return;
1259}
1260
1261buffer = (uint8_t *)malloc(SMB_ALLOC_SIZE);
1262if (!buffer) {
1263free(structPtr);
1264return;
1265}
1266
1267bzero(buffer, SMB_ALLOC_SIZE);
1268structPtr->new = (SMBStructHeader *)buffer;
1269
1270// getBoolForKey(kSMBIOSdefaults, &setSMB, &bootInfo->chameleonConfig); Bungo
1271getBoolForKey(kSMBIOSdefaults, &useSMBIOSdefaults, &bootInfo->chameleonConfig);
1272// if (setSMB) Bungo
1273setDefaultSMBData();
1274
1275setupNewSMBIOSTable(origeps, structPtr);
1276
1277neweps = (SMBEntryPoint *)AllocateKernelMemory(sizeof(SMBEntryPoint));
1278if (!neweps) {
1279free(buffer);
1280free(structPtr);
1281return;
1282}
1283bzero(neweps, sizeof(SMBEntryPoint));
1284
1285neweps->anchor[0]= '_';
1286neweps->anchor[1]= 'S';
1287neweps->anchor[2]= 'M';
1288neweps->anchor[3]= '_';
1289neweps->entryPointLength= sizeof(SMBEntryPoint);
1290neweps->majorVersion= 2; // Bungo:
1291neweps->minorVersion= 4; // Here we're using 2.4 SMBIOS rev. as real Macs
1292neweps->maxStructureSize= maxStructSize;
1293neweps->entryPointRevision= 0;
1294
1295neweps->dmi.anchor[0]= '_';
1296neweps->dmi.anchor[1]= 'D';
1297neweps->dmi.anchor[2]= 'M';
1298neweps->dmi.anchor[3]= 'I';
1299neweps->dmi.anchor[4]= '_';
1300neweps->dmi.tableLength= tableLength;
1301neweps->dmi.tableAddress= AllocateKernelMemory(tableLength);
1302neweps->dmi.structureCount= structureCount;
1303neweps->dmi.bcdRevision= 0x24; // ... and 2.4 DMI rev. as real Macs
1304
1305if (!neweps->dmi.tableAddress) {
1306free(buffer);
1307free(structPtr);
1308return;
1309}
1310
1311memcpy((void *)neweps->dmi.tableAddress, buffer, tableLength);
1312
1313Platform.UUID = FixSystemUUID(); // Bungo: fix System UUID
1314
1315neweps->dmi.checksum= 0;
1316neweps->dmi.checksum= 0x100 - checksum8(&neweps->dmi, sizeof(DMIEntryPoint));
1317
1318neweps->checksum= 0;
1319neweps->checksum= 0x100 - checksum8(neweps, sizeof(SMBEntryPoint));
1320
1321free(buffer);
1322free(structPtr);
1323
1324decodeSMBIOSTable(neweps);
1325
1326DBG("SMBIOS orig was = %x\n", origeps);
1327DBG("SMBIOS new is = %x\n", neweps);
1328}
1329
1330void *getSmbios(int which)
1331{
1332switch (which) {
1333case SMBIOS_ORIGINAL:
1334if (!origeps) {
1335origeps = getAddressOfSmbiosTable();
1336}
1337return origeps;
1338case SMBIOS_PATCHED:
1339return neweps;
1340}
1341
1342return 0;
1343}
1344
1345/* Collect any information needed later */
1346void readSMBIOSInfo(SMBEntryPoint *eps)
1347{
1348uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
1349SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
1350
1351int dimmnbr = 0;
1352Platform.DMI.MaxMemorySlots= 0;// number of memory slots polulated by SMBIOS
1353Platform.DMI.CntMemorySlots= 0;// number of memory slots counted
1354Platform.DMI.MemoryModules= 0;
1355
1356for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
1357{
1358switch (structHeader->type)
1359{
1360case kSMBTypeSystemInformation:
1361Platform.UUID = ((SMBSystemInformation *)structHeader)->uuid; // get factory system uuid
1362break;
1363
1364case kSMBTypeSystemEnclosure: // Bungo: determine platform type
1365switch (((SMBSystemEnclosure *)structHeader)->chassisType) {
1366case kSMBchassisDesktop:
1367case kSMBchassisLPDesktop:
1368case kSMBchassisAllInOne:
1369case kSMBchassisLunchBox:
1370PlatformType = 1; // desktop (iMac, MacMini)
1371break;
1372case kSMBchassisPortable:
1373case kSMBchassisLaptop:
1374case kSMBchassisNotebook:
1375case kSMBchassisHandHeld:
1376case kSMBchassisSubNotebook:
1377PlatformType = 2; // notebook (Mac Books)
1378 break;
1379default:
1380PlatformType = 3; // workstation (Mac Pro, Xserve)
1381break;
1382}
1383break;
1384//
1385case kSMBTypePhysicalMemoryArray:
1386Platform.DMI.MaxMemorySlots += ((SMBPhysicalMemoryArray *)structHeader)->numMemoryDevices;
1387break;
1388
1389case kSMBTypeMemoryDevice:
1390Platform.DMI.CntMemorySlots++;
1391if (((SMBMemoryDevice *)structHeader)->memorySize != 0){
1392Platform.DMI.MemoryModules++;
1393}
1394if (((SMBMemoryDevice *)structHeader)->memorySpeed > 0){
1395Platform.RAM.DIMM[dimmnbr].Frequency = ((SMBMemoryDevice *)structHeader)->memorySpeed;
1396}
1397dimmnbr++;
1398break;
1399default:
1400break;
1401}
1402
1403structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
1404for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
1405
1406if (((uint16_t *)structPtr)[0] == 0) {
1407structPtr += 2;
1408}
1409
1410structHeader = (SMBStructHeader *)structPtr;
1411}
1412}
1413

Archive Download this file

Revision: 2385