]> Git Repo - J-linux.git/commitdiff
x86/mce: Use mce_prep_record() helpers for apei_smca_report_x86_error()
authorYazen Ghannam <[email protected]>
Tue, 30 Jul 2024 18:29:58 +0000 (13:29 -0500)
committerBorislav Petkov (AMD) <[email protected]>
Thu, 1 Aug 2024 16:20:25 +0000 (18:20 +0200)
Current AMD systems can report MCA errors using the ACPI Boot Error
Record Table (BERT). The BERT entries for MCA errors will be an x86
Common Platform Error Record (CPER) with an MSR register context that
matches the MCAX/SMCA register space.

However, the BERT will not necessarily be processed on the CPU that
reported the MCA errors. Therefore, the correct CPU number needs to be
determined and the information saved in struct mce.

Use the newly defined mce_prep_record_*() helpers to get the correct
data.

Also, add an explicit check to verify that a valid CPU number was found
from the APIC ID search.

Signed-off-by: Yazen Ghannam <[email protected]>
Signed-off-by: Borislav Petkov (AMD) <[email protected]>
Reviewed-by: Nikolay Borisov <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Borislav Petkov (AMD) <[email protected]>
arch/x86/kernel/cpu/mce/apei.c

index 8f509c8a4e98de957f12b96eeb73ec7616a12897..3885fe05f01ecc799f4a75eeafbc787c42aff9d4 100644 (file)
@@ -66,6 +66,7 @@ EXPORT_SYMBOL_GPL(apei_mce_report_mem_error);
 int apei_smca_report_x86_error(struct cper_ia_proc_ctx *ctx_info, u64 lapic_id)
 {
        const u64 *i_mce = ((const u64 *) (ctx_info + 1));
+       bool apicid_found = false;
        unsigned int cpu;
        struct mce m;
 
@@ -97,20 +98,19 @@ int apei_smca_report_x86_error(struct cper_ia_proc_ctx *ctx_info, u64 lapic_id)
        if (ctx_info->reg_arr_size < 48)
                return -EINVAL;
 
-       mce_prep_record(&m);
-
-       m.extcpu = -1;
-       m.socketid = -1;
-
        for_each_possible_cpu(cpu) {
                if (cpu_data(cpu).topo.initial_apicid == lapic_id) {
-                       m.extcpu = cpu;
-                       m.socketid = cpu_data(m.extcpu).topo.pkg_id;
+                       apicid_found = true;
                        break;
                }
        }
 
-       m.apicid = lapic_id;
+       if (!apicid_found)
+               return -EINVAL;
+
+       mce_prep_record_common(&m);
+       mce_prep_record_per_cpu(cpu, &m);
+
        m.bank = (ctx_info->msr_addr >> 4) & 0xFF;
        m.status = *i_mce;
        m.addr = *(i_mce + 1);
This page took 0.048322 seconds and 4 git commands to generate.