| | 457 | static int smbios_decode(s_dmi *dmi, uint8_t *buf) |
| | 458 | { |
| | 459 | |
| | 460 | dmi->dmitable.ver = (buf[0x06] << 8) + buf[0x07]; |
| | 461 | /* Some BIOS report weird SMBIOS version, fix that up */ |
| | 462 | switch (dmi->dmitable.ver) { |
| | 463 | case 0x021F: |
| | 464 | dmi->dmitable.ver = 0x0203; |
| | 465 | break; |
| | 466 | case 0x0233: |
| | 467 | dmi->dmitable.ver = 0x0206; |
| | 468 | break; |
| | 469 | } |
| | 470 | dmi->dmitable.major_version=dmi->dmitable.ver >> 8; |
| | 471 | dmi->dmitable.minor_version=dmi->dmitable.ver & 0xFF; |
| | 472 | |
| | 473 | return DMI_TABLE_PRESENT; |
| | 474 | } |
| | 475 | |
| | 476 | |
| | 477 | static int legacy_decode(s_dmi *dmi, uint8_t *buf) |
| | 478 | { |
| | 479 | dmi->dmitable.num = buf[13] << 8 | buf[12]; |
| | 480 | dmi->dmitable.len = buf[7] << 8 | buf[6]; |
| | 481 | dmi->dmitable.base = |
| | 482 | buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8]; |
| | 483 | |
| | 484 | if (dmi->dmitable.ver>0) return DMI_TABLE_PRESENT; |
| | 485 | |
| | 486 | dmi->dmitable.ver = (buf[0x06] << 8) + buf[0x07]; |
| | 487 | |
| | 488 | /* |
| | 489 | * DMI version 0.0 means that the real version is taken from |
| | 490 | * the SMBIOS version, which we don't know at this point. |
| | 491 | */ |
| | 492 | if (buf[14] != 0) { |
| | 493 | dmi->dmitable.major_version = buf[14] >> 4; |
| | 494 | dmi->dmitable.minor_version = buf[14] & 0x0F; |
| | 495 | } else { |
| | 496 | dmi->dmitable.major_version = 0; |
| | 497 | dmi->dmitable.minor_version = 0; |
| | 498 | } |
| | 499 | return DMI_TABLE_PRESENT; |
| | 500 | } |
| | 501 | |
| | 502 | |
| 486 | | if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf)) { |
| 487 | | dmi->dmitable.num = buf[13] << 8 | buf[12]; |
| 488 | | dmi->dmitable.len = buf[7] << 8 | buf[6]; |
| 489 | | dmi->dmitable.base = |
| 490 | | buf[11] << 24 | buf[10] << 16 | buf[9] << 8 | buf[8]; |
| 491 | | dmi->dmitable.ver = (buf[0x06] << 8) + buf[0x07]; |
| 492 | | |
| 493 | | /* |
| 494 | | * DMI version 0.0 means that the real version is taken from |
| 495 | | * the SMBIOS version, which we don't know at this point. |
| 496 | | */ |
| 497 | | if (buf[14] != 0) { |
| 498 | | dmi->dmitable.major_version = buf[14] >> 4; |
| 499 | | dmi->dmitable.minor_version = buf[14] & 0x0F; |
| 500 | | } else { |
| 501 | | dmi->dmitable.major_version = 0; |
| 502 | | dmi->dmitable.minor_version = 0; |
| 503 | | |
| 504 | | } |
| 505 | | /* printf("DMI present (version %d.%d)\n", dmitable.major_version,dmitable.minor_version); |
| 506 | | printf("%d structures occupying %d bytes.\n",dmitable.num, dmitable.len); |
| 507 | | printf("DMI table at 0x%08X.\n",dmitable.base);*/ |
| 508 | | return DMI_TABLE_PRESENT; |
| | 531 | if (memcmp(buf, "_SM_", 4) == 0) { |
| | 532 | smbios_decode(dmi,buf); |
| | 533 | } |
| | 534 | if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf,sizeof(buf))) { |
| | 535 | return legacy_decode(dmi,buf); |