From 458db8dbecb6979a73a46d8e2106968995c6d0a7 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Sun, 27 Feb 2011 16:47:49 +0100 Subject: [PATCH] Added microcode_ctl-1.17 build template. --- srcpkgs/microcode_ctl/files/microcode_ctl.rc | 32 +++ .../patches/microcode.ctl_1.17-13.diff | 264 ++++++++++++++++++ srcpkgs/microcode_ctl/template | 40 +++ 3 files changed, 336 insertions(+) create mode 100644 srcpkgs/microcode_ctl/files/microcode_ctl.rc create mode 100644 srcpkgs/microcode_ctl/patches/microcode.ctl_1.17-13.diff create mode 100644 srcpkgs/microcode_ctl/template diff --git a/srcpkgs/microcode_ctl/files/microcode_ctl.rc b/srcpkgs/microcode_ctl/files/microcode_ctl.rc new file mode 100644 index 0000000000..c0a0881f5b --- /dev/null +++ b/srcpkgs/microcode_ctl/files/microcode_ctl.rc @@ -0,0 +1,32 @@ +#!/sbin/runscript + +: ${MICROCODE_DEVICE:=/dev/cpu/microcode} +: ${MICROCODE_FILE:=/lib/firmware/intel-microcode.dat} + +depend() +{ + need localmount + before * +} + +start() +{ + local modloaded + + einfo "Applying Intel CPU microcode update" + if [ ! -c ${MICROCODE_DEVICE} ]; then + modprobe -q microcode + if [ $? -ne 0 ]; then + eerror "failed to load microcode module" + fi + + fi + if [ ! -f ${MICROCODE_FILE} ]; then + eerror "cannot find microcode file" + fi + microcode_ctl -Q -f ${MICROCODE_FILE} + if [ $? -eq 0 ]; then + modprobe -q -r microcode + fi + eend $? +} diff --git a/srcpkgs/microcode_ctl/patches/microcode.ctl_1.17-13.diff b/srcpkgs/microcode_ctl/patches/microcode.ctl_1.17-13.diff new file mode 100644 index 0000000000..f6ea936070 --- /dev/null +++ b/srcpkgs/microcode_ctl/patches/microcode.ctl_1.17-13.diff @@ -0,0 +1,264 @@ +--- microcode.ctl-1.17.orig/microcode_ctl.c ++++ microcode.ctl-1.17/microcode_ctl.c +@@ -18,28 +18,30 @@ + #include + + static char *progname; +-int print_normal_messages=1; +-int print_error_messages=1; ++static int print_normal_messages=1; ++static int print_error_messages=1; + + #define BUFFER_SIZE 4096 +-#define MAX_MICROCODE 2000000 ++#define MICROCODE_SIZE (128*1024) /* initial size, expanded as needed */ ++#define FILENAME_MAXLEN 2048 + + #define MICROCODE_DEVICE_DEFAULT "/dev/cpu/microcode" +-#define MICROCODE_FILE_DEFAULT "/etc/microcode.dat" ++#define MICROCODE_FILE_DEFAULT "/lib/firmware/intel-microcode.dat" + +-static void usage(void) ++ ++static void usage(FILE *file) + { +- fprintf(stderr, "\nThis program is for updating the microcode on Intel processors\n" +- "belonging to the IA32 family - PentiumPro upwards (x86_64 included).\n" +- "It depends on the Linux kernel microcode driver.\n\n" +- "Usage: %s [-h] [-u] [-q] [-Q] [-f microcode]\n\n" +- " -h this usage message\n" +- " -q run silently when successful\n" +- " -Q run silently even on failure\n" +- " -u upload microcode (default filename:\"%s\"\n" +- " -f upload microcode from named Intel formatted file\n\n", +- progname, MICROCODE_FILE_DEFAULT); +- exit(1); ++ fputs( ++"\nThis program is for updating the microcode on Intel processors\n" ++"belonging to the IA32 family - PentiumPro upwards (x86_64 included).\n" ++"It depends on the Linux kernel microcode driver.\n\n" ++"Usage: microcode_ctl [-h] [-u] [-q] [-Q] [-f microcode]\n\n" ++" -h this usage message\n" ++" -q run silently when successful\n" ++" -Q run silently even on failure\n" ++" -u upload microcode (default filename:\""MICROCODE_FILE_DEFAULT"\"\n" ++" -f upload microcode from named Intel formatted file\n\n", ++ file); + } + + /* +@@ -52,45 +54,66 @@ + { + FILE *fp; + char line_buffer[BUFFER_SIZE]; +- int microcode[MAX_MICROCODE]; +- int *pos; ++ size_t microcode_size = MICROCODE_SIZE/sizeof(unsigned); ++ unsigned *microcode = malloc(microcode_size * sizeof(unsigned)); ++ size_t pos = 0; + int outfd; + int wrote, length; + ++ if(!microcode){ ++ if(print_error_messages) ++ fprintf(stderr, "%s: not enough memory\n", progname); ++ return ENOMEM; ++ } + + if( (fp=fopen(filename, "r")) == NULL){ + if(print_error_messages) +- fprintf(stderr, "%s: cannot open source file '%s' errno=%d (%s)\n", ++ fprintf(stderr, ++ "%s: cannot open source file '%s' errno=%d (%s)\n", + progname, filename, errno, strerror(errno)); + return errno; + } + +- pos = microcode; +- + while(fgets(line_buffer, BUFFER_SIZE, fp) != NULL) { ++ /* ++ * Expand microcode buffer if needed ++ */ ++ if(microcode_size < pos + 4) { ++ microcode_size *= 2; ++ microcode = realloc(microcode, ++ microcode_size * sizeof(unsigned)); ++ if (!microcode) { ++ if(print_error_messages) ++ fprintf(stderr, "%s: not enough memory\n", ++ progname); ++ fclose(fp); ++ return ENOMEM; ++ } ++ } + /* + * Data lines will are of the form "%x, %x, %x, %x", therefore + * lines start with a 0 + */ + if(*line_buffer == '0'){ +- sscanf(line_buffer, "%x, %x, %x, %x", pos, +- (pos + 1), (pos + 2), (pos + 3)); +- pos += 4; ++ int scanned; ++ scanned = sscanf(line_buffer, "%x, %x, %x, %x", ++ microcode + pos, ++ microcode + pos + 1, ++ microcode + pos + 2, ++ microcode + pos + 3); ++ if(scanned != 4) { ++ fprintf(stderr, "%s: %s: invalid file format\n", ++ progname, filename); ++ fclose(fp); ++ return EINVAL; ++ } ++ pos += 4; + } +- +- if (MAX_MICROCODE < (pos - microcode)){ +- /* not checking the buffer length could cause grief? */ +- if(print_error_messages) +- fprintf(stderr, "%s: file too large for utility microcode buffer\n" +- "%s: change MAX_MICROCODE yourself :)\n", progname, progname); +- fclose(fp); +- return errno; +- } +- + } + + fclose(fp); +- length = sizeof(int) * (pos - microcode); ++ length = pos * sizeof(unsigned); ++ + if(print_normal_messages) + fprintf(stderr, "%s: writing microcode (length: %d)\n", progname, length); + +@@ -101,7 +124,7 @@ + return errno; + } + +- if( (wrote = write(outfd, µcode, length)) < 0){ ++ if( (wrote = write(outfd, microcode, length)) < 0){ + if(print_error_messages) + fprintf(stderr, "%s: error writing to '%s' errno=%d (%s)\n" + "%s: there may be messages from the driver in your system log.\n", +@@ -122,20 +145,17 @@ + int main(int argc, char *argv[]) + { + int c; +- static char device[2048]; +- static char filename[2048]; ++ static char device[FILENAME_MAXLEN+1] = MICROCODE_DEVICE_DEFAULT; ++ static char filename[FILENAME_MAXLEN+1] = MICROCODE_FILE_DEFAULT; + int upload=0; +- int return_code; + + progname = argv[0]; + +- strcpy(device, MICROCODE_DEVICE_DEFAULT); +- strcpy(filename, MICROCODE_FILE_DEFAULT); +- +- while (EOF != (c = getopt(argc, argv, "hqQud:f:"))) { ++ while (EOF != (c = getopt(argc, argv, "-hqQiud:f:"))) { + switch(c) { + case 'h': +- usage(); ++ usage(stdout); ++ exit(0); + + case 'q': + print_normal_messages=0; +@@ -147,7 +167,7 @@ + break; + + case 'd': +- strcpy(device, optarg); ++ strncpy(device, optarg, FILENAME_MAXLEN); + break; + + case 'u': /* do a microcode upload */ +@@ -156,19 +176,25 @@ + + case 'f': /* set microcode file to optarg and upload */ + upload++; +- strcpy(filename, optarg); ++ strncpy(filename, optarg, FILENAME_MAXLEN); ++ break; ++ case 'i': ++ fputs("microcode_ctl: flag '-i' is now obsolete", ++ stderr); + break; +- + case '?': +- usage(); ++ case 1: ++ usage(stdout); ++ exit(2); ++ + } + } + + if (upload) { +- if((return_code = do_update(device, filename))) +- exit(return_code); ++ if(do_update(device, filename)) ++ exit(1); + } else +- usage(); ++ usage(stderr); + + return 0; + } +--- microcode.ctl-1.17.orig/microcode_ctl.8 ++++ microcode.ctl-1.17/microcode_ctl.8 +@@ -4,13 +4,13 @@ + microcode_ctl \- microcode utility for Intel IA32 processors + .SH SYNOPSIS + .B microcode_ctl +-[\fI\-h\fR] [\fI\-u\fR [\fI\-q\fR]] [\fI\-Q\fR] [\fI\-f microcode\fR] ++[\fI\-h\fR] [\fI\-u\fR] [\fI\-q\fR] [\fI\-Q\fR] [\fI\-f microcode\fR] + .br + .SH DESCRIPTION +-." Add any additional description here +-.PP +-The microcode_ctl utility is a companion to the IA32 microcode driver written +-by Tigran Aivazian . The uaility has two uses: ++The ++.B microcode_ctl ++utility is a companion to the IA32 microcode driver written ++by Tigran Aivazian . The utility has two uses: + .br + .PP + \fBa)\fR it decodes and sends new microcode to the kernel driver to be +@@ -49,14 +49,14 @@ + Upload microcode using defaults + .SH FILES + .TP +-/etc/microcode.dat ++/lib/firmware/intel-microcode.dat + The default microcode location + .PD + .SH AUTHOR + Microcode utility written by Simon Trimmer + .br + Linux Kernel driver written by Tigran Aivazian. +-.SH "REPORTING BUGS" ++.SH REPORTING BUGS + Report bugs to either Simon Trimmer or + Tigran Aivazian + .SH COPYRIGHT +@@ -64,12 +64,12 @@ + .br + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-.SH "SPECIAL THANKS" ++.SH SPECIAL THANKS + Thanks to the Intel Corporation, for supplying microcode update data and + publishing the specifications that enabled us to write microcode driver for + Linux. + .br +-.SH "SEE ALSO" ++.SH SEE ALSO + The brave are recommended to view the driver source code located in the + Linux Kernel source tree in arch/i386/kernel/microcode.c + .PP diff --git a/srcpkgs/microcode_ctl/template b/srcpkgs/microcode_ctl/template new file mode 100644 index 0000000000..7d28f06277 --- /dev/null +++ b/srcpkgs/microcode_ctl/template @@ -0,0 +1,40 @@ +# Template file for 'microcode_ctl' +pkgname=microcode_ctl +version=1.17 +patch_args="-Np1" +distfiles="http://www.urbanmyth.org/microcode/$pkgname-$version.tar.gz" +short_desc="Intel IA32/IA64 CPU Microcode Utility" +build_style=custom-install +make_install_args="PREFIX=/usr MANDIR=/usr/share/man/man8" +maintainer="Juan RP " +checksum=41ef081c3a2649ca012714a3e2034d748612b1a8f007aa275f395f81cb230bb7 +long_desc=" + The microcode_ctl utility is a companion to the IA32 microcode driver: + + - it decodes and sends new microcode to the kernel driver for Intel IA32 + family (Pentium Pro, PII, Celeron, PIII, Xeon, Pentium 4, etc.) and + Intel x86_64 family processors; + - it signals the kernel driver to release any buffers it may hold. + + The microcode update does not permanently alter the CPU and must be performed + each time the system is booted." + +openrc_services="${pkgname} default true" + +Add_dependency run glibc +Add_dependency full udev +Add_dependency full module-init-tools +Add_dependency full intel-microcode + +do_build() +{ + make +} + +do_install() +{ + install -D -m755 ${pkgname} ${DESTDIR}/usr/sbin/${pkgname} + install -D -m644 ${pkgname}.8 ${DESTDIR}/usr/share/man/man8/${pkgname}.8 + install -D -m755 ${FILESDIR}/${pkgname}.rc \ + ${DESTDIR}/etc/init.d/${pkgname} +}