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_";
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 UUID or product Name from original SMBIOS, stripped version of kabyl's readSMBIOSInfo */
53int readSMBIOS(int value)
54{
55
56SMBEntryPoint *eps = getSmbiosOriginal();
57if (eps == NULL) return 0;
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{
68switch (value) {
69case theUUID:
70Platform->UUID = ((SMBSystemInformation *)structHeader)->uuid;
71return 1;
72break;
73case thePlatformName:
74{
75uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
76uint8_t field = ((SMBSystemInformation *)structHeader)->productName;
77
78if (!field)
79return 0;
80
81for (field--; field != 0 && strlen((char *)stringPtr) > 0;
82 field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
83
84//DBG("original SMBIOS Product name: %s\n",(char *)stringPtr);
85gPlatformName = (char *)stringPtr;
86if (gPlatformName) return 1;
87break;
88}
89default:
90break;
91}
92
93break;
94}
95case kSMBTypeBaseBoard:
96 {
97switch (value) {
98case theProducBoard:
99{
100uint8_t *stringPtr = (uint8_t *)structHeader + structHeader->length;
101uint8_t field = ((SMBBaseBoard *)structHeader)->product;
102
103if (!field)
104return 0;
105
106for (field--; field != 0 && strlen((char *)stringPtr) > 0;
107 field--, stringPtr = (uint8_t *)((uint32_t)stringPtr + strlen((char *)stringPtr) + 1));
108
109gboardproduct = (char *)stringPtr;
110if (gboardproduct) return 1;
111break;
112}
113default:
114break;
115}
116break;
117 }
118default:
119break;
120
121}
122
123structPtr = (uint8_t *)((uint32_t)structHeader + structHeader->length);
124for (; ((uint16_t *)structPtr)[0] != 0; structPtr++);
125
126if (((uint16_t *)structPtr)[0] == 0)
127structPtr += 2;
128
129structHeader = (SMBStructHeader *)structPtr;
130}
131return 0;
132}

Archive Download this file

Revision: 1468