Chameleon

Chameleon Svn Source Tree

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

Archive Download this file

Revision: 2148