void smbios_detect(void) { char buf[16]; caddr_t addr, dmi, smbios; size_t count, length; uint32_t paddr; int i, major, minor, ver; /* Search signatures and validate checksums. */ smbios = smbios_sigsearch(PTOV(SMBIOS_START), SMBIOS_LENGTH); if (smbios == NULL) return; length = SMBIOS_GET16(smbios, 0x16); /* Structure Table Length */ paddr = SMBIOS_GET32(smbios, 0x18); /* Structure Table Address */ count = SMBIOS_GET16(smbios, 0x1c); /* No of SMBIOS Structures */ ver = SMBIOS_GET8(smbios, 0x1e); /* SMBIOS BCD Revision */ if (ver != 0) { major = ver >> 4; minor = ver & 0x0f; if (major > 9 || minor > 9) ver = 0; }
static void smbios_probe(const caddr_t addr) { caddr_t saddr, info; uintptr_t paddr; if (smbios.probed) return; smbios.probed = 1; /* Search signatures and validate checksums. */ saddr = smbios_sigsearch(addr ? addr : PTOV(SMBIOS_START), SMBIOS_LENGTH); if (saddr == NULL) return; smbios.length = SMBIOS_GET16(saddr, 0x16); /* Structure Table Length */ paddr = SMBIOS_GET32(saddr, 0x18); /* Structure Table Address */ smbios.count = SMBIOS_GET16(saddr, 0x1c); /* No of SMBIOS Structures */ smbios.ver = SMBIOS_GET8(saddr, 0x1e); /* SMBIOS BCD Revision */ if (smbios.ver != 0) { smbios.major = smbios.ver >> 4; smbios.minor = smbios.ver & 0x0f; if (smbios.major > 9 || smbios.minor > 9) smbios.ver = 0; }