Module Name: src Committed By: mlelstv Date: Tue Dec 25 16:45:03 UTC 2018
Modified Files: src/sys/arch/x86/include: smbiosvar.h src/sys/arch/x86/x86: platform.c Log Message: Expose more DMI variables via sysctl. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/x86/include/smbiosvar.h cvs rdiff -u -r1.15 -r1.16 src/sys/arch/x86/x86/platform.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/x86/include/smbiosvar.h diff -u src/sys/arch/x86/include/smbiosvar.h:1.4 src/sys/arch/x86/include/smbiosvar.h:1.5 --- src/sys/arch/x86/include/smbiosvar.h:1.4 Sat Mar 11 07:21:10 2017 +++ src/sys/arch/x86/include/smbiosvar.h Tue Dec 25 16:45:02 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: smbiosvar.h,v 1.4 2017/03/11 07:21:10 nonaka Exp $ */ +/* $NetBSD: smbiosvar.h,v 1.5 2018/12/25 16:45:02 mlelstv Exp $ */ /* * Copyright (c) 2006 Gordon Willem Klok <gk...@cogeco.ca> * Copyright (c) 2005 Jordan Hargrave @@ -185,7 +185,7 @@ struct smbios_board { uint8_t product; /* string */ uint8_t version; /* string */ uint8_t serial; /* string */ - uint8_t asset; /* stirng */ + uint8_t asset; /* string */ uint8_t feature; /* feature flags */ uint8_t location; /* location in chassis */ uint16_t handle; /* chassis handle */ @@ -194,6 +194,59 @@ struct smbios_board { } __packed; /* + * SMBIOS Structure Type 3 "System Enclosure or Chassis" + * DMTF Specification DSP0134 Section 3.1.1 p.g. 37 + */ +struct smbios_chassis { + uint8_t vendor; /* string */ + uint8_t shape; + uint8_t version; /* string */ + uint8_t serial; /* string */ + uint8_t asset; /* string */ + uint8_t bustate; + uint8_t psstate; + uint8_t thstate; + uint8_t security; + uint32_t oemdata; + uint8_t height; + uint8_t powercords; + uint8_t noc; /* number of contained objects */ +} __packed; + +/* + * SMBIOS Structure Type 4 "Processor Information" + * DMTF Specification DSP0134 Section 3.1.1 p.g. 42 + */ +struct smbios_processor { + uint8_t socket; /* string */ + uint8_t type; + uint8_t family; + uint8_t vendor; /* string */ + uint64_t cpuid; + uint8_t version; /* string */ + uint8_t voltage; + uint16_t clkspeed; + uint16_t maxspeed; + uint16_t curspeed; + uint8_t status; + uint8_t upgrade; + uint8_t l1cache; + uint8_t l2cache; + uint8_t l3cache; + uint8_t serial; /* string */ + uint8_t asset; /* string */ + uint8_t part; /* string */ + uint8_t cores; /* cores per socket */ + uint8_t enabled; /* enabled cores per socket */ + uint8_t threads; /* threads per socket */ + uint16_t characteristics; + uint16_t family2; /* for values >= 255 */ + uint16_t cores2; /* for values >= 255 */ + uint16_t enabled2; /* for values >= 255 */ + uint16_t threads2; /* for values >= 255 */ +} __packed; + +/* * SMBIOS Structure Type 9 "Expansion slot" */ struct smbios_slot { Index: src/sys/arch/x86/x86/platform.c diff -u src/sys/arch/x86/x86/platform.c:1.15 src/sys/arch/x86/x86/platform.c:1.16 --- src/sys/arch/x86/x86/platform.c:1.15 Wed Mar 26 08:04:19 2014 +++ src/sys/arch/x86/x86/platform.c Tue Dec 25 16:45:02 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: platform.c,v 1.15 2014/03/26 08:04:19 christos Exp $ */ +/* $NetBSD: platform.c,v 1.16 2018/12/25 16:45:02 mlelstv Exp $ */ /*- * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "isa.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: platform.c,v 1.15 2014/03/26 08:04:19 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: platform.c,v 1.16 2018/12/25 16:45:02 mlelstv Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -48,6 +48,8 @@ static int platform_dminode = CTL_EOL; void platform_init(void); /* XXX */ static void platform_add(struct smbtable *, const char *, int); +static void platform_add_word(struct smbtable *, const char *, uint16_t, + const char *); static void platform_add_date(struct smbtable *, const char *, int); static void platform_add_uuid(struct smbtable *, const char *, const uint8_t *); @@ -56,6 +58,7 @@ static void platform_print(void); /* list of private DMI sysctl nodes */ static const char *platform_private_nodes[] = { + "chassis-serial", "board-serial", "system-serial", "system-uuid", @@ -69,6 +72,8 @@ platform_init(void) struct smbios_sys *psys; struct smbios_struct_bios *pbios; struct smbios_board *pboard; + struct smbios_chassis *pchassis; + struct smbios_processor *pproc; struct smbios_slot *pslot; int nisa, nother; @@ -104,6 +109,27 @@ platform_init(void) } smbios.cookie = 0; + if (smbios_find_table(SMBIOS_TYPE_ENCLOSURE, &smbios)) { + pchassis = smbios.tblhdr; + + platform_add(&smbios, "chassis-vendor", pchassis->vendor); + platform_add(&smbios, "chassis-type", pchassis->shape); + platform_add(&smbios, "chassis-version", pchassis->version); + platform_add(&smbios, "chassis-serial", pchassis->serial); + platform_add(&smbios, "chassis-asset-tag", pchassis->asset); + } + + smbios.cookie = 0; + if (smbios_find_table(SMBIOS_TYPE_PROCESSOR, &smbios)) { + pproc = smbios.tblhdr; + + platform_add(&smbios, "processor-vendor", pproc->vendor); + platform_add(&smbios, "processor-version", pproc->version); + platform_add_word(&smbios, "processor-frequency", + pproc->curspeed, " MHz"); + } + + smbios.cookie = 0; nisa = 0; nother = 0; while (smbios_find_table(SMBIOS_TYPE_SLOTS, &smbios)) { @@ -201,6 +227,21 @@ platform_add(struct smbtable *tbl, const } } +static void +platform_add_word(struct smbtable *tbl, const char *key, uint16_t val, + const char *suf) +{ + char tmpbuf[128]; /* XXX is this long enough? */ + + if (snprintf(tmpbuf, sizeof(tmpbuf), "%u%s", val, suf)) { + /* add to platform dictionary */ + pmf_set_platform(key, tmpbuf); + + /* create sysctl node */ + platform_create_sysctl(key); + } +} + static int platform_scan_date(char *buf, unsigned int *month, unsigned int *day, unsigned int *year)