summaryrefslogtreecommitdiffstats
path: root/sys/i386/bios
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2005-07-21 00:18:28 +0000
committerjkim <jkim@FreeBSD.org>2005-07-21 00:18:28 +0000
commit25ae65f652e74d694845962f48adddb8b14c25ed (patch)
tree2d14072b0863a44f6c1076f2f9bc76e28f7ed404 /sys/i386/bios
parent8258594954988ea6f837763de78419c814891846 (diff)
downloadFreeBSD-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.c26
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");
OpenPOWER on IntegriCloud