2004-06-28 09:20:42

by Tigran Aivazian

[permalink] [raw]
Subject: [patch-2.6.7] fix to microcode driver for the old CPUs.

Dear Linus,

Here is a patch against Linux 2.6.7 which fixes the sigmatch() macro to
work for the relatively old processors as well, which have 'pf == 0'
(processor flags as read from MSR 0x17), For example, the processors
failing without this patch are Pentium II 300 MHz (Klamath) with
family/model/stepping 6/3/4 and 6/3/3.

The patch also contains minor cosmetic changes (to make source code more
uniform).

I'll send the same thing to Marcelo re-cut against 2.4.x shortly.

Kind regards
Tigran

--- arch/i386/kernel/microcode.c.0 2004-06-25 11:20:59.000000000 +0100
+++ arch/i386/kernel/microcode.c 2004-06-28 10:16:06.000000000 +0100
@@ -1,7 +1,7 @@
/*
- * Intel CPU Microcode Update driver for Linux
+ * Intel CPU Microcode Update Driver for Linux
*
- * Copyright (C) 2000 Tigran Aivazian
+ * Copyright (C) 2000-2004 Tigran Aivazian
*
* This driver allows to upgrade microcode on Intel processors
* belonging to IA-32 family - PentiumPro, Pentium II,
@@ -32,7 +32,7 @@
* Added misc device support (now uses both devfs and misc).
* Added MICROCODE_IOCFREE ioctl to clear memory.
* 1.05 09 Jun 2000, Simon Trimmer <[email protected]>
- * Messages for error cases (non intel & no suitable microcode).
+ * Messages for error cases (non Intel & no suitable microcode).
* 1.06 03 Aug 2000, Tigran Aivazian <[email protected]>
* Removed ->release(). Removed exclusive open and status bitmap.
* Added microcode_rwsem to serialize read()/write()/ioctl().
@@ -64,6 +64,9 @@
* Removed ->read() method and obsoleted MICROCODE_IOCFREE ioctl
* because we no longer hold a copy of applied microcode
* in kernel memory.
+ * 1.14 25 Jun 2004 Tigran Aivazian <[email protected]>
+ * Fix sigmatch() macro to handle old CPUs with pf == 0.
+ * Thanks to Stuart Swales for pointing out this bug.
*/


@@ -80,11 +83,11 @@
#include <asm/uaccess.h>
#include <asm/processor.h>

-MODULE_DESCRIPTION("Intel CPU (IA-32) microcode update driver");
+MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver");
MODULE_AUTHOR("Tigran Aivazian <[email protected]>");
MODULE_LICENSE("GPL");

-#define MICROCODE_VERSION "1.13"
+#define MICROCODE_VERSION "1.14"
#define MICRO_DEBUG 0
#if MICRO_DEBUG
#define dprintk(x...) printk(KERN_INFO x)
@@ -104,7 +107,10 @@
#define get_datasize(mc) \
(((microcode_t *)mc)->hdr.datasize ? \
((microcode_t *)mc)->hdr.datasize : DEFAULT_UCODE_DATASIZE)
-#define sigmatch(s1, s2, p1, p2) (((s1) == (s2)) && ((p1) & (p2)))
+
+#define sigmatch(s1, s2, p1, p2) \
+ (((s1) == (s2)) && (((p1) & (p2)) || ((p1) == (p2) == 0 )))
+
#define exttable_size(et) ((et)->count * EXT_SIGNATURE_SIZE + EXT_HEADER_SIZE)

/* serialize access to the physical write to MSR 0x79 */
@@ -363,7 +369,7 @@
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;

if (uci->mc == NULL) {
- printk(KERN_INFO "microcode: No suitable data for cpu %d\n", cpu_num);
+ printk(KERN_INFO "microcode: No suitable data for CPU%d\n", cpu_num);
return;
}

@@ -495,16 +501,14 @@
}

printk(KERN_INFO
- "IA-32 Microcode Update Driver: v%s <[email protected]>\n",
- MICROCODE_VERSION);
+ "IA-32 Microcode Update Driver: v" MICROCODE_VERSION " <[email protected]>\n");
return 0;
}

static void __exit microcode_exit (void)
{
misc_deregister(&microcode_dev);
- printk(KERN_INFO "IA-32 Microcode Update Driver v%s unregistered\n",
- MICROCODE_VERSION);
+ printk(KERN_INFO "IA-32 Microcode Update Driver v" MICROCODE_VERSION " unregistered\n");
}

module_init(microcode_init)



2004-06-28 10:18:21

by Tigran Aivazian

[permalink] [raw]
Subject: Re: [patch-2.6.7] fix to microcode driver for the old CPUs.

oops, silly mistake (p1 == p2 == 0 where I really meant "p1 == 0 && p2 ==
0"). Here is the re-cut patch:

--- arch/i386/kernel/microcode.c.0 2004-06-25 11:20:59.000000000 +0100
+++ arch/i386/kernel/microcode.c 2004-06-28 11:20:02.000000000 +0100
@@ -1,7 +1,7 @@
/*
- * Intel CPU Microcode Update driver for Linux
+ * Intel CPU Microcode Update Driver for Linux
*
- * Copyright (C) 2000 Tigran Aivazian
+ * Copyright (C) 2000-2004 Tigran Aivazian
*
* This driver allows to upgrade microcode on Intel processors
* belonging to IA-32 family - PentiumPro, Pentium II,
@@ -32,7 +32,7 @@
* Added misc device support (now uses both devfs and misc).
* Added MICROCODE_IOCFREE ioctl to clear memory.
* 1.05 09 Jun 2000, Simon Trimmer <[email protected]>
- * Messages for error cases (non intel & no suitable microcode).
+ * Messages for error cases (non Intel & no suitable microcode).
* 1.06 03 Aug 2000, Tigran Aivazian <[email protected]>
* Removed ->release(). Removed exclusive open and status bitmap.
* Added microcode_rwsem to serialize read()/write()/ioctl().
@@ -64,6 +64,9 @@
* Removed ->read() method and obsoleted MICROCODE_IOCFREE ioctl
* because we no longer hold a copy of applied microcode
* in kernel memory.
+ * 1.14 25 Jun 2004 Tigran Aivazian <[email protected]>
+ * Fix sigmatch() macro to handle old CPUs with pf == 0.
+ * Thanks to Stuart Swales for pointing out this bug.
*/


@@ -80,11 +83,11 @@
#include <asm/uaccess.h>
#include <asm/processor.h>

-MODULE_DESCRIPTION("Intel CPU (IA-32) microcode update driver");
+MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver");
MODULE_AUTHOR("Tigran Aivazian <[email protected]>");
MODULE_LICENSE("GPL");

-#define MICROCODE_VERSION "1.13"
+#define MICROCODE_VERSION "1.14"
#define MICRO_DEBUG 0
#if MICRO_DEBUG
#define dprintk(x...) printk(KERN_INFO x)
@@ -104,7 +107,10 @@
#define get_datasize(mc) \
(((microcode_t *)mc)->hdr.datasize ? \
((microcode_t *)mc)->hdr.datasize : DEFAULT_UCODE_DATASIZE)
-#define sigmatch(s1, s2, p1, p2) (((s1) == (s2)) && ((p1) & (p2)))
+
+#define sigmatch(s1, s2, p1, p2) \
+ (((s1) == (s2)) && (((p1) & (p2)) || (((p1) == 0) && ((p2) == 0))))
+
#define exttable_size(et) ((et)->count * EXT_SIGNATURE_SIZE + EXT_HEADER_SIZE)

/* serialize access to the physical write to MSR 0x79 */
@@ -363,7 +369,7 @@
struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;

if (uci->mc == NULL) {
- printk(KERN_INFO "microcode: No suitable data for cpu %d\n", cpu_num);
+ printk(KERN_INFO "microcode: No suitable data for CPU%d\n", cpu_num);
return;
}

@@ -495,16 +501,14 @@
}

printk(KERN_INFO
- "IA-32 Microcode Update Driver: v%s <[email protected]>\n",
- MICROCODE_VERSION);
+ "IA-32 Microcode Update Driver: v" MICROCODE_VERSION " <[email protected]>\n");
return 0;
}

static void __exit microcode_exit (void)
{
misc_deregister(&microcode_dev);
- printk(KERN_INFO "IA-32 Microcode Update Driver v%s unregistered\n",
- MICROCODE_VERSION);
+ printk(KERN_INFO "IA-32 Microcode Update Driver v" MICROCODE_VERSION " unregistered\n");
}

module_init(microcode_init)