mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
* 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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJVpmyaAAoJEC84WcCNIz1Vy8sP/2k/io83aTzuePeJb2ub4TXn /ZFA2jMQqKcZ69tr91F+zTeb/isA7+yijOzkJ4dO7HSfzsc8IWxujZf+iqGKQnpQ JRq0zWfy3jXKnIE9CqDPEVRF0wkMgVIsowPTDVHhLeuy8R9LaF3KxO5ZM7FwPYAK bAhZ8jYdw1DRQ0Vns4XD8B3j1GYe3BJ/ptAZCWoZ4Go3bxoU4VBsW7goZlVfcwg7 TY8mmwp7zoZS0frv3Ba42xGli9s3g4+8WJcWYVcYuB9NqKYhFjze2kmWZO68Le0o 3Vnppf3pYWE3YqgBsx8KlZ8XT0KwvPzc93XtW962+E8N603v8sbl6oy9gOe9KJEN oDCH3TqTcFGcOwrVMgXgAHupXlHH1qHy0jevWVJ3mxsIyTNQN6fpTpIAaWRtmVW1 p9JTA62rTJ+bB7C1JXjVaLtLTBD/YnXqZM2z/O7zhomm1Myv+JrtphZ0MGb6cHqj Db9OLU3SMONFsgp/FD4XDMz0BxpUxekvKHzzWL/PM8muN1O0RPhG/QE+m6P4007F XtAb5oleKQawAmzzTyUN7gaRi2V4WI7+0BZ/Y9L9KnNZ01XX0LXgF/+nqdgfyqG+ lnWpuaEVePMsOPA2amtqY88AlRERZGjOuSbSO1NLjhHYzpVL2t+CuBJvDLfBGEc4 NtuxnN0bFL7RroIHIVQL =kSV0 -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
cd369c2239
@ -305,10 +305,17 @@ const char *cper_mem_err_unpack(struct trace_seq *p,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem)
|
static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem,
|
||||||
|
int len)
|
||||||
{
|
{
|
||||||
struct cper_mem_err_compact cmem;
|
struct cper_mem_err_compact cmem;
|
||||||
|
|
||||||
|
/* Don't trust UEFI 2.1/2.2 structure with bad validation bits */
|
||||||
|
if (len == sizeof(struct cper_sec_mem_err_old) &&
|
||||||
|
(mem->validation_bits & ~(CPER_MEM_VALID_RANK_NUMBER - 1))) {
|
||||||
|
pr_err(FW_WARN "valid bits set for fields beyond structure\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
|
if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
|
||||||
printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
|
printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
|
||||||
if (mem->validation_bits & CPER_MEM_VALID_PA)
|
if (mem->validation_bits & CPER_MEM_VALID_PA)
|
||||||
@ -405,8 +412,10 @@ static void cper_estatus_print_section(
|
|||||||
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
|
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
|
||||||
struct cper_sec_mem_err *mem_err = (void *)(gdata + 1);
|
struct cper_sec_mem_err *mem_err = (void *)(gdata + 1);
|
||||||
printk("%s""section_type: memory error\n", newpfx);
|
printk("%s""section_type: memory error\n", newpfx);
|
||||||
if (gdata->error_data_length >= sizeof(*mem_err))
|
if (gdata->error_data_length >=
|
||||||
cper_print_mem(newpfx, mem_err);
|
sizeof(struct cper_sec_mem_err_old))
|
||||||
|
cper_print_mem(newpfx, mem_err,
|
||||||
|
gdata->error_data_length);
|
||||||
else
|
else
|
||||||
goto err_section_too_small;
|
goto err_section_too_small;
|
||||||
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) {
|
} else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) {
|
||||||
|
@ -340,7 +340,27 @@ struct cper_ia_proc_ctx {
|
|||||||
__u64 mm_reg_addr;
|
__u64 mm_reg_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Memory Error Section */
|
/* Old Memory Error Section UEFI 2.1, 2.2 */
|
||||||
|
struct cper_sec_mem_err_old {
|
||||||
|
__u64 validation_bits;
|
||||||
|
__u64 error_status;
|
||||||
|
__u64 physical_addr;
|
||||||
|
__u64 physical_addr_mask;
|
||||||
|
__u16 node;
|
||||||
|
__u16 card;
|
||||||
|
__u16 module;
|
||||||
|
__u16 bank;
|
||||||
|
__u16 device;
|
||||||
|
__u16 row;
|
||||||
|
__u16 column;
|
||||||
|
__u16 bit_pos;
|
||||||
|
__u64 requestor_id;
|
||||||
|
__u64 responder_id;
|
||||||
|
__u64 target_id;
|
||||||
|
__u8 error_type;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Memory Error Section UEFI >= 2.3 */
|
||||||
struct cper_sec_mem_err {
|
struct cper_sec_mem_err {
|
||||||
__u64 validation_bits;
|
__u64 validation_bits;
|
||||||
__u64 error_status;
|
__u64 error_status;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user