Merge tag 'mac80211-next-for-john-2014-11-04' of git://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / arch / s390 / kernel / nmi.c
index 210e128..dd1c24c 100644 (file)
@@ -20,6 +20,7 @@
 #include <asm/cputime.h>
 #include <asm/nmi.h>
 #include <asm/crw.h>
+#include <asm/switch_to.h>
 
 struct mcck_struct {
        int kill_task;
@@ -53,8 +54,12 @@ void s390_handle_mcck(void)
         */
        local_irq_save(flags);
        local_mcck_disable();
-       mcck = __get_cpu_var(cpu_mcck);
-       memset(&__get_cpu_var(cpu_mcck), 0, sizeof(struct mcck_struct));
+       /*
+        * Ummm... Does this make sense at all? Copying the percpu struct
+        * and then zapping it one statement later?
+        */
+       memcpy(&mcck, this_cpu_ptr(&cpu_mcck), sizeof(mcck));
+       memset(&mcck, 0, sizeof(struct mcck_struct));
        clear_cpu_flag(CIF_MCCK_PENDING);
        local_mcck_enable();
        local_irq_restore(flags);
@@ -163,6 +168,21 @@ static int notrace s390_revalidate_registers(struct mci *mci)
                        "       ld      15,120(%0)\n"
                        : : "a" (fpt_save_area));
        }
+
+#ifdef CONFIG_64BIT
+       /* Revalidate vector registers */
+       if (MACHINE_HAS_VX && current->thread.vxrs) {
+               if (!mci->vr) {
+                       /*
+                        * Vector registers can't be restored and therefore
+                        * the process needs to be terminated.
+                        */
+                       kill_task = 1;
+               }
+               restore_vx_regs((__vector128 *)
+                               S390_lowcore.vector_save_area_addr);
+       }
+#endif
        /* Revalidate access registers */
        asm volatile(
                "       lam     0,15,0(%0)"
@@ -253,7 +273,7 @@ void notrace s390_do_machine_check(struct pt_regs *regs)
        nmi_enter();
        inc_irq_stat(NMI_NMI);
        mci = (struct mci *) &S390_lowcore.mcck_interruption_code;
-       mcck = &__get_cpu_var(cpu_mcck);
+       mcck = this_cpu_ptr(&cpu_mcck);
        umode = user_mode(regs);
 
        if (mci->sd) {