From: Christoph Egger <Christoph.Egger@amd.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [PATCH] microcode fix
Date: Mon, 12 Dec 2011 15:02:00 +0100 [thread overview]
Message-ID: <4EE60958.70403@amd.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 555 bytes --]
Remove hardcoded maximum size a microcode patch can have.
This is dynamic now.
The microcode patch for family15h can be larger than 2048 bytes
and gets silently truncated.
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
P.S. Please apply this to Xen 4.1, 4.0, 3.4 and 3.3, too.
--
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85689 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
[-- Attachment #2: xen_microcode_fam15.diff --]
[-- Type: text/plain, Size: 3418 bytes --]
diff -r 848049b14ec7 xen/arch/x86/microcode_amd.c
--- a/xen/arch/x86/microcode_amd.c Mon Nov 14 20:15:35 2011 +0000
+++ b/xen/arch/x86/microcode_amd.c Mon Dec 12 14:36:07 2011 +0100
@@ -27,18 +27,10 @@
#include <asm/processor.h>
#include <asm/microcode.h>
-#define pr_debug(x...) ((void)0)
-
#define UCODE_MAGIC 0x00414d44
#define UCODE_EQUIV_CPU_TABLE_TYPE 0x00000000
#define UCODE_UCODE_TYPE 0x00000001
-#define UCODE_MAX_SIZE (2048)
-#define DEFAULT_UCODE_DATASIZE (896)
-#define MC_HEADER_SIZE (sizeof(struct microcode_header_amd))
-#define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE)
-#define DWSIZE (sizeof(uint32_t))
-
/* serialize access to the physical write */
static DEFINE_SPINLOCK(microcode_update_lock);
@@ -99,7 +91,7 @@ static int microcode_fits(void *mc, int
}
if ( mc_header->patch_id <= uci->cpu_sig.rev )
- return -EINVAL;
+ return 1;
printk(KERN_DEBUG "microcode: CPU%d found a matching microcode "
"update with version 0x%x (current=0x%x)\n",
@@ -147,8 +139,8 @@ static int apply_microcode(int cpu)
return 0;
}
-static int get_next_ucode_from_buffer_amd(void *mc, const void *buf,
- size_t size, unsigned long *offset)
+static int get_next_ucode_from_buffer_amd(void *mc, size_t *mc_size,
+ const void *buf, size_t size, unsigned long *offset)
{
size_t total_size;
const uint8_t *bufp = buf;
@@ -178,7 +170,12 @@ static int get_next_ucode_from_buffer_am
return -EINVAL;
}
- memset(mc, 0, UCODE_MAX_SIZE);
+ if (*mc_size < total_size) {
+ xfree(mc);
+ mc = xmalloc_bytes(total_size);
+ *mc_size = total_size;
+ }
+ memset(mc, 0, *mc_size);
memcpy(mc, (const void *)(&bufp[off + 8]), total_size);
*offset = off + total_size + 8;
@@ -231,11 +228,12 @@ static int install_equiv_cpu_table(const
static int cpu_request_microcode(int cpu, const void *buf, size_t size)
{
const uint32_t *buf_pos;
- unsigned long offset = 0;
+ size_t offset = 0;
int error = 0;
int ret;
struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
void *mc;
+ size_t mc_size;
/* We should bind the task to the CPU */
BUG_ON(cpu != raw_smp_processor_id());
@@ -245,7 +243,7 @@ static int cpu_request_microcode(int cpu
if ( buf_pos[0] != UCODE_MAGIC )
{
printk(KERN_ERR "microcode: error! Wrong "
- "microcode patch file magic\n");
+ "microcode patch file magic\n");
return -EINVAL;
}
@@ -256,7 +254,8 @@ static int cpu_request_microcode(int cpu
return -EINVAL;
}
- mc = xmalloc_bytes(UCODE_MAX_SIZE);
+ mc_size = buf_pos[offset + 1]; /* Size of 1st microcode patch in bytes */
+ mc = xmalloc_bytes(size);
if ( mc == NULL )
{
printk(KERN_ERR "microcode: error! "
@@ -272,7 +271,8 @@ static int cpu_request_microcode(int cpu
* It's possible the data file has multiple matching ucode,
* lets keep searching till the latest version
*/
- while ( (ret = get_next_ucode_from_buffer_amd(mc, buf, size, &offset)) == 0)
+ while ( (ret = get_next_ucode_from_buffer_amd(mc, &mc_size,
+ buf, size, &offset)) == 0)
{
error = microcode_fits(mc, cpu);
if (error <= 0)
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2011-12-12 14:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-12 14:02 Christoph Egger [this message]
2011-12-12 14:33 ` [PATCH] microcode fix Keir Fraser
2011-12-13 14:22 ` Christoph Egger
2011-12-13 15:03 ` Jan Beulich
2011-12-14 10:17 ` Christoph Egger
2011-12-14 12:42 ` Jan Beulich
2011-12-14 13:53 ` Christoph Egger
2011-12-12 14:41 ` Jan Beulich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EE60958.70403@amd.com \
--to=christoph.egger@amd.com \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.