Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/libsaio/smbios_decode.c

Source at commit 307 created 12 years 11 months ago.
By ifabio, merge changes from trunk (929). Also merge the module changes from Azimutz branche (fix compile error) Also edited the info.plist into AHCIPortInjector.kext: http://forum.voodooprojects.org/index.php/topic,1170.0.html
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: 307