Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/smbios.c

1
2
3#include "libsaio.h"
4#include "SMBIOS.h"
5#include "Platform.h"
6
7static const char * const SMTAG = "_SM_";
8static const char* const DMITAG= "_DMI_";
9static struct SMBEntryPoint *getAddressOfSmbiosTable(void);
10
11static struct SMBEntryPoint *getAddressOfSmbiosTable(void)
12{
13struct SMBEntryPoint*smbios;
14/*
15 * The logic is to start at 0xf0000 and end at 0xfffff iterating 16 bytes at a time looking
16 * for the SMBIOS entry-point structure anchor (literal ASCII "_SM_").
17 */
18smbios = (struct SMBEntryPoint*) SMBIOS_RANGE_START;
19while (smbios <= (struct SMBEntryPoint *)SMBIOS_RANGE_END)
20{
21if (COMPARE_DWORD(smbios->anchor, SMTAG) &&
22COMPARE_DWORD(smbios->dmi.anchor, DMITAG) &&
23smbios->dmi.anchor[4]==DMITAG[4] &&
24checksum8(smbios, sizeof(struct SMBEntryPoint)) == 0)
25 {
26return ((void*)smbios);
27 }
28smbios = (struct SMBEntryPoint*) ( ((char*) smbios) + 16 );
29}
30printf("Error: Could not find original SMBIOS !!\n");
31pause();
32return NULL;
33}
34
35struct SMBEntryPoint *getSmbiosOriginal()
36{
37 static struct SMBEntryPoint *orig = NULL; // cached
38
39 if (orig == NULL)
40{
41orig = getAddressOfSmbiosTable();
42
43if (orig)
44{
45verbose("Found System Management BIOS (SMBIOS) table\n");
46}
47
48 }
49 return orig;
50}
51
52/* get product Name from original SMBIOS */
53char* readDefaultPlatformName(void)
54{
55
56SMBEntryPoint *eps = getSmbiosOriginal();
57if (eps == NULL) return NULL;
58
59uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
60SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
61
62for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
63{
64switch (structHeader->type)
65{
66case kSMBTypeSystemInformation:
67{
68uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
69uint8_t field = ((SMBSystemInformation *)structHeader)->productName;
70
71if (!field)
72return NULL;
73
74for (field--; field != 0 && strlen((char *)stringPtr) > 0;
75 field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
76
77//DBG("original SMBIOS Product name: %s\n",(char *)stringPtr);
78if (stringPtr)
79return (char *)stringPtr;
80else
81return NULL;
82
83break;
84}
85default:
86break;
87
88}
89
90structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
91for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
92
93if (((uint16_t *)structPtr)[0] == 0)
94structPtr += 2;
95
96structHeader = (SMBStructHeader *)structPtr;
97}
98return NULL;
99}
100
101/* get UUID or product Name from original SMBIOS, stripped version of kabyl's readSMBIOSInfo */
102int readSMBIOS(int value)
103{
104
105SMBEntryPoint *eps = getSmbiosOriginal();
106if (eps == NULL) return 0;
107
108uint8_t *structPtr = (uint8_t *)eps->dmi.tableAddress;
109SMBStructHeader *structHeader = (SMBStructHeader *)structPtr;
110
111for (;((eps->dmi.tableAddress + eps->dmi.tableLength) > ((uint32_t)(uint8_t *)structHeader + sizeof(SMBStructHeader)));)
112{
113switch (structHeader->type)
114{
115case kSMBTypeSystemInformation:
116{
117switch (value) {
118case theUUID:
119 safe_set_env(envUUID,(uint32_t)((SMBSystemInformation *)structHeader)->uuid);
120return 1;
121break;
122case thePlatformName:
123{
124uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
125uint8_t field = ((SMBSystemInformation *)structHeader)->productName;
126
127if (!field)
128return 0;
129
130for (field--; field != 0 && strlen((char *)stringPtr) > 0;
131 field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
132
133//DBG("original SMBIOS Product name: %s\n",(char *)stringPtr);
134 SetgPlatformName((char *)stringPtr);
135if (GetgPlatformName()) return 1;
136break;
137}
138default:
139break;
140}
141
142break;
143}
144case kSMBTypeBaseBoard:
145 {
146switch (value) {
147case theProducBoard:
148{
149uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
150uint8_t field = ((SMBBaseBoard *)structHeader)->product;
151
152if (!field)
153return 0;
154
155for (field--; field != 0 && strlen((char *)stringPtr) > 0;
156 field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
157
158Setgboardproduct((char *)stringPtr);
159if (Getgboardproduct()) return 1;
160break;
161}
162default:
163break;
164}
165break;
166 }
167default:
168break;
169
170}
171
172structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
173for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
174
175if (((uint16_t *)structPtr)[0] == 0)
176structPtr += 2;
177
178structHeader = (SMBStructHeader *)structPtr;
179}
180return 0;
181}

Archive Download this file

Revision: 2006