Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/libsaio/smbios_decode.c

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

Archive Download this file

Revision: 296