summaryrefslogtreecommitdiff
path: root/sysutils
diff options
context:
space:
mode:
authordrochner <drochner@pkgsrc.org>2012-08-29 17:17:24 +0000
committerdrochner <drochner@pkgsrc.org>2012-08-29 17:17:24 +0000
commit15d6c0ad5c2ceeaf86f7ced6189060e3660905f6 (patch)
tree4e33a25c15c94dec5c087d7fa0286f8a052c032e /sysutils
parent08918524f035fe9afcc27262c56127b95d7ca2c1 (diff)
downloadpkgsrc-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/DESCR9
-rw-r--r--sysutils/intel-microcode-netbsd/Makefile38
-rw-r--r--sysutils/intel-microcode-netbsd/PLIST198
-rw-r--r--sysutils/intel-microcode-netbsd/distinfo5
-rw-r--r--sysutils/intel-microcode-netbsd/files/extract.c164
-rw-r--r--sysutils/intel-microcode-netbsd/files/intel-microcode.sh39
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"