aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/microcode.c25
-rw-r--r--xen/arch/x86/microcode_amd.c10
-rw-r--r--xen/arch/x86/microcode_intel.c8
-rw-r--r--xen/include/asm-x86/microcode.h5
4 files changed, 26 insertions, 22 deletions
diff --git a/xen/arch/x86/microcode.c b/xen/arch/x86/microcode.c
index 65ed115828..b6eacda59b 100644
--- a/xen/arch/x86/microcode.c
+++ b/xen/arch/x86/microcode.c
@@ -49,23 +49,28 @@ struct microcode_info {
char buffer[1];
};
-static void microcode_fini_cpu(struct ucode_cpu_info *uci, int cpu)
+static void microcode_fini_cpu(int cpu)
{
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+
spin_lock(&microcode_mutex);
xfree(uci->mc.mc_valid);
uci->mc.mc_valid = NULL;
spin_unlock(&microcode_mutex);
}
-static int collect_cpu_info(struct ucode_cpu_info *uci, int cpu)
+static int collect_cpu_info(int cpu)
{
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+
memset(uci, 0, sizeof(*uci));
return microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig);
}
-static int microcode_resume_cpu(struct ucode_cpu_info *uci, int cpu)
+static int microcode_resume_cpu(int cpu)
{
int err = 0;
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
struct cpu_signature nsig;
gdprintk(XENLOG_INFO, "microcode: CPU%d resumed\n", cpu);
@@ -80,25 +85,25 @@ static int microcode_resume_cpu(struct ucode_cpu_info *uci, int cpu)
err = microcode_ops->collect_cpu_info(cpu, &nsig);
if ( err )
{
- microcode_fini_cpu(uci, cpu);
+ microcode_fini_cpu(cpu);
return err;
}
if ( memcmp(&nsig, &uci->cpu_sig, sizeof(nsig)) )
{
- microcode_fini_cpu(uci, cpu);
+ microcode_fini_cpu(cpu);
/* Should we look for a new ucode here? */
return -EIO;
}
- return microcode_ops->apply_microcode(uci, cpu);
+ return microcode_ops->apply_microcode(cpu);
}
static int microcode_update_cpu(const void *buf, size_t size)
{
int err;
unsigned int cpu = smp_processor_id();
- struct ucode_cpu_info *uci = &ucode_cpu_info[cpu];
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
spin_lock(&microcode_mutex);
@@ -107,11 +112,11 @@ static int microcode_update_cpu(const void *buf, size_t size)
* otherwise just request a firmware:
*/
if ( uci->mc.mc_valid ) {
- err = microcode_resume_cpu(uci, cpu);
+ err = microcode_resume_cpu(cpu);
} else {
- err = collect_cpu_info(uci, cpu);
+ err = collect_cpu_info(cpu);
if ( !err )
- err = microcode_ops->cpu_request_microcode(uci, cpu, buf, size);
+ err = microcode_ops->cpu_request_microcode(cpu, buf, size);
}
spin_unlock(&microcode_mutex);
diff --git a/xen/arch/x86/microcode_amd.c b/xen/arch/x86/microcode_amd.c
index 3748a6fe97..730dce0a0b 100644
--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -122,9 +122,10 @@ out:
return 0;
}
-static int apply_microcode(struct ucode_cpu_info *uci, int cpu)
+static int apply_microcode(int cpu)
{
unsigned long flags;
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
uint32_t rev, dummy;
struct microcode_amd *mc_amd = uci->mc.mc_amd;
@@ -246,18 +247,17 @@ static int install_equiv_cpu_table(const void *buf, uint32_t size,
return 0;
}
-static int cpu_request_microcode(struct ucode_cpu_info *uci,
- int cpu, const void *buf, size_t size)
+static int cpu_request_microcode(int cpu, const void *buf, size_t size)
{
const uint32_t *buf_pos;
unsigned long offset = 0;
int error = 0;
int ret;
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
void *mc;
/* We should bind the task to the CPU */
BUG_ON(cpu != raw_smp_processor_id());
- BUG_ON(uci != &ucode_cpu_info[cpu]);
buf_pos = (const uint32_t *)buf;
@@ -297,7 +297,7 @@ static int cpu_request_microcode(struct ucode_cpu_info *uci,
if (error != 0)
continue;
- error = apply_microcode(uci, cpu);
+ error = apply_microcode(cpu);
if (error == 0)
break;
}
diff --git a/xen/arch/x86/microcode_intel.c b/xen/arch/x86/microcode_intel.c
index 1d9e51b89a..4efd679660 100644
--- a/xen/arch/x86/microcode_intel.c
+++ b/xen/arch/x86/microcode_intel.c
@@ -244,11 +244,12 @@ static int get_matching_microcode(void *mc, int cpu)
return 1;
}
-static int apply_microcode(struct ucode_cpu_info *uci, int cpu)
+static int apply_microcode(int cpu)
{
unsigned long flags;
unsigned int val[2];
int cpu_num = raw_smp_processor_id();
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu_num;
/* We should bind the task to the CPU */
BUG_ON(cpu_num != cpu);
@@ -317,8 +318,7 @@ static long get_next_ucode_from_buffer(void **mc, const u8 *buf,
return offset + total_size;
}
-static int cpu_request_microcode(struct ucode_cpu_info *uci,
- int cpu, const void *buf, size_t size)
+static int cpu_request_microcode(int cpu, const void *buf, size_t size)
{
long offset = 0;
int error = 0;
@@ -341,7 +341,7 @@ static int cpu_request_microcode(struct ucode_cpu_info *uci,
*/
if ( error == 1 )
{
- apply_microcode(uci, cpu);
+ apply_microcode(cpu);
error = 0;
}
xfree(mc);
diff --git a/xen/include/asm-x86/microcode.h b/xen/include/asm-x86/microcode.h
index 27bb5d5f16..57582cfa91 100644
--- a/xen/include/asm-x86/microcode.h
+++ b/xen/include/asm-x86/microcode.h
@@ -5,10 +5,9 @@ struct cpu_signature;
struct ucode_cpu_info;
struct microcode_ops {
- int (*cpu_request_microcode)(struct ucode_cpu_info *uci,
- int cpu, const void *buf, size_t size);
+ int (*cpu_request_microcode)(int cpu, const void *buf, size_t size);
int (*collect_cpu_info)(int cpu, struct cpu_signature *csig);
- int (*apply_microcode)(struct ucode_cpu_info *uci, int cpu);
+ int (*apply_microcode)(int cpu);
};
struct microcode_header_intel {