Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/libsaio/smbios_decode.c

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
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: 1808