diff options
author | Gordon Willem Klok <gwk@cvs.openbsd.org> | 2006-05-08 22:51:19 +0000 |
---|---|---|
committer | Gordon Willem Klok <gwk@cvs.openbsd.org> | 2006-05-08 22:51:19 +0000 |
commit | 43f20e0647ff9d1b9f6f333dca641dc01587e7ca (patch) | |
tree | 2749242ff1e683c88f4323fa995c1e5eeb99a750 /sys/arch/i386 | |
parent | b4b9ffec62bebe163253a5cefcea185cd4bbae23 (diff) |
Add smbios support for i386 and amd64, fix ipmi to use this new functionallity,
hook up some sysctls to add system vendor/product/version and UUID reporting.
"get it in" deraadt@
Diffstat (limited to 'sys/arch/i386')
-rw-r--r-- | sys/arch/i386/i386/bios.c | 40 | ||||
-rw-r--r-- | sys/arch/i386/include/biosvar.h | 4 | ||||
-rw-r--r-- | sys/arch/i386/include/smbiosvar.h | 206 |
3 files changed, 231 insertions, 19 deletions
diff --git a/sys/arch/i386/i386/bios.c b/sys/arch/i386/i386/bios.c index e559d97caf7..95def0a01d5 100644 --- a/sys/arch/i386/i386/bios.c +++ b/sys/arch/i386/i386/bios.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bios.c,v 1.62 2006/05/08 21:13:03 gwk Exp $ */ +/* $OpenBSD: bios.c,v 1.59 2006/05/08 22:51:18 gwk Exp $ */ /* * Copyright (c) 1997-2001 Michael Shalayeff @@ -91,7 +91,7 @@ u_int32_t bios_cksumlen; struct bios32_entry bios32_entry; struct smbios_entry smbios_entry; #ifdef MULTIPROCESSOR -void *bios_smpinfo; +void *bios_smpinfo; #endif void smbios_info(char*); @@ -103,8 +103,8 @@ bios_diskinfo_t *bios_getdiskinfo(dev_t); */ extern char *hw_vendor, *hw_prod, *hw_uuid, *hw_serial, *hw_ver; const char * smbios_uninfo[] = { - "System", - "Not Specified" + "System", + "Not Specified" }; @@ -160,7 +160,7 @@ biosattach(struct device *parent, struct device *self, void *aux) /* see if we have BIOS32 extensions */ if (!(flags & BIOSF_BIOS32)) { for (va = ISA_HOLE_VADDR(BIOS32_START); - va < (u_int8_t *)ISA_HOLE_VADDR(BIOS32_END); va += 16) { + va < (u_int8_t *)ISA_HOLE_VADDR(BIOS32_END); va += 16) { bios32_header_t h = (bios32_header_t)va; u_int8_t cksum; int i; @@ -184,7 +184,7 @@ biosattach(struct device *parent, struct device *self, void *aux) } } - /* see if we have SMBIOS extentions */ + /* see if we have SMBIOS extentions */ if (!(flags & BIOSF_SMBIOS)) { for (va = ISA_HOLE_VADDR(SMBIOS_START); va < (u_int8_t *)ISA_HOLE_VADDR(SMBIOS_END); va+= 16) { @@ -210,13 +210,13 @@ biosattach(struct device *parent, struct device *self, void *aux) if (chksum != 0) continue; - pa = trunc_page(sh->addr); + pa = trunc_page(sh->addr); end = round_page(sh->addr + sh->size); eva = uvm_km_valloc(kernel_map, end-pa); if (eva == 0) break; - smbios_entry.addr = (u_int8_t *)(eva + + smbios_entry.addr = (u_int8_t *)(eva + (sh->addr & PGOFSET)); smbios_entry.len = sh->size; smbios_entry.mjr = sh->majrev; @@ -225,10 +225,10 @@ biosattach(struct device *parent, struct device *self, void *aux) for (; pa < end; pa+= NBPG, eva+= NBPG) pmap_kenter_pa(eva, pa, VM_PROT_READ); - - printf(", SMBIOS rev. %d.%d @ 0x%lx (%d entries)", + + printf(", SMBIOS rev. %d.%d @ 0x%lx (%d entries)", sh->majrev, sh->minrev, sh->addr, sh->count); - + smbios_info(sc->sc_dev.dv_xname); break; } @@ -274,8 +274,8 @@ biosattach(struct device *parent, struct device *self, void *aux) volatile u_int8_t *eva; for (str = NULL, va = ISA_HOLE_VADDR(0xc0000), - eva = ISA_HOLE_VADDR(0xf0000); - va < eva; va += 512) { + eva = ISA_HOLE_VADDR(0xf0000); + va < eva; va += 512) { extern struct extent *iomem_ex; bios_romheader_t romh = (bios_romheader_t)va; u_int32_t off, len; @@ -452,8 +452,8 @@ bios32_service(u_int32_t service, bios32_entry_t e, bios32_entry_info_t ei) setgdt(slot, (caddr_t)va, BIOS32_END, SDT_MEMERA, SEL_KPL, 1, 0); for (pa = trunc_page(BIOS32_START), - va += trunc_page(BIOS32_START); - pa < endpa; pa += NBPG, va += NBPG) { + va += trunc_page(BIOS32_START); + pa < endpa; pa += NBPG, va += NBPG) { pmap_enter(pmap_kernel(), va, pa, VM_PROT_READ | VM_PROT_WRITE, VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED); @@ -628,7 +628,7 @@ bios_getdiskinfo(dev_t dev) * smbios_find_table with the same arguments. */ int -smbios_find_table(u_int8_t type, struct smbtable *st) +smbios_find_table(u_int8_t type, struct smbtable *st) { u_int8_t *va, *end; struct smbtblhdr *hdr; @@ -660,6 +660,7 @@ smbios_find_table(u_int8_t type, struct smbtable *st) for (; va + sizeof(struct smbtblhdr) < end && tcount <= smbios_entry.count; tcount++) { hdr = (struct smbtblhdr *) va; + printf("SMBIOS (%d)@%p type: %d", tcount, va, hdr->type); if (hdr->type == type) { ret = 1; st->hdr = hdr; @@ -670,12 +671,15 @@ smbios_find_table(u_int8_t type, struct smbtable *st) if (hdr->type == SMBIOS_TYPE_EOT) break; va+= hdr->size; + printf(" size: %d strings@%p", hdr->size, va); for (; va + 1 < end; va++) if (*va == NULL && *(va + 1) == NULL) break; va+=2; + printf(" end@%p\n", va); } + printf("\n"); return ret; } @@ -698,7 +702,7 @@ smbios_get_string(struct smbtable *st, u_int8_t indx) } void -smbios_info(char * str) +smbios_info(char * str) { struct smbtable stbl, btbl; struct smbios_sys *sys; @@ -720,7 +724,7 @@ smbios_info(char * str) sys = (struct smbios_sys *)stbl.tblhdr; if (havebb) board = (struct smbios_board *)btbl.tblhdr; - /* + /* * Some smbios implementations have no system vendor or product strings, * some have very uninformative data which is harder to work around * and we must rely upon various heuristics to detect this. In both diff --git a/sys/arch/i386/include/biosvar.h b/sys/arch/i386/include/biosvar.h index dca4f99f7c5..fbf08a134f4 100644 --- a/sys/arch/i386/include/biosvar.h +++ b/sys/arch/i386/include/biosvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: biosvar.h,v 1.45 2005/11/22 12:51:01 mickey Exp $ */ +/* $OpenBSD: biosvar.h,v 1.46 2006/05/08 22:51:18 gwk Exp $ */ /* * Copyright (c) 1997-1999 Michael Shalayeff @@ -39,6 +39,7 @@ #define BIOSF_BIOS32 0x0001 #define BIOSF_PCIBIOS 0x0002 #define BIOSF_PROMSCAN 0x0004 +#define BIOSF_SMBIOS 0x0006 /* BIOS media ID */ #define BIOSM_F320K 0xff /* floppy ds/sd 8 spt */ @@ -107,6 +108,7 @@ struct bios32_entry { ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24)) #define BIOS32_SIGNATURE BIOS32_MAKESIG('_', '3', '2', '_') #define PCIBIOS_SIGNATURE BIOS32_MAKESIG('$', 'P', 'C', 'I') +#define SMBIOS_SIGNATURE BIOS32_MAKESIG('_', 'S', 'M', '_') /* * CTL_BIOS definitions. diff --git a/sys/arch/i386/include/smbiosvar.h b/sys/arch/i386/include/smbiosvar.h new file mode 100644 index 00000000000..5c9392c642e --- /dev/null +++ b/sys/arch/i386/include/smbiosvar.h @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2006 Gordon Willem Klok <gklok@cogeco.ca> + * Copyright (c) 2005 Jordan Hargrave + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _I386_SMBIOSVAR_ +#define _I386_SMBIOSVAR_ + +#define SMBIOS_START 0xf0000 +#define SMBIOS_END 0xfffff + +#define SMBIOS_UUID_NPRESENT 0x1 +#define SMBIOS_UUID_NSET 0x2 + +/* + * Section 3.5 of "UUIDs and GUIDs" found at + * http://www.opengroup.org/dce/info/draft-leach-uuids-guids-01.txt + * specifies the string repersentation of a UUID. + */ +#define SMBIOS_UUID_REP "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" +#define SMBIOS_UUID_REPLEN 37 /* 16 zero padded values, 4 hyphens, 1 null */ + +struct smbios_entry { + u_int8_t mjr; + u_int8_t min; + u_int8_t *addr; + u_int16_t len; + u_int16_t count; +}; + +struct smbhdr { + u_int32_t sig; /* "_SM_" */ + u_int8_t checksum; /* Entry point checksum */ + u_int8_t len; /* Entry point structure length */ + u_int8_t majrev; /* Specification major revision */ + u_int8_t minrev; /* Specification minor revision */ + u_int16_t mss; /* Maximum Structure Size */ + u_int8_t epr; /* Entry Point Revision */ + u_int8_t fa[5]; /* value determined by EPR */ + u_int8_t sasig[5]; /* Secondary Anchor "_DMI_" */ + u_int8_t sachecksum; /* Secondary Checksum */ + u_int16_t size; /* Length of structure table in bytes */ + u_int32_t addr; /* Structure table address */ + u_int16_t count; /* Number of SMBIOS structures */ + u_int8_t rev; /* BCD revision */ +} __packed; + +struct smbtblhdr { + u_int8_t type; + u_int8_t size; + u_int16_t handle; +} __packed; + +struct smbtable { + struct smbtblhdr *hdr; + void *tblhdr; + u_int32_t cookie; +}; + +#define SMBIOS_TYPE_BIOS 0 +#define SMBIOS_TYPE_SYSTEM 1 +#define SMBIOS_TYPE_BASEBOARD 2 +#define SMBIOS_TYPE_ENCLOSURE 3 +#define SMBIOS_TYPE_PROCESSOR 4 +#define SMBIOS_TYPE_MEMCTRL 5 +#define SMBIOS_TYPE_MEMMOD 6 +#define SMBIOS_TYPE_CACHE 7 +#define SMBIOS_TYPE_PORT 8 +#define SMBIOS_TYPE_SLOTS 9 +#define SMBIOS_TYPE_OBD 10 +#define SMBIOS_TYPE_OEM 11 +#define SMBIOS_TYPE_SYSCONFOPT 12 +#define SMBIOS_TYPE_BIOSLANG 13 +#define SMBIOS_TYPE_GROUPASSOC 14 +#define SMBIOS_TYPE_SYSEVENTLOG 15 +#define SMBIOS_TYPE_PHYMEM 16 +#define SMBIOS_TYPE_MEMDEV 17 +#define SMBIOS_TYPE_ECCINFO32 18 +#define SMBIOS_TYPE_MEMMAPARRAYADDR 19 +#define SMBIOS_TYPE_MEMMAPDEVADDR 20 +#define SMBIOS_TYPE_INBUILTPOINT 21 +#define SMBIOS_TYPE_PORTBATT 22 +#define SMBIOS_TYPE_SYSRESET 23 +#define SMBIOS_TYPE_HWSECUIRTY 24 +#define SMBIOS_TYPE_PWRCTRL 25 +#define SMBIOS_TYPE_VOLTPROBE 26 +#define SMBIOS_TYPE_COOLING 27 +#define SMBIOS_TYPE_TEMPPROBE 28 +#define SMBIOS_TYPE_CURRENTPROBE 29 +#define SMBIOS_TYPE_OOB_REMOTEACCESS 30 +#define SMBIOS_TYPE_BIS 31 +#define SMBIOS_TYPE_SBI 32 +#define SMBIOS_TYPE_ECCINFO64 33 +#define SMBIOS_TYPE_MGMTDEV 34 +#define SMBIOS_TYPE_MGTDEVCOMP 35 +#define SMBIOS_TYPE_MGTDEVTHRESH 36 +#define SMBIOS_TYPE_MEMCHANNEL 37 +#define SMBIOS_TYPE_IPMIDEV 38 +#define SMBIOS_TYPE_SPS 39 +#define SMBIOS_TYPE_INACTIVE 126 +#define SMBIOS_TYPE_EOT 127 + +/* + * SMBIOS Structure Type 0 "BIOS Information" + * DMTF Specification DSP0134 Section: 3.3.1 p.g. 34 + */ +struct smbios_struct_bios { + u_int8_t vendor; /* string */ + u_int8_t version; /* string */ + u_int16_t startaddr; + u_int8_t release; /* string */ + u_int8_t romsize; + u_int64_t characteristics; + u_int32_t charext; + u_int8_t major_rel; + u_int8_t minor_rel; + u_int8_t ecf_mjr_rel; /* embedded controler firmware */ + u_int8_t ecf_min_rel; /* embedded controler firmware */ +} __packed; + +/* + * SMBIOS Structure Type 1 "System Information" + * DMTF Specification DSP0134 Section 3.3.2 p.g. 35 + */ + +struct smbios_sys { +/* SMBIOS spec 2.0+ */ + u_int8_t vendor; /* string */ + u_int8_t product; /* string */ + u_int8_t version; /* string */ + u_int8_t serial; /* string */ +/* SMBIOS spec 2.1+ */ + u_int8_t uuid[16]; + u_int8_t wakeup; +/* SMBIOS spec 2.4+ */ + u_int8_t sku; /* string */ + u_int8_t family; /* string */ +} __packed; + +/* + * SMBIOS Structure Type 2 "Base Board (Module) Information" + * DMTF Specification DSP0134 Section 3.3.3 p.g. 37 + */ +struct smbios_board { + u_int8_t vendor; /* string */ + u_int8_t product; /* string */ + u_int8_t version; /* string */ + u_int8_t serial; /* string */ + u_int8_t asset; /* stirng */ + u_int8_t feature; /* feature flags */ + u_int8_t location; /* location in chassis */ + u_int16_t handle; /* chassis handle */ + u_int8_t type; /* board type */ + u_int8_t noc; /* number of contained objects */ +} __packed; + +/* + * SMBIOS Structure Type 38 "IPMI Information" + * DMTF Specification DSP0134 Section 3.3.39 p.g. 91 + */ +struct smbios_ipmi { + u_int8_t smipmi_if_type; /* IPMI Interface Type */ + u_int8_t smipmi_if_rev; /* BCD IPMI Revision */ + u_int8_t smipmi_i2c_address; /* I2C address of BMC */ + u_int8_t smipmi_nvram_address; /* I2C address of NVRAM + * storage */ + u_int64_t smipmi_base_address; /* Base address of BMC (BAR + * format */ + u_int8_t smipmi_base_flags; /* Flags field: + * bit 7:6 : register spacing + * 00 = byte + * 01 = dword + * 02 = word + * bit 4 : Lower bit BAR + * bit 3 : IRQ valid + * bit 2 : N/A + * bit 1 : Interrupt polarity + * bit 0 : Interrupt trigger */ + u_int8_t smipmi_irq; /* IRQ if applicable */ +} __packed; + +int smbios_find_table(u_int8_t, struct smbtable *); +char * smbios_get_string(struct smbtable *, u_int8_t); + +#endif |