#include <asm/dsp.h>
 #include <asm/fpu.h>
 #include <asm/mipsregs.h>
+#include <asm/mipsmtregs.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/system.h>
 
                __put_user (child->thread.fpu.hard.fcr31, data + 64);
 
-               flags = read_c0_status();
-               __enable_fpu();
-               __asm__ __volatile__("cfc1\t%0,$0" : "=r" (tmp));
-               write_c0_status(flags);
+               preempt_disable();
+               if (cpu_has_mipsmt) {
+                       unsigned int vpflags = dvpe();
+                       flags = read_c0_status();
+                       __enable_fpu();
+                       __asm__ __volatile__("cfc1\t%0,$0" : "=r" (tmp));
+                       write_c0_status(flags);
+                       evpe(vpflags);
+               } else {
+                       flags = read_c0_status();
+                       __enable_fpu();
+                       __asm__ __volatile__("cfc1\t%0,$0" : "=r" (tmp));
+                       write_c0_status(flags);
+               }
+               preempt_enable();
                __put_user (tmp, data + 65);
        } else {
                __put_user (child->thread.fpu.soft.fcr31, data + 64);
                        if (!cpu_has_fpu)
                                break;
 
-                       flags = read_c0_status();
-                       __enable_fpu();
-                       __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
-                       write_c0_status(flags);
+                       preempt_disable();
+                       if (cpu_has_mipsmt) {
+                               unsigned int vpflags = dvpe();
+                               flags = read_c0_status();
+                               __enable_fpu();
+                               __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
+                               write_c0_status(flags);
+                               evpe(vpflags);
+                       } else {
+                               flags = read_c0_status();
+                               __enable_fpu();
+                               __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
+                               write_c0_status(flags);
+                       }
+                       preempt_enable();
                        break;
                }
                case DSP_BASE ... DSP_BASE + 5: {
 
 #include <asm/dsp.h>
 #include <asm/fpu.h>
 #include <asm/mipsregs.h>
+#include <asm/mipsmtregs.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/system.h>
                        if (!cpu_has_fpu)
                                break;
 
-                       flags = read_c0_status();
-                       __enable_fpu();
-                       __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
-                       write_c0_status(flags);
+                       preempt_disable();
+                       if (cpu_has_mipsmt) {
+                               unsigned int vpflags = dvpe();
+                               flags = read_c0_status();
+                               __enable_fpu();
+                               __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
+                               write_c0_status(flags);
+                               evpe(vpflags);
+                       } else {
+                               flags = read_c0_status();
+                               __enable_fpu();
+                               __asm__ __volatile__("cfc1\t%0,$0": "=r" (tmp));
+                               write_c0_status(flags);
+                       }
+                       preempt_enable();
                        break;
                }
                case DSP_BASE ... DSP_BASE + 5: