Chameleon Applications

Chameleon Applications Svn Source Tree

Root/trunk/ChameleonPrefPane/Sources/smbios/smbios_decode.cpp

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

Archive Download this file

Revision: 378