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

Archive Download this file

Revision: 2006