Chameleon

Chameleon Svn Source Tree

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

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

Archive Download this file

Revision: 1119