diff options
author | drochner <drochner@pkgsrc.org> | 2012-08-29 17:17:24 +0000 |
---|---|---|
committer | drochner <drochner@pkgsrc.org> | 2012-08-29 17:17:24 +0000 |
commit | 15d6c0ad5c2ceeaf86f7ced6189060e3660905f6 (patch) | |
tree | 4e33a25c15c94dec5c087d7fa0286f8a052c032e /sysutils | |
parent | 08918524f035fe9afcc27262c56127b95d7ca2c1 (diff) | |
download | pkgsrc-15d6c0ad5c2ceeaf86f7ced6189060e3660905f6.tar.gz |
add a pkg which fetches the latest (AFAIK) CPU microcode updates and
prepares a file structure which can be read by the update driver
in netbsd-current
Diffstat (limited to 'sysutils')
-rw-r--r-- | sysutils/intel-microcode-netbsd/DESCR | 9 | ||||
-rw-r--r-- | sysutils/intel-microcode-netbsd/Makefile | 38 | ||||
-rw-r--r-- | sysutils/intel-microcode-netbsd/PLIST | 198 | ||||
-rw-r--r-- | sysutils/intel-microcode-netbsd/distinfo | 5 | ||||
-rw-r--r-- | sysutils/intel-microcode-netbsd/files/extract.c | 164 | ||||
-rw-r--r-- | sysutils/intel-microcode-netbsd/files/intel-microcode.sh | 39 |
6 files changed, 453 insertions, 0 deletions
diff --git a/sysutils/intel-microcode-netbsd/DESCR b/sysutils/intel-microcode-netbsd/DESCR new file mode 100644 index 00000000000..862a766c10e --- /dev/null +++ b/sysutils/intel-microcode-netbsd/DESCR @@ -0,0 +1,9 @@ +The microcode data file contains the latest microcode definitions for all +Intel processors. Intel releases microcode updates to correct processor +behavior as documented in the respective processor specification updates. +While the regular approach to getting this microcode update is via a BIOS +upgrade, Intel realizes that this can be an administrative hassle. The Linux +operating system and VMware ESX products have a mechanism to update the +microcode after booting. For example, this file will be used by the +operating system mechanism if the file is placed in the /etc/firmware +directory of the Linux system. diff --git a/sysutils/intel-microcode-netbsd/Makefile b/sysutils/intel-microcode-netbsd/Makefile new file mode 100644 index 00000000000..735be27c619 --- /dev/null +++ b/sysutils/intel-microcode-netbsd/Makefile @@ -0,0 +1,38 @@ +# $NetBSD: Makefile,v 1.1 2012/08/29 17:17:24 drochner Exp $ +# + +DISTNAME= microcode-20120606 +PKGNAME= intel-microcode-netbsd-20120606 +CATEGORIES= sysutils +MASTER_SITES= http://downloadmirror.intel.com/21385/eng/ +EXTRACT_SUFX= .tgz + +MAINTAINER= drochner@NetBSD.org +HOMEPAGE= http://downloadmirror.intel.com/21385/eng/ +COMMENT= Firmware updates for Intel x86 processors +#LICENSE= # TODO: (see mk/license.mk) + +PKG_DESTDIR_SUPPORT= user-destdir + +ONLY_FOR_PLATFORM+= NetBSD-6.99.*-i386 +ONLY_FOR_PLATFORM+= NetBSD-6.99.*-amd64 + +WRKSRC= ${WRKDIR} +USE_LANGUAGES= c + +FWDIR= libdata/firmware/cpu_x86_intel1 +INSTALLATION_DIRS+= ${FWDIR} + +RCD_SCRIPTS+= intel-microcode + +post-extract: + ${CP} ${FILESDIR}/extract.c ${WRKSRC} + +do-build: + cd ${WRKSRC} && ${CC} extract.c -o extract + +do-install: + cd ${DESTDIR}${PREFIX}/${FWDIR} && \ + ${WRKSRC}/extract ${WRKSRC}/microcode.dat + +.include "../../mk/bsd.pkg.mk" diff --git a/sysutils/intel-microcode-netbsd/PLIST b/sysutils/intel-microcode-netbsd/PLIST new file mode 100644 index 00000000000..01ff2a9c625 --- /dev/null +++ b/sysutils/intel-microcode-netbsd/PLIST @@ -0,0 +1,198 @@ +@comment $NetBSD: PLIST,v 1.1 2012/08/29 17:17:24 drochner Exp $ +libdata/firmware/cpu_x86_intel1/00000650-0 +libdata/firmware/cpu_x86_intel1/00000650-1 +libdata/firmware/cpu_x86_intel1/00000650-3 +libdata/firmware/cpu_x86_intel1/00000651-0 +libdata/firmware/cpu_x86_intel1/00000652-0 +libdata/firmware/cpu_x86_intel1/00000652-1 +libdata/firmware/cpu_x86_intel1/00000652-2 +libdata/firmware/cpu_x86_intel1/00000653-0 +libdata/firmware/cpu_x86_intel1/00000653-1 +libdata/firmware/cpu_x86_intel1/00000653-2 +libdata/firmware/cpu_x86_intel1/00000653-3 +libdata/firmware/cpu_x86_intel1/00000660-0 +libdata/firmware/cpu_x86_intel1/00000665-4 +libdata/firmware/cpu_x86_intel1/0000066a-1 +libdata/firmware/cpu_x86_intel1/0000066a-3 +libdata/firmware/cpu_x86_intel1/0000066a-5 +libdata/firmware/cpu_x86_intel1/0000066d-1 +libdata/firmware/cpu_x86_intel1/0000066d-3 +libdata/firmware/cpu_x86_intel1/0000066d-5 +libdata/firmware/cpu_x86_intel1/00000671-2 +libdata/firmware/cpu_x86_intel1/00000672-2 +libdata/firmware/cpu_x86_intel1/00000673-2 +libdata/firmware/cpu_x86_intel1/00000681-0 +libdata/firmware/cpu_x86_intel1/00000681-2 +libdata/firmware/cpu_x86_intel1/00000681-3 +libdata/firmware/cpu_x86_intel1/00000681-4 +libdata/firmware/cpu_x86_intel1/00000681-5 +libdata/firmware/cpu_x86_intel1/00000683-3 +libdata/firmware/cpu_x86_intel1/00000683-5 +libdata/firmware/cpu_x86_intel1/00000686-0 +libdata/firmware/cpu_x86_intel1/00000686-1 +libdata/firmware/cpu_x86_intel1/00000686-2 +libdata/firmware/cpu_x86_intel1/00000686-4 +libdata/firmware/cpu_x86_intel1/00000686-7 +libdata/firmware/cpu_x86_intel1/0000068a-4 +libdata/firmware/cpu_x86_intel1/0000068a-5 +libdata/firmware/cpu_x86_intel1/0000068a-7 +libdata/firmware/cpu_x86_intel1/00000695-4 +libdata/firmware/cpu_x86_intel1/00000695-5 +libdata/firmware/cpu_x86_intel1/00000695-7 +libdata/firmware/cpu_x86_intel1/000006a0-2 +libdata/firmware/cpu_x86_intel1/000006a1-2 +libdata/firmware/cpu_x86_intel1/000006b1-4 +libdata/firmware/cpu_x86_intel1/000006b1-5 +libdata/firmware/cpu_x86_intel1/000006b4-4 +libdata/firmware/cpu_x86_intel1/000006b4-5 +libdata/firmware/cpu_x86_intel1/000006d6-5 +libdata/firmware/cpu_x86_intel1/000006e8-5 +libdata/firmware/cpu_x86_intel1/000006ec-5 +libdata/firmware/cpu_x86_intel1/000006ec-7 +libdata/firmware/cpu_x86_intel1/000006f2-0 +libdata/firmware/cpu_x86_intel1/000006f2-5 +libdata/firmware/cpu_x86_intel1/000006f6-0 +libdata/firmware/cpu_x86_intel1/000006f6-2 +libdata/firmware/cpu_x86_intel1/000006f6-5 +libdata/firmware/cpu_x86_intel1/000006f7-4 +libdata/firmware/cpu_x86_intel1/000006f7-6 +libdata/firmware/cpu_x86_intel1/000006fa-7 +libdata/firmware/cpu_x86_intel1/000006fb-0 +libdata/firmware/cpu_x86_intel1/000006fb-2 +libdata/firmware/cpu_x86_intel1/000006fb-3 +libdata/firmware/cpu_x86_intel1/000006fb-4 +libdata/firmware/cpu_x86_intel1/000006fb-5 +libdata/firmware/cpu_x86_intel1/000006fb-6 +libdata/firmware/cpu_x86_intel1/000006fb-7 +libdata/firmware/cpu_x86_intel1/000006fd-0 +libdata/firmware/cpu_x86_intel1/000006fd-5 +libdata/firmware/cpu_x86_intel1/000006fd-7 +libdata/firmware/cpu_x86_intel1/00000f07-0 +libdata/firmware/cpu_x86_intel1/00000f07-1 +libdata/firmware/cpu_x86_intel1/00000f0a-0 +libdata/firmware/cpu_x86_intel1/00000f0a-1 +libdata/firmware/cpu_x86_intel1/00000f0a-2 +libdata/firmware/cpu_x86_intel1/00000f12-2 +libdata/firmware/cpu_x86_intel1/00000f24-1 +libdata/firmware/cpu_x86_intel1/00000f24-2 +libdata/firmware/cpu_x86_intel1/00000f24-4 +libdata/firmware/cpu_x86_intel1/00000f25-0 +libdata/firmware/cpu_x86_intel1/00000f25-1 +libdata/firmware/cpu_x86_intel1/00000f25-2 +libdata/firmware/cpu_x86_intel1/00000f25-4 +libdata/firmware/cpu_x86_intel1/00000f26-1 +libdata/firmware/cpu_x86_intel1/00000f27-1 +libdata/firmware/cpu_x86_intel1/00000f27-2 +libdata/firmware/cpu_x86_intel1/00000f27-3 +libdata/firmware/cpu_x86_intel1/00000f29-1 +libdata/firmware/cpu_x86_intel1/00000f29-2 +libdata/firmware/cpu_x86_intel1/00000f29-3 +libdata/firmware/cpu_x86_intel1/00000f32-0 +libdata/firmware/cpu_x86_intel1/00000f32-2 +libdata/firmware/cpu_x86_intel1/00000f32-3 +libdata/firmware/cpu_x86_intel1/00000f33-0 +libdata/firmware/cpu_x86_intel1/00000f33-2 +libdata/firmware/cpu_x86_intel1/00000f33-3 +libdata/firmware/cpu_x86_intel1/00000f34-0 +libdata/firmware/cpu_x86_intel1/00000f34-2 +libdata/firmware/cpu_x86_intel1/00000f34-3 +libdata/firmware/cpu_x86_intel1/00000f34-4 +libdata/firmware/cpu_x86_intel1/00000f41-0 +libdata/firmware/cpu_x86_intel1/00000f41-1 +libdata/firmware/cpu_x86_intel1/00000f41-2 +libdata/firmware/cpu_x86_intel1/00000f41-3 +libdata/firmware/cpu_x86_intel1/00000f41-4 +libdata/firmware/cpu_x86_intel1/00000f41-5 +libdata/firmware/cpu_x86_intel1/00000f41-7 +libdata/firmware/cpu_x86_intel1/00000f43-0 +libdata/firmware/cpu_x86_intel1/00000f43-2 +libdata/firmware/cpu_x86_intel1/00000f43-3 +libdata/firmware/cpu_x86_intel1/00000f43-4 +libdata/firmware/cpu_x86_intel1/00000f43-7 +libdata/firmware/cpu_x86_intel1/00000f44-0 +libdata/firmware/cpu_x86_intel1/00000f44-2 +libdata/firmware/cpu_x86_intel1/00000f44-3 +libdata/firmware/cpu_x86_intel1/00000f44-4 +libdata/firmware/cpu_x86_intel1/00000f44-7 +libdata/firmware/cpu_x86_intel1/00000f47-0 +libdata/firmware/cpu_x86_intel1/00000f47-2 +libdata/firmware/cpu_x86_intel1/00000f47-3 +libdata/firmware/cpu_x86_intel1/00000f47-4 +libdata/firmware/cpu_x86_intel1/00000f47-7 +libdata/firmware/cpu_x86_intel1/00000f48-0 +libdata/firmware/cpu_x86_intel1/00000f48-1 +libdata/firmware/cpu_x86_intel1/00000f48-2 +libdata/firmware/cpu_x86_intel1/00000f48-3 +libdata/firmware/cpu_x86_intel1/00000f48-4 +libdata/firmware/cpu_x86_intel1/00000f48-6 +libdata/firmware/cpu_x86_intel1/00000f49-0 +libdata/firmware/cpu_x86_intel1/00000f49-2 +libdata/firmware/cpu_x86_intel1/00000f49-3 +libdata/firmware/cpu_x86_intel1/00000f49-4 +libdata/firmware/cpu_x86_intel1/00000f49-5 +libdata/firmware/cpu_x86_intel1/00000f49-7 +libdata/firmware/cpu_x86_intel1/00000f4a-0 +libdata/firmware/cpu_x86_intel1/00000f4a-2 +libdata/firmware/cpu_x86_intel1/00000f4a-3 +libdata/firmware/cpu_x86_intel1/00000f4a-4 +libdata/firmware/cpu_x86_intel1/00000f4a-6 +libdata/firmware/cpu_x86_intel1/00000f62-2 +libdata/firmware/cpu_x86_intel1/00000f64-0 +libdata/firmware/cpu_x86_intel1/00000f64-2 +libdata/firmware/cpu_x86_intel1/00000f64-4 +libdata/firmware/cpu_x86_intel1/00000f64-5 +libdata/firmware/cpu_x86_intel1/00000f65-0 +libdata/firmware/cpu_x86_intel1/00000f68-1 +libdata/firmware/cpu_x86_intel1/00000f68-5 +libdata/firmware/cpu_x86_intel1/00010661-0 +libdata/firmware/cpu_x86_intel1/00010661-1 +libdata/firmware/cpu_x86_intel1/00010661-7 +libdata/firmware/cpu_x86_intel1/00010676-0 +libdata/firmware/cpu_x86_intel1/00010676-2 +libdata/firmware/cpu_x86_intel1/00010676-4 +libdata/firmware/cpu_x86_intel1/00010676-6 +libdata/firmware/cpu_x86_intel1/00010676-7 +libdata/firmware/cpu_x86_intel1/00010677-4 +libdata/firmware/cpu_x86_intel1/0001067a-0 +libdata/firmware/cpu_x86_intel1/0001067a-2 +libdata/firmware/cpu_x86_intel1/0001067a-4 +libdata/firmware/cpu_x86_intel1/0001067a-5 +libdata/firmware/cpu_x86_intel1/0001067a-6 +libdata/firmware/cpu_x86_intel1/0001067a-7 +libdata/firmware/cpu_x86_intel1/000106a4-0 +libdata/firmware/cpu_x86_intel1/000106a4-1 +libdata/firmware/cpu_x86_intel1/000106c2-0 +libdata/firmware/cpu_x86_intel1/000106c2-2 +libdata/firmware/cpu_x86_intel1/000106c2-3 +libdata/firmware/cpu_x86_intel1/000106ca-0 +libdata/firmware/cpu_x86_intel1/000106ca-2 +libdata/firmware/cpu_x86_intel1/000106ca-3 +libdata/firmware/cpu_x86_intel1/000106ca-4 +libdata/firmware/cpu_x86_intel1/000106d1-3 +libdata/firmware/cpu_x86_intel1/000106e4-0 +libdata/firmware/cpu_x86_intel1/000106e4-3 +libdata/firmware/cpu_x86_intel1/000106e5-0 +libdata/firmware/cpu_x86_intel1/000106e5-1 +libdata/firmware/cpu_x86_intel1/000106e5-4 +libdata/firmware/cpu_x86_intel1/00020652-1 +libdata/firmware/cpu_x86_intel1/00020652-4 +libdata/firmware/cpu_x86_intel1/00020655-1 +libdata/firmware/cpu_x86_intel1/00020655-4 +libdata/firmware/cpu_x86_intel1/00020655-7 +libdata/firmware/cpu_x86_intel1/00020661-0 +libdata/firmware/cpu_x86_intel1/00020661-1 +libdata/firmware/cpu_x86_intel1/000206a7-1 +libdata/firmware/cpu_x86_intel1/000206a7-4 +libdata/firmware/cpu_x86_intel1/000206d6-0 +libdata/firmware/cpu_x86_intel1/000206d6-2 +libdata/firmware/cpu_x86_intel1/000206d6-3 +libdata/firmware/cpu_x86_intel1/000206d6-5 +libdata/firmware/cpu_x86_intel1/000206d6-6 +libdata/firmware/cpu_x86_intel1/000206d7-0 +libdata/firmware/cpu_x86_intel1/000206d7-2 +libdata/firmware/cpu_x86_intel1/000206d7-3 +libdata/firmware/cpu_x86_intel1/000206d7-5 +libdata/firmware/cpu_x86_intel1/000206d7-6 +libdata/firmware/cpu_x86_intel1/000306a9-1 +libdata/firmware/cpu_x86_intel1/000306a9-4 +share/examples/rc.d/intel-microcode diff --git a/sysutils/intel-microcode-netbsd/distinfo b/sysutils/intel-microcode-netbsd/distinfo new file mode 100644 index 00000000000..86389259196 --- /dev/null +++ b/sysutils/intel-microcode-netbsd/distinfo @@ -0,0 +1,5 @@ +$NetBSD: distinfo,v 1.1 2012/08/29 17:17:24 drochner Exp $ + +SHA1 (microcode-20120606.tgz) = 3876f10f1baf33afdde7133cbe98877f21f0454e +RMD160 (microcode-20120606.tgz) = 8a60e790e71b019e0cde8688fb099af8afdbae43 +Size (microcode-20120606.tgz) = 588345 bytes diff --git a/sysutils/intel-microcode-netbsd/files/extract.c b/sysutils/intel-microcode-netbsd/files/extract.c new file mode 100644 index 00000000000..586e11eb6a8 --- /dev/null +++ b/sysutils/intel-microcode-netbsd/files/extract.c @@ -0,0 +1,164 @@ +/* $NetBSD: extract.c,v 1.1 2012/08/29 17:17:24 drochner Exp $ */ + +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <err.h> + +#include <x86/cpu_ucode.h> + +FILE *in; +int lc; + +static int +getbin(void *buf, int len) +{ + char lbuf[100], *l; + uint32_t b[4]; + int n; + + while ((l = fgets(lbuf, sizeof(lbuf), in))) { + lc++; + if (l[0] == '/') + continue; + n = sscanf(l, "0x%x, 0x%x, 0x%x, 0x%x,", + &b[0], &b[1], &b[2], &b[3]); + if (n != 4) + errx(3, "can't digest line %d", lc); + + if (len < 16) + errx(3, "wrong size assumption"); + memcpy(buf, b, 16); + len -= 16; + if (len == 0) + return 0; + buf = (char *)buf + 16; + } + + return (-1); +} + +static int +isnewer(const char *fn, int rev) +{ + int fd; + struct intel1_ucode_header uh; + + fd = open(fn, O_RDONLY, 0); + if (fd < 0) + err(2, "open %s", fn); + read(fd, &uh, sizeof(uh)); + close(fd); + + return (uh.uh_rev > rev); +} + +static int +link_unless_newer_exists(const char *name, const char *alias, int rev) +{ +again: + if (link(name, alias) == 0) { + printf("link %s->%s\n", alias, name); + return 1; + } + if (errno != EEXIST) + err(2, "link %s->%s", alias, name); + if (isnewer(alias, rev)) + return 0; + printf("replacing %s\n", alias); + if (unlink(alias)) + err(2, "unlink %s", alias); + goto again; +} + +static void +writeout(struct intel1_ucode_header *uh, int len, + struct intel1_ucode_ext_table *eh) +{ + char name[18], alias[11]; + int fd, used, i, j; + struct intel1_ucode_proc_signature *eps; + + sprintf(name, "%08x.%08x", uh->uh_signature, uh->uh_rev); + fd = open(name, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644); + if (fd < 0) + err(2, "open %s", name); + write(fd, uh, len); + close(fd); + + used = 0; + for (i = 0; i < 8; i++) { + if (!(uh->uh_proc_flags & (1 << i))) + continue; + sprintf(alias, "%08x-%d", uh->uh_signature, i); + used += link_unless_newer_exists(name, alias, uh->uh_rev); + } + if (eh) { + /* extension headers are unused in rev. 20120606 */ + for (j = 0; j < eh->uet_count; j++) { + eps = &eh->uet_proc_sig[j]; + for (i = 0; i < 8; i++) { + if (!(eps->ups_proc_flags & (1 << i))) + continue; + sprintf(alias, "%08x-%d", + eps->ups_signature, i); + used += link_unless_newer_exists(name, alias, + uh->uh_rev); + } + } + } + + unlink(name); + printf("%s: %d links\n", name, used); +} + +int +main(int argc, char **argv) +{ + struct intel1_ucode_header uh; + int datasize, totalsize; + void *theupdate; + struct intel1_ucode_ext_table *eh; + + if (argc < 2) + errx(1, "need filename"); + + in = fopen(argv[1], "r"); + if (!in) + err(2, "could not open \"%s\"", argv[1]); + + for (;;) { + if (getbin(&uh, sizeof(uh)) < 0) + break; + if (uh.uh_header_ver != 1) + errx(3, "wrong file format, last line %d", lc); + if (uh.uh_data_size) + datasize = uh.uh_data_size; + else + datasize = 2000; + if (uh.uh_total_size) + totalsize = uh.uh_total_size; + else + totalsize = datasize + 48; + + theupdate = malloc(totalsize); + memcpy(theupdate, &uh, 48); + if (getbin((char *)theupdate + 48, totalsize - 48) < 0) + errx(3, "data format"); + + if (totalsize != datasize + 48) + eh = (void *)((char *)theupdate + 48 + datasize); + else + eh = NULL; + + writeout(theupdate, totalsize, eh); + free(theupdate); + + } + + fclose(in); + exit(0); +} diff --git a/sysutils/intel-microcode-netbsd/files/intel-microcode.sh b/sysutils/intel-microcode-netbsd/files/intel-microcode.sh new file mode 100644 index 00000000000..9cb27373e19 --- /dev/null +++ b/sysutils/intel-microcode-netbsd/files/intel-microcode.sh @@ -0,0 +1,39 @@ +#!@RCD_SCRIPTS_SHELL@ + +# PROVIDE: microcode +# REQUIRE: mountall +# +# attempts microcode update on all CPU cores (for Intel x86) +# + +$_rc_subr_loaded . /etc/rc.subr + +name=microcode +rcvar=$name +start_cmd="microcode_start" + +_microcode_baremetal() +{ + ncpu=`/sbin/sysctl -n hw.ncpu` + + for i in `/usr/bin/jot - 0 \`expr $ncpu - 1\` 1`; do + /usr/sbin/cpuctl ucode $i || true + done +} + +_microcode_xen() +{ + /usr/sbin/cpuctl ucode || true +} + +microcode_start() +{ + if [ -e /kern/xen/privcmd ]; then + _microcode_xen + else + _microcode_baremetal + fi +} + +load_rc_config $name +run_rc_command "$1" |