x86/mce: Pass pointer to saved pt_regs to severity calculation routines
authorYouquan Song <youquan.song@intel.com>
Tue, 6 Oct 2020 21:09:05 +0000 (14:09 -0700)
committerBorislav Petkov <bp@suse.de>
Wed, 7 Oct 2020 08:51:42 +0000 (10:51 +0200)
New recovery features require additional information about processor
state when a machine check occurred. Pass pt_regs down to the routines
that need it.

No functional change.

Signed-off-by: Youquan Song <youquan.song@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20201006210910.21062-2-tony.luck@intel.com
arch/x86/kernel/cpu/mce/core.c
arch/x86/kernel/cpu/mce/internal.h
arch/x86/kernel/cpu/mce/severity.c

index b5b70f4..2d6caf0 100644 (file)
@@ -807,7 +807,7 @@ log_it:
                        goto clear_it;
 
                mce_read_aux(&m, i);
-               m.severity = mce_severity(&m, mca_cfg.tolerant, NULL, false);
+               m.severity = mce_severity(&m, NULL, mca_cfg.tolerant, NULL, false);
                /*
                 * Don't get the IP here because it's unlikely to
                 * have anything to do with the actual error location.
@@ -856,7 +856,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
                        quirk_no_way_out(i, m, regs);
 
                m->bank = i;
-               if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
+               if (mce_severity(m, regs, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
                        mce_read_aux(m, i);
                        *msg = tmp;
                        return 1;
@@ -956,7 +956,7 @@ static void mce_reign(void)
         */
        if (m && global_worst >= MCE_PANIC_SEVERITY && mca_cfg.tolerant < 3) {
                /* call mce_severity() to get "msg" for panic */
-               mce_severity(m, mca_cfg.tolerant, &msg, true);
+               mce_severity(m, NULL, mca_cfg.tolerant, &msg, true);
                mce_panic("Fatal machine check", m, msg);
        }
 
@@ -1167,7 +1167,7 @@ static noinstr bool mce_check_crashing_cpu(void)
        return false;
 }
 
-static void __mc_scan_banks(struct mce *m, struct mce *final,
+static void __mc_scan_banks(struct mce *m, struct pt_regs *regs, struct mce *final,
                            unsigned long *toclear, unsigned long *valid_banks,
                            int no_way_out, int *worst)
 {
@@ -1202,7 +1202,7 @@ static void __mc_scan_banks(struct mce *m, struct mce *final,
                /* Set taint even when machine check was not enabled. */
                add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);
 
-               severity = mce_severity(m, cfg->tolerant, NULL, true);
+               severity = mce_severity(m, regs, cfg->tolerant, NULL, true);
 
                /*
                 * When machine check was for corrected/deferred handler don't
@@ -1354,7 +1354,7 @@ noinstr void do_machine_check(struct pt_regs *regs)
                order = mce_start(&no_way_out);
        }
 
-       __mc_scan_banks(&m, final, toclear, valid_banks, no_way_out, &worst);
+       __mc_scan_banks(&m, regs, final, toclear, valid_banks, no_way_out, &worst);
 
        if (!no_way_out)
                mce_clear_state(toclear);
@@ -1376,7 +1376,7 @@ noinstr void do_machine_check(struct pt_regs *regs)
                 * make sure we have the right "msg".
                 */
                if (worst >= MCE_PANIC_SEVERITY && mca_cfg.tolerant < 3) {
-                       mce_severity(&m, cfg->tolerant, &msg, true);
+                       mce_severity(&m, regs, cfg->tolerant, &msg, true);
                        mce_panic("Local fatal machine check!", &m, msg);
                }
        }
index b122610..88dcc79 100644 (file)
@@ -38,7 +38,8 @@ int mce_gen_pool_add(struct mce *mce);
 int mce_gen_pool_init(void);
 struct llist_node *mce_gen_pool_prepare_records(void);
 
-extern int (*mce_severity)(struct mce *a, int tolerant, char **msg, bool is_excp);
+extern int (*mce_severity)(struct mce *a, struct pt_regs *regs,
+                          int tolerant, char **msg, bool is_excp);
 struct dentry *mce_get_debugfs_dir(void);
 
 extern mce_banks_t mce_banks_ce_disabled;
index e072246..0b072dc 100644 (file)
@@ -223,7 +223,7 @@ static struct severity {
  * distinguish an exception taken in user from from one
  * taken in the kernel.
  */
-static int error_context(struct mce *m)
+static int error_context(struct mce *m, struct pt_regs *regs)
 {
        if ((m->cs & 3) == 3)
                return IN_USER;
@@ -267,9 +267,10 @@ static int mce_severity_amd_smca(struct mce *m, enum context err_ctx)
  * See AMD Error Scope Hierarchy table in a newer BKDG. For example
  * 49125_15h_Models_30h-3Fh_BKDG.pdf, section "RAS Features"
  */
-static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_excp)
+static int mce_severity_amd(struct mce *m, struct pt_regs *regs, int tolerant,
+                           char **msg, bool is_excp)
 {
-       enum context ctx = error_context(m);
+       enum context ctx = error_context(m, regs);
 
        /* Processor Context Corrupt, no need to fumble too much, die! */
        if (m->status & MCI_STATUS_PCC)
@@ -319,10 +320,11 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc
        return MCE_KEEP_SEVERITY;
 }
 
-static int mce_severity_intel(struct mce *m, int tolerant, char **msg, bool is_excp)
+static int mce_severity_intel(struct mce *m, struct pt_regs *regs,
+                             int tolerant, char **msg, bool is_excp)
 {
        enum exception excp = (is_excp ? EXCP_CONTEXT : NO_EXCP);
-       enum context ctx = error_context(m);
+       enum context ctx = error_context(m, regs);
        struct severity *s;
 
        for (s = severities;; s++) {
@@ -356,7 +358,7 @@ static int mce_severity_intel(struct mce *m, int tolerant, char **msg, bool is_e
 }
 
 /* Default to mce_severity_intel */
-int (*mce_severity)(struct mce *m, int tolerant, char **msg, bool is_excp) =
+int (*mce_severity)(struct mce *m, struct pt_regs *regs, int tolerant, char **msg, bool is_excp) =
                    mce_severity_intel;
 
 void __init mcheck_vendor_init_severity(void)