Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/SMBiosGetters/smbios_decode.c

1/*
2 * A very simple SMBIOS Table decoder, part of the Chameleon Boot Loader Project
3 *
4 * Copyright 2010 by Islam M. Ahmed Zaid. All rights reserved.
5 *
6 */
7
8#include "libsaio.h"
9#include "mysmbios.h"
10
11#ifndef DEBUG_SMBIOS
12#define DEBUG_SMBIOS 0
13#endif
14
15#if DEBUG_SMBIOS
16#define DBG(x...)printf(x)
17#else
18#define DBG(x...)msglog(x)
19#endif
20
21
22static SMBWord minorVersion;
23
24static void decodeBIOSInformation(SMBBIOSInformation *structHeader);
25static void decodeSystemInformation(SMBSystemInformation *structHeader);
26static void decodeBaseBoard(SMBBaseBoard *structHeader);
27static void decodeSystemEnclosure(SMBSystemEnclosure *structHeader);
28static void decodeProcessorInformation(SMBProcessorInformation *structHeader);
29static void decodeMemoryDevice(SMBMemoryDevice *structHeader);
30static void decodeOemProcessorType(SMBOemProcessorType *structHeader);
31static void decodeOemProcessorBusSpeed(SMBOemProcessorBusSpeed *structHeader);
32
33static const char *
34SMBMemoryDeviceTypes[] =
35{
36 "RAM", /* 00h Undefined */
37 "RAM", /* 01h Other */
38 "RAM", /* 02h Unknown */
39 "DRAM", /* 03h DRAM */
40 "EDRAM", /* 04h EDRAM */
41 "VRAM", /* 05h VRAM */
42 "SRAM", /* 06h SRAM */
43 "RAM", /* 07h RAM */
44 "ROM", /* 08h ROM */
45 "FLASH", /* 09h FLASH */
46 "EEPROM", /* 0Ah EEPROM */
47 "FEPROM", /* 0Bh FEPROM */
48 "EPROM", /* 0Ch EPROM */
49 "CDRAM", /* 0Dh CDRAM */
50 "3DRAM", /* 0Eh 3DRAM */
51 "SDRAM", /* 0Fh SDRAM */
52 "SGRAM", /* 10h SGRAM */
53 "RDRAM", /* 11h RDRAM */
54 "DDR SDRAM", /* 12h DDR */
55 "DDR2 SDRAM", /* 13h DDR2 */
56 "DDR2 FB-DIMM", /* 14h DDR2 FB-DIMM */
57 "RAM",/* 15h unused */
58 "RAM",/* 16h unused */
59 "RAM",/* 17h unused */
60 "DDR3",/* 18h DDR3, chosen in [5776134] */
61};
62
63//-------------------------------------------------------------------------------------------------------------------------
64// BIOSInformation
65//-------------------------------------------------------------------------------------------------------------------------
66static void decodeBIOSInformation(SMBBIOSInformation *structHeader)
67{
68DBG("BIOSInformation:\n");
69DBG("\tvendor: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->vendor));
70DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
71DBG("\treleaseDate: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->releaseDate));
72DBG("\n");
73}
74
75//-------------------------------------------------------------------------------------------------------------------------
76// SystemInformation
77//-------------------------------------------------------------------------------------------------------------------------
78static void decodeSystemInformation(SMBSystemInformation *structHeader)
79{
80DBG("SystemInformation:\n");
81DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
82DBG("\tproductName: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->productName));
83DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
84DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
85
86if (minorVersion < 1 || structHeader->header.length < 25)
87return;
88uint8_t *uuid = structHeader->uuid;
89DBG("\tuuid: %02X%02X%02X%02X-%02X%02X-%02X%02X-%02x%02X-%02X%02X%02X%02X%02X%02X\n",
90uuid[0], uuid[1], uuid[2], uuid[3],
91uuid[4], uuid[5],
92uuid[6], uuid[7],
93uuid[8], uuid[9],
94uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
95DBG("\twakeupReason: 0x%x\n", structHeader->wakeupReason);
96
97if (minorVersion < 4 || structHeader->header.length < 27)
98return;
99DBG("\tskuNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->skuNumber));
100DBG("\tfamily: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->family));
101DBG("\n");
102}
103
104//-------------------------------------------------------------------------------------------------------------------------
105// BaseBoard
106//-------------------------------------------------------------------------------------------------------------------------
107static void decodeBaseBoard(SMBBaseBoard *structHeader)
108{
109DBG("BaseBoard:\n");
110DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
111DBG("\tproduct: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->product));
112DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
113DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
114DBG("\tassetTagNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber));
115DBG("\tlocationInChassis: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->locationInChassis));
116DBG("\tboardType: 0x%X\n", structHeader->boardType);
117DBG("\n");
118}
119
120//-------------------------------------------------------------------------------------------------------------------------
121// SystemEnclosure
122//-------------------------------------------------------------------------------------------------------------------------
123static void decodeSystemEnclosure(SMBSystemEnclosure *structHeader)
124{
125DBG("SystemEnclosure:\n");
126DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
127DBG("\ttype: %d\n", structHeader->type);
128DBG("\tversion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
129DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
130DBG("\tassetTagNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber));
131DBG("\n");
132}
133
134//-------------------------------------------------------------------------------------------------------------------------
135// ProcessorInformation
136//-------------------------------------------------------------------------------------------------------------------------
137static void decodeProcessorInformation(SMBProcessorInformation *structHeader)
138{
139DBG("ProcessorInformation:\n");
140DBG("\tsocketDesignation: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->socketDesignation));
141DBG("\tprocessorType: %d\n", structHeader->processorType);
142DBG("\tprocessorFamily: 0x%X\n", structHeader->processorFamily);
143DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
144DBG("\tprocessorID: 0x%llX\n", structHeader->processorID);
145DBG("\tprocessorVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->processorVersion));
146DBG("\texternalClock: %dMHz\n", structHeader->externalClock);
147DBG("\tmaximumClock: %dMHz\n", structHeader->maximumClock);
148DBG("\tcurrentClock: %dMHz\n", structHeader->currentClock);
149
150if (minorVersion < 3 || structHeader->header.length < 35)
151return;
152DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
153DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag));
154DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber));
155DBG("\n");
156}
157
158//-------------------------------------------------------------------------------------------------------------------------
159// MemoryDevice
160//-------------------------------------------------------------------------------------------------------------------------
161static void decodeMemoryDevice(SMBMemoryDevice *structHeader)
162{
163DBG("MemoryDevice:\n");
164DBG("\tdeviceLocator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->deviceLocator));
165DBG("\tbankLocator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->bankLocator));
166DBG("\tmemoryType: %s\n", SMBMemoryDeviceTypes[structHeader->memoryType]);
167
168if (minorVersion < 3 || structHeader->header.length < 27)
169return;
170DBG("\tmemorySpeed: %dMHz\n", structHeader->memorySpeed);
171DBG("\tmanufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
172DBG("\tserialNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
173DBG("\tassetTag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag));
174DBG("\tpartNumber: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber));
175DBG("\n");
176}
177
178//-------------------------------------------------------------------------------------------------------------------------
179// Apple Specific
180//-------------------------------------------------------------------------------------------------------------------------
181static void decodeOemProcessorType(SMBOemProcessorType *structHeader)
182{
183DBG("AppleProcessorType:\n");
184DBG("\tProcessorType: 0x%x\n", ((SMBOemProcessorType *)structHeader)->ProcessorType);
185DBG("\n");
186}
187
188static void decodeOemProcessorBusSpeed(SMBOemProcessorBusSpeed *structHeader)
189{
190DBG("AppleProcessorBusSpeed:\n");
191DBG("\tProcessorBusSpeed (QPI): %d.%dGT/s\n",
192((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 1000,
193(((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 100) % 10);
194DBG("\n");
195}
196//-------------------------------------------------------------------------------------------------------------------------
197
198
199void decodeSMBIOSTable(SMBEntryPoint *eps)
200{
201uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
202SMBStructHeader *structHeader = (SMBStructHeader *)ptr;
203
204minorVersion = eps->minorVersion;
205
206DBG("\n");
207for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
208{
209#if DEBUG_SMBIOS
210DBG("Type: %d, Length: %d, Handle: 0x%x\n",
211structHeader->type, structHeader->length, structHeader->handle);
212#endif
213switch (structHeader->type)
214{
215case kSMBTypeBIOSInformation:
216 {
217#if !DEBUG_SMBIOS
218 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
219 structHeader->type, structHeader->length, structHeader->handle);
220#endif
221decodeBIOSInformation((SMBBIOSInformation *)structHeader);
222break;
223 }
224case kSMBTypeSystemInformation:
225 {
226#if !DEBUG_SMBIOS
227 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
228 structHeader->type, structHeader->length, structHeader->handle);
229#endif
230decodeSystemInformation((SMBSystemInformation *)structHeader);
231break;
232 }
233case kSMBTypeBaseBoard:
234 {
235#if !DEBUG_SMBIOS
236 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
237 structHeader->type, structHeader->length, structHeader->handle);
238#endif
239decodeBaseBoard((SMBBaseBoard *)structHeader);
240break;
241 }
242case kSMBTypeSystemEnclosure:
243 {
244#if !DEBUG_SMBIOS
245 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
246 structHeader->type, structHeader->length, structHeader->handle);
247#endif
248decodeSystemEnclosure((SMBSystemEnclosure *)structHeader);
249break;
250 }
251case kSMBTypeProcessorInformation:
252 {
253#if !DEBUG_SMBIOS
254 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
255 structHeader->type, structHeader->length, structHeader->handle);
256#endif
257decodeProcessorInformation((SMBProcessorInformation *)structHeader);
258break;
259 }
260case kSMBTypeMemoryDevice:
261 {
262#if !DEBUG_SMBIOS
263 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
264 structHeader->type, structHeader->length, structHeader->handle);
265#endif
266decodeMemoryDevice((SMBMemoryDevice *)structHeader);
267break;
268
269/* Skip all Apple Specific Structures */
270case kSMBTypeFirmwareVolume:
271case kSMBTypeMemorySPD:
272break;
273 }
274case kSMBTypeOemProcessorType:
275 {
276#if !DEBUG_SMBIOS
277 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
278 structHeader->type, structHeader->length, structHeader->handle);
279#endif
280decodeOemProcessorType((SMBOemProcessorType *)structHeader);
281break;
282 }
283case kSMBTypeOemProcessorBusSpeed:
284 {
285#if !DEBUG_SMBIOS
286 DBG("Type: %d, Length: %d, Handle: 0x%x\n",
287 structHeader->type, structHeader->length, structHeader->handle);
288#endif
289if (((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed)
290decodeOemProcessorBusSpeed((SMBOemProcessorBusSpeed *)structHeader);
291break;
292 }
293case kSMBTypeEndOfTable:
294/* Skip, to be added at the end */
295break;
296
297default:
298break;
299}
300
301ptr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
302for (; ((uint16_t *)ptr)[0] != 0; ptr++);
303
304if (((uint16_t *)ptr)[0] == 0)
305ptr += 2;
306
307structHeader = (SMBStructHeader *)ptr;
308}
309DBG("\n");
310}
311
312

Archive Download this file

Revision: 1913