x86/mce: Decode a kernel instruction to determine if it is copying from user
[linux-2.6-microblaze.git] / arch / x86 / kernel / cpu / mce / core.c
index 5c423c4..3d6e1bf 100644 (file)
@@ -1250,14 +1250,19 @@ static void kill_me_maybe(struct callback_head *cb)
        if (!p->mce_ripv)
                flags |= MF_MUST_KILL;
 
-       if (!memory_failure(p->mce_addr >> PAGE_SHIFT, flags)) {
+       if (!memory_failure(p->mce_addr >> PAGE_SHIFT, flags) &&
+           !(p->mce_kflags & MCE_IN_KERNEL_COPYIN)) {
                set_mce_nospec(p->mce_addr >> PAGE_SHIFT, p->mce_whole_page);
                sync_core();
                return;
        }
 
-       pr_err("Memory error not recovered");
-       kill_me_now(cb);
+       if (p->mce_vaddr != (void __user *)-1l) {
+               force_sig_mceerr(BUS_MCEERR_AR, p->mce_vaddr, PAGE_SHIFT);
+       } else {
+               pr_err("Memory error not recovered");
+               kill_me_now(cb);
+       }
 }
 
 static void queue_task_work(struct mce *m, int kill_it)