.monarch_timeout = -1
 };
 
-static DEFINE_PER_CPU(struct mce, mces_seen);
+static DEFINE_PER_CPU(struct mce_hw_err, hw_errs_seen);
 static unsigned long mce_need_notify;
 
 /*
 
 void mce_prep_record_common(struct mce *m)
 {
-       memset(m, 0, sizeof(struct mce));
-
        m->cpuid        = cpuid_eax(1);
        m->cpuvendor    = boot_cpu_data.x86_vendor;
        m->mcgcap       = __rdmsr(MSR_IA32_MCG_CAP);
        m->socketid     = topology_physical_package_id(cpu);
 }
 
-/* Do initial initialization of a struct mce */
-void mce_prep_record(struct mce *m)
+/* Do initial initialization of struct mce_hw_err */
+void mce_prep_record(struct mce_hw_err *err)
 {
+       struct mce *m = &err->m;
+
+       memset(err, 0, sizeof(struct mce_hw_err));
        mce_prep_record_common(m);
        mce_prep_record_per_cpu(smp_processor_id(), m);
 }
 DEFINE_PER_CPU(struct mce, injectm);
 EXPORT_PER_CPU_SYMBOL_GPL(injectm);
 
-void mce_log(struct mce *m)
+void mce_log(struct mce_hw_err *err)
 {
-       if (!mce_gen_pool_add(m))
+       if (!mce_gen_pool_add(err))
                irq_work_queue(&mce_irq_work);
 }
 EXPORT_SYMBOL_GPL(mce_log);
 }
 EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);
 
-static void __print_mce(struct mce *m)
+static void __print_mce(struct mce_hw_err *err)
 {
+       struct mce *m = &err->m;
+
        pr_emerg(HW_ERR "CPU %d: Machine Check%s: %Lx Bank %d: %016Lx\n",
                 m->extcpu,
                 (m->mcgstatus & MCG_STATUS_MCIP ? " Exception" : ""),
                m->microcode);
 }
 
-static void print_mce(struct mce *m)
+static void print_mce(struct mce_hw_err *err)
 {
-       __print_mce(m);
+       struct mce *m = &err->m;
+
+       __print_mce(err);
 
        if (m->cpuvendor != X86_VENDOR_AMD && m->cpuvendor != X86_VENDOR_HYGON)
                pr_emerg_ratelimited(HW_ERR "Run the above through 'mcelog --ascii'\n");
        return NULL;
 }
 
-static noinstr void mce_panic(const char *msg, struct mce *final, char *exp)
+static noinstr void mce_panic(const char *msg, struct mce_hw_err *final, char *exp)
 {
        struct llist_node *pending;
        struct mce_evt_llist *l;
        pending = mce_gen_pool_prepare_records();
        /* First print corrected ones that are still unlogged */
        llist_for_each_entry(l, pending, llnode) {
-               struct mce *m = &l->mce;
+               struct mce_hw_err *err = &l->err;
+               struct mce *m = &err->m;
                if (!(m->status & MCI_STATUS_UC)) {
-                       print_mce(m);
+                       print_mce(err);
                        if (!apei_err)
                                apei_err = apei_write_mce(m);
                }
        }
        /* Now print uncorrected but with the final one last */
        llist_for_each_entry(l, pending, llnode) {
-               struct mce *m = &l->mce;
+               struct mce_hw_err *err = &l->err;
+               struct mce *m = &err->m;
                if (!(m->status & MCI_STATUS_UC))
                        continue;
-               if (!final || mce_cmp(m, final)) {
-                       print_mce(m);
+               if (!final || mce_cmp(m, &final->m)) {
+                       print_mce(err);
                        if (!apei_err)
                                apei_err = apei_write_mce(m);
                }
        if (final) {
                print_mce(final);
                if (!apei_err)
-                       apei_err = apei_write_mce(final);
+                       apei_err = apei_write_mce(&final->m);
        }
        if (exp)
                pr_emerg(HW_ERR "Machine check: %s\n", exp);
 
-       memmsg = mce_dump_aux_info(final);
+       memmsg = mce_dump_aux_info(&final->m);
        if (memmsg)
                pr_emerg(HW_ERR "Machine check: %s\n", memmsg);
 
                 * panic.
                 */
                if (kexec_crash_loaded()) {
-                       if (final && (final->status & MCI_STATUS_ADDRV)) {
+                       if (final && (final->m.status & MCI_STATUS_ADDRV)) {
                                struct page *p;
-                               p = pfn_to_online_page(final->addr >> PAGE_SHIFT);
+                               p = pfn_to_online_page(final->m.addr >> PAGE_SHIFT);
                                if (p)
                                        SetPageHWPoison(p);
                        }
  * check into our "mce" struct so that we can use it later to assess
  * the severity of the problem as we read per-bank specific details.
  */
-static noinstr void mce_gather_info(struct mce *m, struct pt_regs *regs)
+static noinstr void mce_gather_info(struct mce_hw_err *err, struct pt_regs *regs)
 {
+       struct mce *m;
        /*
         * Enable instrumentation around mce_prep_record() which calls external
         * facilities.
         */
        instrumentation_begin();
-       mce_prep_record(m);
+       mce_prep_record(err);
        instrumentation_end();
 
+       m = &err->m;
        m->mcgstatus = mce_rdmsrl(MSR_IA32_MCG_STATUS);
        if (regs) {
                /*
 static int mce_early_notifier(struct notifier_block *nb, unsigned long val,
                              void *data)
 {
-       struct mce *m = (struct mce *)data;
+       struct mce_hw_err *err = to_mce_hw_err(data);
 
-       if (!m)
+       if (!err)
                return NOTIFY_DONE;
 
        /* Emit the trace record: */
-       trace_mce_record(m);
+       trace_mce_record(err);
 
        set_bit(0, &mce_need_notify);
 
 static int mce_default_notifier(struct notifier_block *nb, unsigned long val,
                                void *data)
 {
-       struct mce *m = (struct mce *)data;
+       struct mce_hw_err *err = to_mce_hw_err(data);
 
-       if (!m)
+       if (!err)
                return NOTIFY_DONE;
 
-       if (mca_cfg.print_all || !m->kflags)
-               __print_mce(m);
+       if (mca_cfg.print_all || !(err->m.kflags))
+               __print_mce(err);
 
        return NOTIFY_DONE;
 }
 /*
  * Read ADDR and MISC registers.
  */
-static noinstr void mce_read_aux(struct mce *m, int i)
+static noinstr void mce_read_aux(struct mce_hw_err *err, int i)
 {
+       struct mce *m = &err->m;
+
        if (m->status & MCI_STATUS_MISCV)
                m->misc = mce_rdmsrl(mca_msr_reg(i, MCA_MISC));
 
 void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
 {
        struct mce_bank *mce_banks = this_cpu_ptr(mce_banks_array);
-       struct mce m;
+       struct mce_hw_err err;
+       struct mce *m;
        int i;
 
        this_cpu_inc(mce_poll_count);
 
-       mce_gather_info(&m, NULL);
+       mce_gather_info(&err, NULL);
+       m = &err.m;
 
        if (flags & MCP_TIMESTAMP)
-               m.tsc = rdtsc();
+               m->tsc = rdtsc();
 
        for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
                if (!mce_banks[i].ctl || !test_bit(i, *b))
                        continue;
 
-               m.misc = 0;
-               m.addr = 0;
-               m.bank = i;
+               m->misc = 0;
+               m->addr = 0;
+               m->bank = i;
 
                barrier();
-               m.status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
+               m->status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
 
                /*
                 * Update storm tracking here, before checking for the
                 * storm status.
                 */
                if (!mca_cfg.cmci_disabled)
-                       mce_track_storm(&m);
+                       mce_track_storm(m);
 
                /* If this entry is not valid, ignore it */
-               if (!(m.status & MCI_STATUS_VAL))
+               if (!(m->status & MCI_STATUS_VAL))
                        continue;
 
                /*
                 * If we are logging everything (at CPU online) or this
                 * is a corrected error, then we must log it.
                 */
-               if ((flags & MCP_UC) || !(m.status & MCI_STATUS_UC))
+               if ((flags & MCP_UC) || !(m->status & MCI_STATUS_UC))
                        goto log_it;
 
                /*
                 * everything else.
                 */
                if (!mca_cfg.ser) {
-                       if (m.status & MCI_STATUS_UC)
+                       if (m->status & MCI_STATUS_UC)
                                continue;
                        goto log_it;
                }
 
                /* Log "not enabled" (speculative) errors */
-               if (!(m.status & MCI_STATUS_EN))
+               if (!(m->status & MCI_STATUS_EN))
                        goto log_it;
 
                /*
                 * Log UCNA (SDM: 15.6.3 "UCR Error Classification")
                 * UC == 1 && PCC == 0 && S == 0
                 */
-               if (!(m.status & MCI_STATUS_PCC) && !(m.status & MCI_STATUS_S))
+               if (!(m->status & MCI_STATUS_PCC) && !(m->status & MCI_STATUS_S))
                        goto log_it;
 
                /*
                if (flags & MCP_DONTLOG)
                        goto clear_it;
 
-               mce_read_aux(&m, i);
-               m.severity = mce_severity(&m, NULL, NULL, false);
+               mce_read_aux(&err, i);
+               m->severity = mce_severity(m, NULL, NULL, false);
                /*
                 * Don't get the IP here because it's unlikely to
                 * have anything to do with the actual error location.
                 */
 
-               if (mca_cfg.dont_log_ce && !mce_usable_address(&m))
+               if (mca_cfg.dont_log_ce && !mce_usable_address(m))
                        goto clear_it;
 
                if (flags & MCP_QUEUE_LOG)
-                       mce_gen_pool_add(&m);
+                       mce_gen_pool_add(&err);
                else
-                       mce_log(&m);
+                       mce_log(&err);
 
 clear_it:
                /*
  * Do a quick check if any of the events requires a panic.
  * This decides if we keep the events around or clear them.
  */
-static __always_inline int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
+static __always_inline int mce_no_way_out(struct mce_hw_err *err, char **msg, unsigned long *validp,
                                          struct pt_regs *regs)
 {
+       struct mce *m = &err->m;
        char *tmp = *msg;
        int i;
 
 
                m->bank = i;
                if (mce_severity(m, regs, &tmp, true) >= MCE_PANIC_SEVERITY) {
-                       mce_read_aux(m, i);
+                       mce_read_aux(err, i);
                        *msg = tmp;
                        return 1;
                }
  */
 static void mce_reign(void)
 {
-       int cpu;
+       struct mce_hw_err *err = NULL;
        struct mce *m = NULL;
        int global_worst = 0;
        char *msg = NULL;
+       int cpu;
 
        /*
         * This CPU is the Monarch and the other CPUs have run
         * Grade the severity of the errors of all the CPUs.
         */
        for_each_possible_cpu(cpu) {
-               struct mce *mtmp = &per_cpu(mces_seen, cpu);
+               struct mce_hw_err *etmp = &per_cpu(hw_errs_seen, cpu);
+               struct mce *mtmp = &etmp->m;
 
                if (mtmp->severity > global_worst) {
                        global_worst = mtmp->severity;
-                       m = &per_cpu(mces_seen, cpu);
+                       err = &per_cpu(hw_errs_seen, cpu);
+                       m = &err->m;
                }
        }
 
        if (m && global_worst >= MCE_PANIC_SEVERITY) {
                /* call mce_severity() to get "msg" for panic */
                mce_severity(m, NULL, &msg, true);
-               mce_panic("Fatal machine check", m, msg);
+               mce_panic("Fatal machine check", err, msg);
        }
 
        /*
                mce_panic("Fatal machine check from unknown source", NULL, NULL);
 
        /*
-        * Now clear all the mces_seen so that they don't reappear on
+        * Now clear all the hw_errs_seen so that they don't reappear on
         * the next mce.
         */
        for_each_possible_cpu(cpu)
-               memset(&per_cpu(mces_seen, cpu), 0, sizeof(struct mce));
+               memset(&per_cpu(hw_errs_seen, cpu), 0, sizeof(struct mce_hw_err));
 }
 
 static atomic_t global_nwo;
 }
 
 static __always_inline int
-__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)
+__mc_scan_banks(struct mce_hw_err *err, struct pt_regs *regs,
+               struct mce_hw_err *final, unsigned long *toclear,
+               unsigned long *valid_banks, int no_way_out, int *worst)
 {
        struct mce_bank *mce_banks = this_cpu_ptr(mce_banks_array);
        struct mca_config *cfg = &mca_cfg;
        int severity, i, taint = 0;
+       struct mce *m = &err->m;
 
        for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
                arch___clear_bit(i, toclear);
                if (severity == MCE_NO_SEVERITY)
                        continue;
 
-               mce_read_aux(m, i);
+               mce_read_aux(err, i);
 
                /* assuming valid severity level != 0 */
                m->severity = severity;
                 * done in #MC context, where instrumentation is disabled.
                 */
                instrumentation_begin();
-               mce_log(m);
+               mce_log(err);
                instrumentation_end();
 
                if (severity > *worst) {
-                       *final = *m;
+                       *final = *err;
                        *worst = severity;
                }
        }
 
        /* mce_clear_state will clear *final, save locally for use later */
-       *m = *final;
+       *err = *final;
 
        return taint;
 }
                set_mce_nospec(pfn);
 }
 
-static void queue_task_work(struct mce *m, char *msg, void (*func)(struct callback_head *))
+static void queue_task_work(struct mce_hw_err *err, char *msg, void (*func)(struct callback_head *))
 {
        int count = ++current->mce_count;
+       struct mce *m = &err->m;
 
        /* First call, save all the details */
        if (count == 1) {
 
        /* Ten is likely overkill. Don't expect more than two faults before task_work() */
        if (count > 10)
-               mce_panic("Too many consecutive machine checks while accessing user data", m, msg);
+               mce_panic("Too many consecutive machine checks while accessing user data",
+                         err, msg);
 
        /* Second or later call, make sure page address matches the one from first call */
        if (count > 1 && (current->mce_addr >> PAGE_SHIFT) != (m->addr >> PAGE_SHIFT))
-               mce_panic("Consecutive machine checks to different user pages", m, msg);
+               mce_panic("Consecutive machine checks to different user pages", err, msg);
 
        /* Do not call task_work_add() more than once */
        if (count > 1)
        int worst = 0, order, no_way_out, kill_current_task, lmce, taint = 0;
        DECLARE_BITMAP(valid_banks, MAX_NR_BANKS) = { 0 };
        DECLARE_BITMAP(toclear, MAX_NR_BANKS) = { 0 };
-       struct mce m, *final;
+       struct mce_hw_err *final;
+       struct mce_hw_err err;
        char *msg = NULL;
+       struct mce *m;
 
        if (unlikely(mce_flags.p5))
                return pentium_machine_check(regs);
 
        this_cpu_inc(mce_exception_count);
 
-       mce_gather_info(&m, regs);
-       m.tsc = rdtsc();
+       mce_gather_info(&err, regs);
+       m = &err.m;
+       m->tsc = rdtsc();
 
-       final = this_cpu_ptr(&mces_seen);
-       *final = m;
+       final = this_cpu_ptr(&hw_errs_seen);
+       *final = err;
 
-       no_way_out = mce_no_way_out(&m, &msg, valid_banks, regs);
+       no_way_out = mce_no_way_out(&err, &msg, valid_banks, regs);
 
        barrier();
 
         * Assume the worst for now, but if we find the
         * severity is MCE_AR_SEVERITY we have other options.
         */
-       if (!(m.mcgstatus & MCG_STATUS_RIPV))
+       if (!(m->mcgstatus & MCG_STATUS_RIPV))
                kill_current_task = 1;
        /*
         * Check if this MCE is signaled to only this logical processor,
         * on Intel, Zhaoxin only.
         */
-       if (m.cpuvendor == X86_VENDOR_INTEL ||
-           m.cpuvendor == X86_VENDOR_ZHAOXIN)
-               lmce = m.mcgstatus & MCG_STATUS_LMCES;
+       if (m->cpuvendor == X86_VENDOR_INTEL ||
+           m->cpuvendor == X86_VENDOR_ZHAOXIN)
+               lmce = m->mcgstatus & MCG_STATUS_LMCES;
 
        /*
         * Local machine check may already know that we have to panic.
         */
        if (lmce) {
                if (no_way_out)
-                       mce_panic("Fatal local machine check", &m, msg);
+                       mce_panic("Fatal local machine check", &err, msg);
        } else {
                order = mce_start(&no_way_out);
        }
 
-       taint = __mc_scan_banks(&m, regs, final, toclear, valid_banks, no_way_out, &worst);
+       taint = __mc_scan_banks(&err, regs, final, toclear, valid_banks, no_way_out, &worst);
 
        if (!no_way_out)
                mce_clear_state(toclear);
                                no_way_out = worst >= MCE_PANIC_SEVERITY;
 
                        if (no_way_out)
-                               mce_panic("Fatal machine check on current CPU", &m, msg);
+                               mce_panic("Fatal machine check on current CPU", &err, msg);
                }
        } else {
                /*
                 * make sure we have the right "msg".
                 */
                if (worst >= MCE_PANIC_SEVERITY) {
-                       mce_severity(&m, regs, &msg, true);
-                       mce_panic("Local fatal machine check!", &m, msg);
+                       mce_severity(m, regs, &msg, true);
+                       mce_panic("Local fatal machine check!", &err, msg);
                }
        }
 
                goto out;
 
        /* Fault was in user mode and we need to take some action */
-       if ((m.cs & 3) == 3) {
+       if ((m->cs & 3) == 3) {
                /* If this triggers there is no way to recover. Die hard. */
                BUG_ON(!on_thread_stack() || !user_mode(regs));
 
-               if (!mce_usable_address(&m))
-                       queue_task_work(&m, msg, kill_me_now);
+               if (!mce_usable_address(m))
+                       queue_task_work(&err, msg, kill_me_now);
                else
-                       queue_task_work(&m, msg, kill_me_maybe);
+                       queue_task_work(&err, msg, kill_me_maybe);
 
-       } else if (m.mcgstatus & MCG_STATUS_SEAM_NR) {
+       } else if (m->mcgstatus & MCG_STATUS_SEAM_NR) {
                /*
                 * Saved RIP on stack makes it look like the machine check
                 * was taken in the kernel on the instruction following
                 * not occur there. Mark the page as poisoned so it won't
                 * be added to free list when the guest is terminated.
                 */
-               if (mce_usable_address(&m)) {
-                       struct page *p = pfn_to_online_page(m.addr >> PAGE_SHIFT);
+               if (mce_usable_address(m)) {
+                       struct page *p = pfn_to_online_page(m->addr >> PAGE_SHIFT);
 
                        if (p)
                                SetPageHWPoison(p);
                 * corresponding exception handler which would do that is the
                 * proper one.
                 */
-               if (m.kflags & MCE_IN_KERNEL_RECOV) {
+               if (m->kflags & MCE_IN_KERNEL_RECOV) {
                        if (!fixup_exception(regs, X86_TRAP_MC, 0, 0))
-                               mce_panic("Failed kernel mode recovery", &m, msg);
+                               mce_panic("Failed kernel mode recovery", &err, msg);
                }
 
-               if (m.kflags & MCE_IN_KERNEL_COPYIN)
-                       queue_task_work(&m, msg, kill_me_never);
+               if (m->kflags & MCE_IN_KERNEL_COPYIN)
+                       queue_task_work(&err, msg, kill_me_never);
        }
 
 out: