]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
efi: Decode IA32/X64 Processor Error Section
authorYazen Ghannam <yazen.ghannam@amd.com>
Fri, 4 May 2018 05:59:50 +0000 (07:59 +0200)
committerIngo Molnar <mingo@kernel.org>
Mon, 14 May 2018 06:57:47 +0000 (08:57 +0200)
Recognize the IA32/X64 Processor Error Section.

Do the section decoding in a new "cper-x86.c" file and add this to the
Makefile depending on a new "UEFI_CPER_X86" config option.

Print the Local APIC ID and CPUID info from the Processor Error Record.

The "Processor Error Info" and "Processor Context" fields will be
decoded in following patches.

Based on UEFI 2.7 Table 252. Processor Error Record.

Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Link: http://lkml.kernel.org/r/20180504060003.19618-5-ard.biesheuvel@linaro.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
drivers/firmware/efi/Kconfig
drivers/firmware/efi/Makefile
drivers/firmware/efi/cper-x86.c [new file with mode: 0644]
drivers/firmware/efi/cper.c
include/linux/cper.h

index 3098410abad80046ef66b76fed2091cdfb97a364..781a4a33755739438acb6430576f6f2221601f88 100644 (file)
@@ -174,6 +174,11 @@ config UEFI_CPER_ARM
        depends on UEFI_CPER && ( ARM || ARM64 )
        default y
 
+config UEFI_CPER_X86
+       bool
+       depends on UEFI_CPER && X86
+       default y
+
 config EFI_DEV_PATH_PARSER
        bool
        depends on ACPI
index cb805374f4bc8102ecd2edb061cfbeb572233286..5f9f5039de50492d3cfdef1538ed6c2686a47f0a 100644 (file)
@@ -31,3 +31,4 @@ obj-$(CONFIG_ARM)                     += $(arm-obj-y)
 obj-$(CONFIG_ARM64)                    += $(arm-obj-y)
 obj-$(CONFIG_EFI_CAPSULE_LOADER)       += capsule-loader.o
 obj-$(CONFIG_UEFI_CPER_ARM)            += cper-arm.o
+obj-$(CONFIG_UEFI_CPER_X86)            += cper-x86.o
diff --git a/drivers/firmware/efi/cper-x86.c b/drivers/firmware/efi/cper-x86.c
new file mode 100644 (file)
index 0000000..863f0cd
--- /dev/null
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2018, Advanced Micro Devices, Inc.
+
+#include <linux/cper.h>
+
+/*
+ * We don't need a "CPER_IA" prefix since these are all locally defined.
+ * This will save us a lot of line space.
+ */
+#define VALID_LAPIC_ID                 BIT_ULL(0)
+#define VALID_CPUID_INFO               BIT_ULL(1)
+
+void cper_print_proc_ia(const char *pfx, const struct cper_sec_proc_ia *proc)
+{
+       if (proc->validation_bits & VALID_LAPIC_ID)
+               printk("%sLocal APIC_ID: 0x%llx\n", pfx, proc->lapic_id);
+
+       if (proc->validation_bits & VALID_CPUID_INFO) {
+               printk("%sCPUID Info:\n", pfx);
+               print_hex_dump(pfx, "", DUMP_PREFIX_OFFSET, 16, 4, proc->cpuid,
+                              sizeof(proc->cpuid), 0);
+       }
+}
index ab21f161400733c9da364fa43ea56e1ef7c6b7eb..3bf0dca378a647f34e5fbc9092df224816e8f3a3 100644 (file)
@@ -467,6 +467,16 @@ cper_estatus_print_section(const char *pfx, struct acpi_hest_generic_data *gdata
                        cper_print_proc_arm(newpfx, arm_err);
                else
                        goto err_section_too_small;
+#endif
+#if defined(CONFIG_UEFI_CPER_X86)
+       } else if (guid_equal(sec_type, &CPER_SEC_PROC_IA)) {
+               struct cper_sec_proc_ia *ia_err = acpi_hest_get_payload(gdata);
+
+               printk("%ssection_type: IA32/X64 processor error\n", newpfx);
+               if (gdata->error_data_length >= sizeof(*ia_err))
+                       cper_print_proc_ia(newpfx, ia_err);
+               else
+                       goto err_section_too_small;
 #endif
        } else {
                const void *err = acpi_hest_get_payload(gdata);
index 4b5f8459b403d5a37baf43809b830b08affc03ab..9c703a0abe6edcb6d7613ffc2c2fade60f44095e 100644 (file)
@@ -551,5 +551,7 @@ const char *cper_mem_err_unpack(struct trace_seq *,
                                struct cper_mem_err_compact *);
 void cper_print_proc_arm(const char *pfx,
                         const struct cper_sec_proc_arm *proc);
+void cper_print_proc_ia(const char *pfx,
+                       const struct cper_sec_proc_ia *proc);
 
 #endif