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

Archive Download this file

Revision: 1659