|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] microcode: Check whether the microcode is correct.
>>> On 19.07.13 at 05:59, Konrad Rzeszutek Wilk <konrad@xxxxxxxxxx> wrote:
> --- a/xen/arch/x86/microcode.c
> +++ b/xen/arch/x86/microcode.c
> @@ -433,24 +433,40 @@ static int __init microcode_presmp_init(void)
> {
> if ( ucode_mod.mod_end || ucode_blob.size )
> {
> - void *data;
> - size_t len;
> -
> - if ( ucode_blob.size )
> - {
> - len = ucode_blob.size;
> - data = ucode_blob.data;
> - }
> - else
> - {
> - len = ucode_mod.mod_end;
> - data = ucode_mod_map(&ucode_mod);
> - }
> - if ( data )
> - microcode_update_cpu(data, len);
> -
> - if ( !ucode_blob.size )
> - ucode_mod_map(NULL);
> + int rc;
> + do {
> + void *data = NULL;
> + size_t len;
> +
> + rc = 0;
> + if ( ucode_blob.size )
> + {
> + len = ucode_blob.size;
> + data = ucode_blob.data;
> + }
> + else if ( ucode_mod.mod_end )
> + {
> + len = ucode_mod.mod_end;
> + data = ucode_mod_map(&ucode_mod);
> + }
> + if ( data )
> + rc = microcode_update_cpu(data, len);
else rc = -ENOMEM (yielding the initialization above pointless).
> +
> + if ( !ucode_blob.size && ucode_mod.mod_end )
> + ucode_mod_map(NULL);
> +
> + if ( rc == -EINVAL )
if ( rc )
> + {
> + if ( ucode_blob.size ) /* That was tried first */
> + {
> + ucode_blob.size = 0;
> + xfree(ucode_blob.data);
> + continue;
> + }
> + if ( ucode_mod.mod_end )
> + ucode_mod.mod_end = 0;
> + }
> + } while ( rc );
> }
>
> register_cpu_notifier(µcode_percpu_nfb);
This may need re-doing anyway I we can agree that allowing both
location specifications at the same time is bogus and should hence
be dropped.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |