diff options
author | Ingo Molnar <mingo@kernel.org> | 2015-07-21 03:52:51 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-07-21 03:52:51 -0400 |
commit | cd369c2239dd08c273c0fafbbea44e3e0c509ebd (patch) | |
tree | ed0959e0532ceb79ae6aaae35fe900dfe41e454c /drivers/firmware | |
parent | f5530d5af835ffa82a0607f5f1977d63ac02551f (diff) | |
parent | 4c62360d7562a20c996836d163259c87d9378120 (diff) |
Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/mfleming/efi into x86/urgent
Pull an EFI fix from Matt Fleming:
- Fix a bug in the Common Platform Error Record (CPER) driver that
caused old UEFI spec (< 2.3) versions of the memory error record
structure to be declared invalid. (Tony Luck)
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/efi/cper.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c index 4fd9961d552e..d42537425438 100644 --- a/drivers/firmware/efi/cper.c +++ b/drivers/firmware/efi/cper.c | |||
@@ -305,10 +305,17 @@ const char *cper_mem_err_unpack(struct trace_seq *p, | |||
305 | return ret; | 305 | return ret; |
306 | } | 306 | } |
307 | 307 | ||
308 | static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem) | 308 | static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem, |
309 | int len) | ||
309 | { | 310 | { |
310 | struct cper_mem_err_compact cmem; | 311 | struct cper_mem_err_compact cmem; |
311 | 312 | ||
313 | /* Don't trust UEFI 2.1/2.2 structure with bad validation bits */ | ||
314 | if (len == sizeof(struct cper_sec_mem_err_old) && | ||
315 | (mem->validation_bits & ~(CPER_MEM_VALID_RANK_NUMBER - 1))) { | ||
316 | pr_err(FW_WARN "valid bits set for fields beyond structure\n"); | ||
317 | return; | ||
318 | } | ||
312 | if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS) | 319 | if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS) |
313 | printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status); | 320 | printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status); |
314 | if (mem->validation_bits & CPER_MEM_VALID_PA) | 321 | if (mem->validation_bits & CPER_MEM_VALID_PA) |
@@ -405,8 +412,10 @@ static void cper_estatus_print_section( | |||
405 | } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) { | 412 | } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) { |
406 | struct cper_sec_mem_err *mem_err = (void *)(gdata + 1); | 413 | struct cper_sec_mem_err *mem_err = (void *)(gdata + 1); |
407 | printk("%s""section_type: memory error\n", newpfx); | 414 | printk("%s""section_type: memory error\n", newpfx); |
408 | if (gdata->error_data_length >= sizeof(*mem_err)) | 415 | if (gdata->error_data_length >= |
409 | cper_print_mem(newpfx, mem_err); | 416 | sizeof(struct cper_sec_mem_err_old)) |
417 | cper_print_mem(newpfx, mem_err, | ||
418 | gdata->error_data_length); | ||
410 | else | 419 | else |
411 | goto err_section_too_small; | 420 | goto err_section_too_small; |
412 | } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) { | 421 | } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) { |