diff options
Diffstat (limited to 'src/dmidecode.c')
-rw-r--r-- | src/dmidecode.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/src/dmidecode.c b/src/dmidecode.c index 4e4d41f..40cb861 100644 --- a/src/dmidecode.c +++ b/src/dmidecode.c @@ -2869,7 +2869,8 @@ PyObject* dmi_decode(struct dmi_header *h, u16 ver) { //. 0xF1 --> 0xF100 //int minor = h->type<<8; char _[2048]; bzero(_, 2048); - dmi_codes_major *dmiMajor = (dmi_codes_major *)&dmiCodesMajor[map_maj[h->type]]; + //dmi_codes_major *dmiMajor = (dmi_codes_major *)&dmiCodesMajor[map_maj[h->type]]; + dmi_codes_major *dmiMajor = (dmi_codes_major *)&dmiCodesMajor[h->type]; PyObject *pylist = PyDict_New(); PyDict_SetItemString(pylist, "id", PyString_FromString(dmiMajor->id)); PyDict_SetItemString(pylist, "desc", PyString_FromString(dmiMajor->desc)); @@ -4578,13 +4579,14 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, P data=buf; while(i<num && data+4<=buf+len) /* 4 is the length of an SMBIOS structure header */ { + u8 *next; struct dmi_header h; int display; to_dmi_header(&h, data); display=((opt.type==NULL || opt.type[h.type]) - && !(h.type>39 && h.type<=127) +// && !(h.type>39 && h.type<=127) && !opt.string); /* @@ -4603,7 +4605,7 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, P char hid[7]; sprintf(hid, "0x%04x", h.handle); PyObject *hDict = PyDict_New(); - dmiSetItem(hDict, "dmi_handle", "0x%04x", h.handle); + dmiSetItem(hDict, "dmi_handle", hid); dmiSetItem(hDict, "dmi_type", "%d", h.type); dmiSetItem(hDict, "dmi_size", "%d", h.length); @@ -4653,24 +4655,33 @@ static void dmi_table(u32 base, u16 len, u16 num, u16 ver, const char *devmem, P -int _smbios_decode_check(u8 *buf, const char *devmem, PyObject** pydata) { - int check; - if(!checksum(buf, buf[0x05]) || !memcmp(buf+0x10, "_DMI_", 5)==0 || !checksum(buf+0x10, 0x0F)) check = 0; //. Bad - else check = 1; //. Good +int _smbios_decode_check(u8 *buf) { + int check = (!checksum(buf, buf[0x05]) || memcmp(buf + 0x10, "_DMI_", 5)!=0 || !checksum(buf+0x10, 0x0F)) ? 0 : 1; return check; } int smbios_decode_set_version(u8 *buf, const char *devmem, PyObject** pydata) { - int check = _smbios_decode_check(buf, devmem, pydata); + int check = _smbios_decode_check(buf); char vbuf[64]; bzero(vbuf, 64); if(check == 1) { u16 ver = (buf[0x06] << 8) + buf[0x07]; - /* Some BIOS attempt to encode version 2.3.1 as 2.31, fix it up */ - if(ver == 0x021F) { - sprintf(vbuf, "SMBIOS 2.3 present (Version fixup 2.31 -> 2.3)"); - ver = 0x0203; - } else { - sprintf(vbuf, "SMBIOS %i.%i present", ver>>8, ver&0xFF); + /* Some BIOS report weird SMBIOS version, fix that up */ + int _m, _M; + _m = 0; + _M = 0; + switch(ver) { + case 0x021F: + _m = 31; + _M = 3; + ver = 0x0203; + break; + case 0x0233: + _m = 51; + _M = 6; + ver = 0x0206; + break; } + if(_m || _M) sprintf(vbuf, "SMBIOS %i.%i present (Version fixup 2.%d -> 2.%d)", ver>>8, ver&0xFF, _m, _M); + else sprintf(vbuf, "SMBIOS %i.%i present", ver>>8, ver&0xFF); } else if(check == 0) { sprintf(vbuf, "No SMBIOS nor DMI entry point found"); } @@ -4682,9 +4693,18 @@ int smbios_decode_set_version(u8 *buf, const char *devmem, PyObject** pydata) { return check; } int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata) { - int check = _smbios_decode_check(buf, devmem, &pydata); + int check = _smbios_decode_check(buf); if(check == 1) { u16 ver = (buf[0x06] << 8) + buf[0x07]; + switch(ver) { + case 0x021F: + ver = 0x0203; + break; + case 0x0233: + ver = 0x0206; + break; + } + //printf(">>%d @ %d, %d<<\n", DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C)); dmi_table(DWORD(buf+0x18), WORD(buf+0x16), WORD(buf+0x1C), ver, devmem, pydata); } return check; @@ -4693,14 +4713,14 @@ int smbios_decode(u8 *buf, const char *devmem, PyObject* pydata) { -int _legacy_decode_check(u8 *buf, const char *devmem, PyObject** pydata) { +int _legacy_decode_check(u8 *buf) { int check; if(!checksum(buf, 0x0F)) check = 0; //. Bad else check = 1; //. Good return check; } int legacy_decode_set_version(u8 *buf, const char *devmem, PyObject** pydata) { - int check = _legacy_decode_check(buf, devmem, pydata); + int check = _legacy_decode_check(buf); char vbuf[64]; bzero(vbuf, 64); if(check == 1) { sprintf(vbuf, "Legacy DMI %i.%i present", buf[0x0E]>>4, buf[0x0E]&0x0F); @@ -4715,7 +4735,7 @@ int legacy_decode_set_version(u8 *buf, const char *devmem, PyObject** pydata) { return check; } int legacy_decode(u8 *buf, const char *devmem, PyObject* pydata) { - int check = _legacy_decode_check(buf, devmem, &pydata); + int check = _legacy_decode_check(buf); if(check == 1) dmi_table(DWORD(buf+0x08), WORD(buf+0x06), WORD(buf+0x0C), ((buf[0x0E]&0xF0)<<4)+(buf[0x0E]&0x0F), devmem, pydata); return check; |