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