pkgsrc-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[pkgsrc/trunk]: pkgsrc/sysutils/intel-microcode-netbsd/files If the microcode...
details: https://anonhg.NetBSD.org/pkgsrc/rev/422c8c5c7475
branches: trunk
changeset: 379879:422c8c5c7475
user: msaitoh <msaitoh%pkgsrc.org@localhost>
date: Mon May 07 04:27:43 2018 +0000
description:
If the microcode.dat file is not bundled in the archive file, extract from
binary files. I verified the output from both microcode-20180312.tgz's
microcode.dat and intel-ucode/??-??-?? are the same.
This change is required for microcode-20180425.tgz.
diffstat:
sysutils/intel-microcode-netbsd/files/extract.c | 152 +++++++++++++++++++++---
1 files changed, 133 insertions(+), 19 deletions(-)
diffs (204 lines):
diff -r 405a4be4bfc6 -r 422c8c5c7475 sysutils/intel-microcode-netbsd/files/extract.c
--- a/sysutils/intel-microcode-netbsd/files/extract.c Sun May 06 22:21:45 2018 +0000
+++ b/sysutils/intel-microcode-netbsd/files/extract.c Mon May 07 04:27:43 2018 +0000
@@ -1,5 +1,6 @@
-/* $NetBSD: extract.c,v 1.3 2014/02/19 19:31:08 drochner Exp $ */
+/* $NetBSD: extract.c,v 1.4 2018/05/07 04:27:43 msaitoh Exp $ */
+#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
@@ -81,12 +82,15 @@
char name[18], alias[11];
int fd, used, i, j;
struct intel1_ucode_proc_signature *eps;
+ int rv;
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);
+ rv = write(fd, uh, len);
+ if (rv == -1)
+ err(EXIT_FAILURE, "failed to write %s\n", name);
close(fd);
used = 0;
@@ -97,7 +101,7 @@
used += link_unless_newer_exists(name, alias, uh->uh_rev);
}
if (eh) {
- /* extension headers are unused in rev. 20140122 */
+ printf("%s: Check the extended header.\n", __func__);
for (j = 0; j < eh->uet_count; j++) {
eps = &eh->uet_proc_sig[j];
for (i = 0; i < 8; i++) {
@@ -115,34 +119,40 @@
printf("%s: %d links\n", name, used);
}
+void
+update_size(struct intel1_ucode_header *uh,
+ uint32_t *datasize, uint32_t *totalsize)
+{
+ 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;
+}
+
+/* Extract .dat (or .inc) file. Usually for microcode.dat. */
int
-main(int argc, char **argv)
+extract_dat(const char *fname)
{
struct intel1_ucode_header uh;
- int datasize, totalsize;
+ uint32_t datasize, totalsize;
void *theupdate;
struct intel1_ucode_ext_table *eh;
- if (argc < 2)
- errx(1, "need filename");
-
- in = fopen(argv[1], "r");
+ in = fopen(fname, "r");
if (!in)
- err(2, "could not open \"%s\"", argv[1]);
+ err(2, "could not open \"%s\"", fname);
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;
+
+ update_size(&uh, &datasize, &totalsize);
theupdate = malloc(totalsize);
memcpy(theupdate, &uh, 48);
@@ -160,5 +170,109 @@
}
fclose(in);
- exit(0);
+
+ return 0;
}
+
+/* Extract binary files (UV-WX-YZ style filename) */
+int
+extract_bin(int argc, char **argv)
+{
+ struct intel1_ucode_header *uh;
+ uint32_t datasize, totalsize;
+ void *theupdate, *buf;
+ struct intel1_ucode_ext_table *eh;
+ struct stat sb;
+ size_t left;
+ int i, rv;
+
+ argv++; /* Skip argc[0] (command name). */
+
+ for (i = 1; i < argc; i++, argv++) {
+ rv = stat(*argv, &sb);
+ if (rv != 0)
+ err(EXIT_FAILURE, "failed to stat \"%s\"", *argv);
+
+ theupdate = buf = malloc(sb.st_size);
+ if (theupdate == NULL)
+ err(EXIT_FAILURE,
+ "failed to alloc buf for \"%s\" (size = %zu)",
+ *argv, sb.st_size);
+
+ in = fopen(*argv, "r");
+ if (!in)
+ err(EXIT_FAILURE, "could not open \"%s\"", *argv);
+
+ rv = fread(theupdate, sizeof(char), sb.st_size, in);
+ if (rv != sb.st_size)
+ err(EXIT_FAILURE,
+ "failed to read \"%s\" (size = %zu)",
+ *argv, sb.st_size);
+ left = sb.st_size;
+next:
+ uh = (struct intel1_ucode_header *)theupdate;
+
+#if 0 /* Dump header */
+ for (int j = 0; j < sizeof(struct intel1_ucode_header) / 4;
+ j++) {
+ uint32_t *q = (uint32_t *)uh;
+
+ if ((j % 4) == 0)
+ printf("%08x:", j);
+ printf(" %08x", q[j]);
+ if ((j % 4) == 3)
+ printf("\n");
+ }
+ printf("\n");
+#endif
+
+ if (uh->uh_header_ver != 1)
+ errx(EXIT_FAILURE,
+ "wrong file format, last line %d", lc);
+
+ update_size(uh, &datasize, &totalsize);
+
+ if (totalsize != datasize + 48)
+ eh = (void *)((char *)theupdate + 48 + datasize);
+ else
+ eh = NULL;
+
+ writeout(theupdate, totalsize, eh);
+
+ if ((eh == NULL) && (totalsize != left)) {
+ printf("file = %s. size in headers (%u) != file size "
+ "left (%zu). This file has multiple entries "
+ "without the extended signature stucture.\n",
+ *argv, totalsize, left);
+ theupdate += totalsize;
+ left -= totalsize;
+ goto next;
+ }
+
+ free(buf);
+ fclose(in);
+ }
+
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ const char *p;
+ int rv;
+
+ if (argc < 2)
+ errx(1, "need filename");
+
+ p = strchr(argv[1], '.');
+ if ((p != NULL) && (strcmp(p + 1, "dat") == 0)) {
+ /* Extract microcode.dat file */
+ rv = extract_dat(argv[1]);
+ } else {
+ /* Extract UV-WX-YZ files */
+ rv = extract_bin(argc, argv);
+ }
+
+ return rv;
+}
Home |
Main Index |
Thread Index |
Old Index