|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86, amd_ucode: verify max allowed patch size before apply
commit c42a3154a03c1d57cfa67988d109501cf4f35ae8
Author: Aravind Gopalakrishnan <aravind.gopalakrishnan@xxxxxxx>
AuthorDate: Tue May 6 13:39:05 2014 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue May 6 13:39:05 2014 +0200
x86,amd_ucode: verify max allowed patch size before apply
Each family has a stipulated max patch_size. Use this as
additional sanity check before we apply it.
Also, tone down the amount of debug messages and
Follow microcode_intel's implementation of pr_debug.
While at it, fix comment at very top to indicate we support ucode
patch loading from fam10h and higher.
Signed-off-by: Aravind Gopalakrishnan <aravind.gopalakrishnan@xxxxxxx>
Reviewed-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@xxxxxxx>
---
xen/arch/x86/microcode_amd.c | 58 ++++++++++++++++++++++++++++++++++-------
1 files changed, 48 insertions(+), 10 deletions(-)
diff --git a/xen/arch/x86/microcode_amd.c b/xen/arch/x86/microcode_amd.c
index b227173..e83f4b6 100644
--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -8,7 +8,7 @@
* Tigran Aivazian <tigran@xxxxxxxxxxxxxxxxxxxx>
*
* This driver allows to upgrade microcode on AMD
- * family 0x10 and 0x11 processors.
+ * family 0x10 and later.
*
* Licensed unter the terms of the GNU General Public
* License version 2. See file COPYING for details.
@@ -27,6 +27,8 @@
#include <asm/microcode.h>
#include <asm/hvm/svm/svm.h>
+#define pr_debug(x...) ((void)0)
+
struct __packed equiv_cpu_entry {
uint32_t installed_cpu;
uint32_t fixed_errata_mask;
@@ -88,12 +90,40 @@ static int collect_cpu_info(int cpu, struct cpu_signature
*csig)
rdmsrl(MSR_AMD_PATCHLEVEL, csig->rev);
- printk(KERN_DEBUG "microcode: CPU%d collect_cpu_info: patch_id=%#x\n",
- cpu, csig->rev);
+ pr_debug("microcode: CPU%d collect_cpu_info: patch_id=%#x\n",
+ cpu, csig->rev);
return 0;
}
+static bool_t verify_patch_size(uint32_t patch_size)
+{
+ uint32_t max_size;
+
+#define F1XH_MPB_MAX_SIZE 2048
+#define F14H_MPB_MAX_SIZE 1824
+#define F15H_MPB_MAX_SIZE 4096
+#define F16H_MPB_MAX_SIZE 3458
+
+ switch (boot_cpu_data.x86)
+ {
+ case 0x14:
+ max_size = F14H_MPB_MAX_SIZE;
+ break;
+ case 0x15:
+ max_size = F15H_MPB_MAX_SIZE;
+ break;
+ case 0x16:
+ max_size = F16H_MPB_MAX_SIZE;
+ break;
+ default:
+ max_size = F1XH_MPB_MAX_SIZE;
+ break;
+ }
+
+ return (patch_size <= max_size);
+}
+
static bool_t microcode_fits(const struct microcode_amd *mc_amd, int cpu)
{
struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
@@ -123,12 +153,20 @@ static bool_t microcode_fits(const struct microcode_amd
*mc_amd, int cpu)
if ( (mc_header->processor_rev_id) != equiv_cpu_id )
return 0;
+ if ( !verify_patch_size(mc_amd->mpb_size) )
+ {
+ pr_debug("microcode: patch size mismatch\n");
+ return 0;
+ }
+
if ( mc_header->patch_id <= uci->cpu_sig.rev )
+ {
+ pr_debug("microcode: patch is already at required level or
greater.\n");
return 0;
+ }
- printk(KERN_DEBUG "microcode: CPU%d found a matching microcode "
- "update with version %#x (current=%#x)\n",
- cpu, mc_header->patch_id, uci->cpu_sig.rev);
+ pr_debug("microcode: CPU%d found a matching microcode update with version
%#x (current=%#x)\n",
+ cpu, mc_header->patch_id, uci->cpu_sig.rev);
return 1;
}
@@ -224,10 +262,10 @@ static int get_ucode_from_buffer_amd(
*offset = off + mpbuf->len + 8;
- printk(KERN_DEBUG "microcode: CPU%d size %zu, block size %u offset %zu
equivID %#x rev %#x\n",
- raw_smp_processor_id(), bufsize, mpbuf->len, off,
- ((struct microcode_header_amd *)mc_amd->mpb)->processor_rev_id,
- ((struct microcode_header_amd *)mc_amd->mpb)->patch_id);
+ pr_debug("microcode: CPU%d size %zu, block size %u offset %zu equivID %#x
rev %#x\n",
+ raw_smp_processor_id(), bufsize, mpbuf->len, off,
+ ((struct microcode_header_amd *)mc_amd->mpb)->processor_rev_id,
+ ((struct microcode_header_amd *)mc_amd->mpb)->patch_id);
return 0;
}
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |