aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/microcode.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/xen/arch/x86/microcode.c b/xen/arch/x86/microcode.c
index e6344cf182..091d5d1819 100644
--- a/xen/arch/x86/microcode.c
+++ b/xen/arch/x86/microcode.c
@@ -418,6 +418,7 @@ static int __init microcode_presmp_init(void)
{
void *data;
size_t len;
+ int rc = 0;
if ( ucode_blob.size )
{
@@ -430,10 +431,24 @@ static int __init microcode_presmp_init(void)
data = ucode_mod_map(&ucode_mod);
}
if ( data )
- microcode_update_cpu(data, len);
+ rc = microcode_update_cpu(data, len);
+ else
+ rc = -ENOMEM;
if ( !ucode_blob.size )
ucode_mod_map(NULL);
+
+ if ( rc )
+ {
+ if ( ucode_blob.size )
+ {
+ xfree(ucode_blob.data);
+ ucode_blob.size = 0;
+ ucode_blob.data = NULL;
+ }
+ else
+ ucode_mod.mod_end = 0;
+ }
}
register_cpu_notifier(&microcode_percpu_nfb);