Commit 5b46b5e0 authored by Borislav Petkov's avatar Borislav Petkov Committed by Thomas Gleixner

x86/microcode/intel: Improve microcode sanity-checking error messages

Turn them into proper sentences. Add comments to microcode_sanity_check() to
explain what it does.
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1457345404-28884-5-git-send-email-bp@alien8.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 7d016156
...@@ -57,15 +57,16 @@ int microcode_sanity_check(void *mc, int print_err) ...@@ -57,15 +57,16 @@ int microcode_sanity_check(void *mc, int print_err)
if (data_size + MC_HEADER_SIZE > total_size) { if (data_size + MC_HEADER_SIZE > total_size) {
if (print_err) if (print_err)
pr_err("error! Bad data size in microcode data file\n"); pr_err("Error: bad microcode data file size.\n");
return -EINVAL; return -EINVAL;
} }
if (mc_header->ldrver != 1 || mc_header->hdrver != 1) { if (mc_header->ldrver != 1 || mc_header->hdrver != 1) {
if (print_err) if (print_err)
pr_err("error! Unknown microcode update format\n"); pr_err("Error: invalid/unknown microcode update format.\n");
return -EINVAL; return -EINVAL;
} }
ext_table_size = total_size - (MC_HEADER_SIZE + data_size); ext_table_size = total_size - (MC_HEADER_SIZE + data_size);
if (ext_table_size) { if (ext_table_size) {
u32 ext_table_sum = 0; u32 ext_table_sum = 0;
...@@ -74,43 +75,58 @@ int microcode_sanity_check(void *mc, int print_err) ...@@ -74,43 +75,58 @@ int microcode_sanity_check(void *mc, int print_err)
if ((ext_table_size < EXT_HEADER_SIZE) if ((ext_table_size < EXT_HEADER_SIZE)
|| ((ext_table_size - EXT_HEADER_SIZE) % EXT_SIGNATURE_SIZE)) { || ((ext_table_size - EXT_HEADER_SIZE) % EXT_SIGNATURE_SIZE)) {
if (print_err) if (print_err)
pr_err("error! Small exttable size in microcode data file\n"); pr_err("Error: truncated extended signature table.\n");
return -EINVAL; return -EINVAL;
} }
ext_header = mc + MC_HEADER_SIZE + data_size; ext_header = mc + MC_HEADER_SIZE + data_size;
if (ext_table_size != exttable_size(ext_header)) { if (ext_table_size != exttable_size(ext_header)) {
if (print_err) if (print_err)
pr_err("error! Bad exttable size in microcode data file\n"); pr_err("Error: extended signature table size mismatch.\n");
return -EFAULT; return -EFAULT;
} }
ext_sigcount = ext_header->count; ext_sigcount = ext_header->count;
/* check extended table checksum */ /*
* Check extended table checksum: the sum of all dwords that
* comprise a valid table must be 0.
*/
ext_tablep = (u32 *)ext_header; ext_tablep = (u32 *)ext_header;
i = ext_table_size / sizeof(u32); i = ext_table_size / sizeof(u32);
while (i--) while (i--)
ext_table_sum += ext_tablep[i]; ext_table_sum += ext_tablep[i];
if (ext_table_sum) { if (ext_table_sum) {
if (print_err) if (print_err)
pr_warn("aborting, bad extended signature table checksum\n"); pr_warn("Bad extended signature table checksum, aborting.\n");
return -EINVAL; return -EINVAL;
} }
} }
/* calculate the checksum */ /*
* Calculate the checksum of update data and header. The checksum of
* valid update data and header including the extended signature table
* must be 0.
*/
orig_sum = 0; orig_sum = 0;
i = (MC_HEADER_SIZE + data_size) / sizeof(u32); i = (MC_HEADER_SIZE + data_size) / sizeof(u32);
while (i--) while (i--)
orig_sum += ((u32 *)mc)[i]; orig_sum += ((u32 *)mc)[i];
if (orig_sum) { if (orig_sum) {
if (print_err) if (print_err)
pr_err("aborting, bad checksum\n"); pr_err("Bad microcode data checksum, aborting.\n");
return -EINVAL; return -EINVAL;
} }
if (!ext_table_size) if (!ext_table_size)
return 0; return 0;
/* check extended signature checksum */
/*
* Check extended signature checksum: 0 => valid.
*/
for (i = 0; i < ext_sigcount; i++) { for (i = 0; i < ext_sigcount; i++) {
ext_sig = (void *)ext_header + EXT_HEADER_SIZE + ext_sig = (void *)ext_header + EXT_HEADER_SIZE +
EXT_SIGNATURE_SIZE * i; EXT_SIGNATURE_SIZE * i;
...@@ -119,7 +135,7 @@ int microcode_sanity_check(void *mc, int print_err) ...@@ -119,7 +135,7 @@ int microcode_sanity_check(void *mc, int print_err)
+ (ext_sig->sig + ext_sig->pf + ext_sig->cksum); + (ext_sig->sig + ext_sig->pf + ext_sig->cksum);
if (sum) { if (sum) {
if (print_err) if (print_err)
pr_err("aborting, bad checksum\n"); pr_err("Bad extended signature checksum, aborting.\n");
return -EINVAL; return -EINVAL;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment