|
@@ -272,13 +272,18 @@ static struct attribute_group mc_attr_group = {
|
|
|
.name = "microcode",
|
|
|
};
|
|
|
|
|
|
-static void microcode_fini_cpu(int cpu)
|
|
|
+static void __microcode_fini_cpu(int cpu)
|
|
|
{
|
|
|
struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
|
|
|
|
|
|
- mutex_lock(µcode_mutex);
|
|
|
microcode_ops->microcode_fini_cpu(cpu);
|
|
|
uci->valid = 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void microcode_fini_cpu(int cpu)
|
|
|
+{
|
|
|
+ mutex_lock(µcode_mutex);
|
|
|
+ __microcode_fini_cpu(cpu);
|
|
|
mutex_unlock(µcode_mutex);
|
|
|
}
|
|
|
|
|
@@ -306,12 +311,16 @@ static int microcode_resume_cpu(int cpu)
|
|
|
* to this cpu (a bit of paranoia):
|
|
|
*/
|
|
|
if (microcode_ops->collect_cpu_info(cpu, &nsig)) {
|
|
|
- microcode_fini_cpu(cpu);
|
|
|
+ __microcode_fini_cpu(cpu);
|
|
|
+ printk(KERN_ERR "failed to collect_cpu_info for resuming cpu #%d\n",
|
|
|
+ cpu);
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if (memcmp(&nsig, &uci->cpu_sig, sizeof(nsig))) {
|
|
|
- microcode_fini_cpu(cpu);
|
|
|
+ if ((nsig.sig != uci->cpu_sig.sig) || (nsig.pf != uci->cpu_sig.pf)) {
|
|
|
+ __microcode_fini_cpu(cpu);
|
|
|
+ printk(KERN_ERR "cached ucode doesn't match the resuming cpu #%d\n",
|
|
|
+ cpu);
|
|
|
/* Should we look for a new ucode here? */
|
|
|
return 1;
|
|
|
}
|