2
* DMI decoder for s2ram
4
* (C) 2000,2001 Alan Cox <alan@redhat.com>
6
* 2-July-2001 Matt Domsch <Matt_Domsch@dell.com>
7
* Additional structures displayed per SMBIOS 2.3.1 spec
9
* (C) 2006 Pavel Machek <pavel@suse.cz>
11
* Licensed under the GNU General Public license v2.
22
typedef unsigned char u8;
23
typedef unsigned short u16;
24
typedef unsigned int u32;
34
extern char bios_version[1024], sys_vendor[1024], sys_product[1024], sys_version[1024];
37
char bios_version[1024], sys_vendor[1024], sys_product[1024], sys_version[1024];
41
static char *dmi_string(struct dmi_header *dm, u8 s)
56
* Copy a physical memory chunk into a memory buffer.
57
* This function allocates memory.
59
void *mem_chunk(size_t base, size_t len)
66
if((fd=open("/dev/mem", O_RDONLY))==-1){
71
if((p=malloc(len))==NULL) {
72
perror("/dev/mem malloc");
76
mmoffset=base%getpagesize();
78
* Please note that we don't use mmap() for performance reasons here,
79
* but to workaround problems many people encountered when trying
80
* to read from /dev/mem using regular read() calls.
82
mmp=mmap(0, mmoffset+len, PROT_READ, MAP_SHARED, fd, base-mmoffset);
89
memcpy(p, (u8 *)mmp+mmoffset, len);
91
if(munmap(mmp, mmoffset+len)==-1)
92
perror("/dev/mem munmap");
100
static void dmi_table(u32 base, int len, int num)
103
struct dmi_header *dm;
107
if ((buf=mem_chunk(base, len))==0) {
108
printf("DMI Table is unreachable\n");
116
dm=(struct dmi_header *)data;
120
PRINTF("\tBIOS Information Block\n");
121
PRINTF("\t\tVendor: %s\n",
122
dmi_string(dm, data[4]));
123
strcpy(bios_version, dmi_string(dm, data[5]));
124
PRINTF("\t\tVersion: %s\n", bios_version);
125
PRINTF("\t\tRelease: %s\n",
126
dmi_string(dm, data[8]));
127
PRINTF("\t\tBIOS base: 0x%04X0\n",
129
PRINTF("\t\tROM size: %dK\n",
131
PRINTF("\t\tCapabilities:\n");
132
u=data[13]<<24|data[12]<<16|data[11]<<8|data[10];
133
u2=data[17]<<24|data[16]<<16|data[15]<<8|data[14];
134
PRINTF("\t\t\tFlags: 0x%08X%08X\n",
139
PRINTF("\tSystem Information Block\n");
140
strcpy(sys_vendor, dmi_string(dm, data[4]));
141
strcpy(sys_product, dmi_string(dm, data[5]));
142
strcpy(sys_version, dmi_string(dm, data[6]));
143
PRINTF("\t\tVendor: %s\n", sys_vendor);
144
PRINTF("\t\tProduct: %s\n", sys_product);
145
PRINTF("\t\tVersion: %s\n", sys_version);
146
PRINTF("\t\tSerial Number: %s\n",
147
dmi_string(dm, data[7]));
151
PRINTF("\tBoard Information Block\n");
152
PRINTF("\t\tVendor: %s\n",
153
dmi_string(dm, data[4]));
154
PRINTF("\t\tProduct: %s\n",
155
dmi_string(dm, data[5]));
156
PRINTF("\t\tVersion: %s\n",
157
dmi_string(dm, data[6]));
158
PRINTF("\t\tSerial Number: %s\n",
159
dmi_string(dm, data[7]));
166
while(*data || data[1])
179
if((buf=mem_chunk(0xF0000, 0x10000))==NULL)
182
for(fp=0; fp<=0xFFF0; fp+=16) {
183
if(memcmp(buf+fp, "_DMI_", 5)==0) {
185
u16 num=cur[13]<<8|cur[12];
186
u16 len=cur[7]<<8|cur[6];
187
u32 base=cur[11]<<24|cur[10]<<16|cur[9]<<8|cur[8];
189
PRINTF("DMI %d.%d present.\n",
190
cur[14]>>4, cur[14]&0x0F);
191
PRINTF("%d structures occupying %d bytes.\n",
194
PRINTF("DMI table at 0x%08X.\n",
195
cur[11]<<24|cur[10]<<16|cur[9]<<8|cur[8]);
196
dmi_table(base,len,num);
204
int main(int argc, char *argv[])