Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 2225