diff options
-rw-r--r-- | xen/arch/x86/microcode.c | 25 | ||||
-rw-r--r-- | xen/arch/x86/microcode_amd.c | 10 | ||||
-rw-r--r-- | xen/arch/x86/microcode_intel.c | 8 | ||||
-rw-r--r-- | xen/include/asm-x86/microcode.h | 5 |
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(µ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); @@ -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(µcode_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(µcode_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 { |