diff options
author | jkim <jkim@FreeBSD.org> | 2005-07-21 00:18:28 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2005-07-21 00:18:28 +0000 |
commit | 25ae65f652e74d694845962f48adddb8b14c25ed (patch) | |
tree | 2d14072b0863a44f6c1076f2f9bc76e28f7ed404 /sys/i386/bios | |
parent | 8258594954988ea6f837763de78419c814891846 (diff) | |
download | FreeBSD-src-25ae65f652e74d694845962f48adddb8b14c25ed.zip FreeBSD-src-25ae65f652e74d694845962f48adddb8b14c25ed.tar.gz |
Fix smbios(4) and add support for amd64
Approved by: anholt (mentor)
Diffstat (limited to 'sys/i386/bios')
-rw-r--r-- | sys/i386/bios/smbios.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/sys/i386/bios/smbios.c b/sys/i386/bios/smbios.c index f9ceae2..c620b4c 100644 --- a/sys/i386/bios/smbios.c +++ b/sys/i386/bios/smbios.c @@ -46,6 +46,11 @@ __FBSDID("$FreeBSD$"); #include <machine/pc/bios.h> /* + * System Management BIOS Reference Specification, v2.4 Final + * http://www.dmtf.org/standards/published_documents/DSP0134.pdf + */ + +/* * SMBIOS Entry Point Structure */ struct smbios_eps { @@ -55,9 +60,9 @@ struct smbios_eps { u_int8_t SMBIOS_Major; u_int8_t SMBIOS_Minor; - u_int8_t Max_Size; + u_int16_t Max_Size; u_int8_t Revision; - u_int8_t Formatted_Area; + u_int8_t Formatted_Area[5]; u_int8_t Intermediate_Anchor[5]; /* '_DMI_' */ u_int8_t Intermediate_Checksum; @@ -113,6 +118,19 @@ smbios_identify (driver_t *driver, device_t parent) rid = 0; length = ADDR2EPS(addr)->Length; + if (length != 0x1f) { + u_int8_t major, minor; + + major = ADDR2EPS(addr)->SMBIOS_Major; + minor = ADDR2EPS(addr)->SMBIOS_Minor; + + /* SMBIOS v2.1 implementation might use 0x1e. */ + if (length == 0x1e && major == 2 && minor == 1) + length = 0x1f; + else + return; + } + child = BUS_ADD_CHILD(parent, 0, "smbios", -1); device_set_driver(child, driver); bus_set_resource(child, SYS_RES_MEMORY, rid, addr, length); @@ -170,10 +188,10 @@ smbios_attach (device_t dev) } sc->eps = RES2EPS(sc->res); - device_printf(dev, "Version: %d.%02d", + device_printf(dev, "Version: %u.%u", sc->eps->SMBIOS_Major, sc->eps->SMBIOS_Minor); if (bcd2bin(sc->eps->SMBIOS_BCD_Revision)) - printf(", Revision: %d.%02d", + printf(", BCD Revision: %u.%u", bcd2bin(sc->eps->SMBIOS_BCD_Revision >> 4), bcd2bin(sc->eps->SMBIOS_BCD_Revision & 0x0f)); printf("\n"); |