Chameleon

Chameleon Svn Source Tree

Root/trunk/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 SMBWord minorVersion;
22
23extern char *getSMBStringForField(SMBStructHeader *structHeader, uint8_t field);
24
25static const char *
26SMBMemoryDeviceTypes[] =
27{
28 "RAM", /* 00h Undefined */
29 "RAM", /* 01h Other */
30 "RAM", /* 02h Unknown */
31 "DRAM", /* 03h DRAM */
32 "EDRAM", /* 04h EDRAM */
33 "VRAM", /* 05h VRAM */
34 "SRAM", /* 06h SRAM */
35 "RAM", /* 07h RAM */
36 "ROM", /* 08h ROM */
37 "FLASH", /* 09h FLASH */
38 "EEPROM", /* 0Ah EEPROM */
39 "FEPROM", /* 0Bh FEPROM */
40 "EPROM", /* 0Ch EPROM */
41 "CDRAM", /* 0Dh CDRAM */
42 "3DRAM", /* 0Eh 3DRAM */
43 "SDRAM", /* 0Fh SDRAM */
44 "SGRAM", /* 10h SGRAM */
45 "RDRAM", /* 11h RDRAM */
46 "DDR SDRAM", /* 12h DDR */
47 "DDR2 SDRAM", /* 13h DDR2 */
48 "DDR2 FB-DIMM", /* 14h DDR2 FB-DIMM */
49 "RAM",/* 15h unused */
50 "RAM",/* 16h unused */
51 "RAM",/* 17h unused */
52 "DDR3",/* 18h DDR3, chosen in [5776134] */
53 "FBD2"/* 19h FBD2 */
54};
55
56static const int kSMBMemoryDeviceTypeCount = sizeof(SMBMemoryDeviceTypes) /
57 sizeof(SMBMemoryDeviceTypes[0]);
58
59//-------------------------------------------------------------------------------------------------------------------------
60// BIOS Information (Type 0)
61//-------------------------------------------------------------------------------------------------------------------------
62void decodeBIOSInformation(SMBBIOSInformation *structHeader)
63{
64DBG("BIOS Information:\n");
65DBG("\tVendor: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->vendor));
66DBG("\tVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
67// Address Segment
68DBG("\tRelease Date: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->releaseDate));
69// ROM Size
70//DBG("\tSupported BIOS functions: (0x%llX) %s\n", structHeader->characteristics, SMBBIOSInfoChar0[structHeader->characteristics]);
71// Major Release
72// Minor Release
73// Firmware Major Release
74// Firmware Minor Release
75//SMBByte characteristicsExt1;
76//SMBByte characteristicsExt2;
77DBG("\n");
78}
79
80//-------------------------------------------------------------------------------------------------------------------------
81// System Information (Type 1)
82//-------------------------------------------------------------------------------------------------------------------------
83void decodeSystemInformation(SMBSystemInformation *structHeader)
84{
85DBG("System Information:\n");
86DBG("\tManufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
87DBG("\tProduct Name: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->productName));
88DBG("\tVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
89DBG("\tSerial Number: ** PRIVATE **\n"); //%s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
90
91if (minorVersion < 1 || structHeader->header.length < 25)
92return;
93uint8_t *uuid = structHeader->uuid;
94if (uuid) {
95DBG("\tuuid: %02X%02X%02X%02X-%02X%02X-%02X%02X-%02x%02X-%02X%02X%02X%02X%02X%02X\n",
96uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
97uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
98}
99DBG("\tWake-up Type: 0x%x\n", structHeader->wakeupReason);
100
101if (minorVersion < 4 || structHeader->header.length < 27)
102return;
103DBG("\tSKU Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->skuNumber)); // System SKU#
104DBG("\tFamily: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->family));
105DBG("\n");
106}
107
108//-------------------------------------------------------------------------------------------------------------------------
109// Base Board (or Module) Information (Type 2)
110//-------------------------------------------------------------------------------------------------------------------------
111void decodeBaseBoard(SMBBaseBoard *structHeader)
112{
113DBG("Base Board Information:\n");
114DBG("\tManufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
115DBG("\tProduct Name: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->product));
116DBG("\tVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
117DBG("\tSerial Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
118DBG("\tAsset Tag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber));
119// Feature Flags (BYTE)
120DBG("\tLocation In Chassis: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->locationInChassis)); // Part Component
121// Chassis Handle (WORD)
122DBG("\tType: 0x%X\n", structHeader->boardType);
123// Number of Contained Object Handles (n) (BYTE)
124// Contained Object Handles n(WORDs)
125DBG("\n");
126}
127
128//-------------------------------------------------------------------------------------------------------------------------
129// System Enclosure or Chassis (Type 3)
130//-------------------------------------------------------------------------------------------------------------------------
131void decodeSystemEnclosure(SMBSystemEnclosure *structHeader)
132{
133DBG("Chassis Information:\n");
134DBG("\tManufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
135DBG("\tType: %d\n", structHeader->type);
136DBG("\tVersion: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->version));
137DBG("\tSerial Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
138DBG("\tAsset Tag Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTagNumber));
139// Boot-up State:
140// Power Supply State
141// Thermal State
142// Security Status:
143// OEM Information:
144// Height;
145// Cords;
146// ElementsCount;
147// ElementLen;
148// Elements[1]; // open array of ElementsCount*ElementLen BYTEs
149DBG("\n");
150}
151
152//-------------------------------------------------------------------------------------------------------------------------
153// Processor Information (Type 4)
154//-------------------------------------------------------------------------------------------------------------------------
155void decodeProcessorInformation(SMBProcessorInformation *structHeader)
156{
157DBG("Processor Information:\n");
158DBG("\tSocket Designation: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->socketDesignation));
159DBG("\tType: %d\n", structHeader->processorType);
160DBG("\tFamily: 0x%X\n", structHeader->processorFamily);
161DBG("\tManufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
162DBG("\tID: 0x%llX\n", structHeader->processorID);
163DBG("\tProcessor Version: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->processorVersion));
164//DBG("\tVoltage: 0.%xV\n", structHeader->voltage);
165DBG("\tExternal Clock: %dMHz\n", structHeader->externalClock);
166DBG("\tMaximum Clock: %dMHz\n", structHeader->maximumClock);
167DBG("\tCurrent Clock: %dMHz\n", structHeader->currentClock);
168
169if (minorVersion < 3 || structHeader->header.length < 35)
170return;
171DBG("\tSerial Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
172DBG("\tAsset Tag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag));
173DBG("\tPart Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber));
174//DBG("\tProcessor Family 2: %d\n", structHeader->processorFamily2);
175DBG("\n");
176}
177
178//-------------------------------------------------------------------------------------------------------------------------
179// Memory Module Information (Type 6)
180//-------------------------------------------------------------------------------------------------------------------------
181
182//-------------------------------------------------------------------------------------------------------------------------
183// OEM Strings (Type 11)
184//-------------------------------------------------------------------------------------------------------------------------
185
186
187//-------------------------------------------------------------------------------------------------------------------------
188// MemoryDevice (Type 17)
189//-------------------------------------------------------------------------------------------------------------------------
190void decodeMemoryDevice(SMBMemoryDevice *structHeader)
191{
192DBG("Memory Device:\n");
193DBG("\tDevice Locator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->deviceLocator));
194DBG("\tBank Locator: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->bankLocator));
195DBG("\tMemory Type: %s\n", SMBMemoryDeviceTypes[structHeader->memoryType]);
196
197if (minorVersion < 3 || structHeader->header.length < 27)
198return;
199DBG("\tSpeed: %d MHz\n", structHeader->memorySpeed);
200DBG("\tError Handle: %x\n", structHeader->errorHandle);
201DBG("\tManufacturer: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->manufacturer));
202DBG("\tSerial Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->serialNumber));
203DBG("\tAsset Tag: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->assetTag));
204DBG("\tPart Number: %s\n", getSMBStringForField((SMBStructHeader *)structHeader, structHeader->partNumber));
205DBG("\n");
206}
207
208//-------------------------------------------------------------------------------------------------------------------------
209// Apple Specific
210//-------------------------------------------------------------------------------------------------------------------------
211void decodeOemProcessorType(SMBOemProcessorType *structHeader)
212{
213DBG("AppleProcessorType:\n");
214DBG("\tProcessorType: 0x%x\n", ((SMBOemProcessorType *)structHeader)->ProcessorType);
215DBG("\n");
216}
217
218void decodeOemProcessorBusSpeed(SMBOemProcessorBusSpeed *structHeader)
219{
220DBG("AppleProcessorBusSpeed:\n");
221DBG("\tProcessorBusSpeed (QPI): %d.%dGT/s\n",
222((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 1000,
223(((SMBOemProcessorBusSpeed *)structHeader)->ProcessorBusSpeed / 100) % 10);
224DBG("\n");
225}
226//-------------------------------------------------------------------------------------------------------------------------
227
228
229void decodeSMBIOSTable(SMBEntryPoint *eps)
230{
231uint8_t *ptr = (uint8_t *)eps->dmi.tableAddress;
232SMBStructHeader *structHeader = (SMBStructHeader *)ptr;
233
234minorVersion = eps->minorVersion;
235
236DBG("\n");
237for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
238{
239DBG("Type: %d, Length: %d, Handle: 0x%x\n",
240structHeader->type, structHeader->length, structHeader->handle);
241
242switch (structHeader->type)
243{
244case kSMBTypeBIOSInformation: // Type 0
245decodeBIOSInformation((SMBBIOSInformation *)structHeader);
246break;
247
248case kSMBTypeSystemInformation: // Type 1
249decodeSystemInformation((SMBSystemInformation *)structHeader);
250break;
251
252case kSMBTypeBaseBoard: // Type 2
253decodeBaseBoard((SMBBaseBoard *)structHeader);
254break;
255
256case kSMBTypeSystemEnclosure: // Type 3
257decodeSystemEnclosure((SMBSystemEnclosure *)structHeader);
258break;
259
260case kSMBTypeProcessorInformation: // Type 4
261decodeProcessorInformation((SMBProcessorInformation *)structHeader);
262break;
263
264case kSMBTypeMemoryDevice: // Type 17
265decodeMemoryDevice((SMBMemoryDevice *)structHeader);
266break;
267
268/* Skip all Apple Specific Structures */
269case kSMBTypeFirmwareVolume: // Type
270case kSMBTypeMemorySPD: // Type
271break;
272
273case kSMBTypeOemProcessorType: // Type
274decodeOemProcessorType((SMBOemProcessorType *)structHeader);
275break;
276
277case kSMBTypeOemProcessorBusSpeed: // Type
278decodeOemProcessorBusSpeed((SMBOemProcessorBusSpeed *)structHeader);
279break;
280
281case kSMBTypeEndOfTable: // Type
282/* Skip, to be added at the end */
283break;
284
285default:
286break;
287}
288
289ptr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
290for (; ((uint16_t *)ptr)[0] != 0; ptr++);
291
292if (((uint16_t *)ptr)[0] == 0)
293{
294ptr += 2;
295}
296
297structHeader = (SMBStructHeader *)ptr;
298}
299DBG("\n");
300}
301
302

Archive Download this file

Revision: 2285