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(µcode_mutex);
xfree(uci->mc.mc_valid);
uci->mc.mc_valid = NULL;
spin_unlock(µcode_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);
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(µcode_mutex);
* 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(µcode_mutex);
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;
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;
if (error != 0)
continue;
- error = apply_microcode(uci, cpu);
+ error = apply_microcode(cpu);
if (error == 0)
break;
}
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);
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;
*/
if ( error == 1 )
{
- apply_microcode(uci, cpu);
+ apply_microcode(cpu);
error = 0;
}
xfree(mc);
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 {