|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 6/7] x86/ucode/intel: Clean up microcode_sanity_check()
On 31/03/2020 15:18, Jan Beulich wrote:
> On 27.03.2020 13:29, Andrew Cooper wrote:
>> @@ -160,93 +153,85 @@ static int collect_cpu_info(struct cpu_signature *csig)
>> return 0;
>> }
>>
>> -static int microcode_sanity_check(const struct microcode_patch *mc)
>> +/*
>> + * Sanity check a blob which is expected to be a microcode patch. The 48
>> byte
>> + * header is of a known format, and together with totalsize are within the
>> + * bounds of the container. Everything else is unchecked.
>> + */
>> +static int microcode_sanity_check(const struct microcode_patch *patch)
>> {
>> - const struct microcode_header_intel *mc_header = &mc->hdr;
>> - const struct extended_sigtable *ext_header = NULL;
>> - const struct extended_signature *ext_sig;
>> - unsigned long total_size, data_size, ext_table_size;
>> - unsigned int ext_sigcount = 0, i;
>> - uint32_t sum, orig_sum;
>> -
>> - total_size = get_totalsize(mc);
>> - data_size = get_datasize(mc);
>> - if ( (data_size + MC_HEADER_SIZE) > total_size )
>> + const struct extended_sigtable *ext;
>> + const uint32_t *ptr;
>> + unsigned int total_size = get_totalsize(patch);
>> + unsigned int data_size = get_datasize(patch);
>> + unsigned int i, ext_size;
>> + uint32_t sum;
>> +
>> + /*
>> + * Total size must be a multiple of 1024 bytes. Data size and the
>> header
>> + * must fit within it.
>> + */
>> + if ( (total_size & 1023) ||
>> + data_size > (total_size - MC_HEADER_SIZE) )
>> {
>> - printk(KERN_ERR "microcode: error! "
>> - "Bad data size in microcode data file\n");
>> + printk(XENLOG_WARNING "microcode: Bad size\n");
>> return -EINVAL;
>> }
>>
>> - if ( (mc_header->ldrver != 1) || (mc_header->hdrver != 1) )
>> - {
>> - printk(KERN_ERR "microcode: error! "
>> - "Unknown microcode update format\n");
>> + /* Checksum the main header and data. */
>> + for ( sum = 0, ptr = (const uint32_t *)patch;
>> + ptr < (const uint32_t *)&patch->data[data_size]; ++ptr )
>> + sum += *ptr;
>> +
>> + if ( sum != 0 )
>> return -EINVAL;
> The error message for this looks to have been lost, or ...
>
>> - }
>> - ext_table_size = total_size - (MC_HEADER_SIZE + data_size);
>> - if ( ext_table_size )
>> +
>> + /* Look to see if there is an extended signature table. */
>> + ext_size = total_size - data_size - MC_HEADER_SIZE;
>> +
>> + /* No extended signature table? All done. */
>> + if ( ext_size == 0 )
>> {
>> - if ( (ext_table_size < EXT_HEADER_SIZE) ||
>> - ((ext_table_size - EXT_HEADER_SIZE) % EXT_SIGNATURE_SIZE) )
>> - {
>> - printk(KERN_ERR "microcode: error! "
>> - "Small exttable size in microcode data file\n");
>> - return -EINVAL;
>> - }
>> - ext_header = (void *)mc + MC_HEADER_SIZE + data_size;
>> - if ( ext_table_size != exttable_size(ext_header) )
>> - {
>> - printk(KERN_ERR "microcode: error! "
>> - "Bad exttable size in microcode data file\n");
>> - return -EFAULT;
>> - }
>> - ext_sigcount = ext_header->count;
>> + printk(XENLOG_WARNING "microcode: Bad checksum\n");
>> + return 0;
> ... to have got mistakenly moved here.
It was mistakenly moved. I found and fixed that at some point after
sending this series.
> With this addressed
> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
Thanks,
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |