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

Archive Download this file

Revision: 1595