Author: kib
Date: Wed Oct 21 15:06:44 2020
New Revision: 366910
URL: https://svnweb.freebsd.org/changeset/base/366910

Log:
  MFC r366713, r366843 (by jhb):
  Fix for mis-interpretation of PCB_KERNFPU.

Modified:
  stable/12/sys/amd64/amd64/fpu.c
  stable/12/sys/amd64/include/pcb.h
  stable/12/sys/i386/i386/npx.c
  stable/12/sys/i386/include/pcb.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/amd64/amd64/fpu.c
==============================================================================
--- stable/12/sys/amd64/amd64/fpu.c     Wed Oct 21 15:04:12 2020        
(r366909)
+++ stable/12/sys/amd64/amd64/fpu.c     Wed Oct 21 15:06:44 2020        
(r366910)
@@ -1219,8 +1219,9 @@ fpu_kern_leave(struct thread *td, struct fpu_kern_ctx 
        if (pcb->pcb_save == get_pcb_user_save_pcb(pcb)) {
                if ((pcb->pcb_flags & PCB_USERFPUINITDONE) != 0) {
                        set_pcb_flags(pcb, PCB_FPUINITDONE);
-                       clear_pcb_flags(pcb, PCB_KERNFPU);
-               } else
+                       if ((pcb->pcb_flags & PCB_KERNFPU_THR) == 0)
+                               clear_pcb_flags(pcb, PCB_KERNFPU);
+               } else if ((pcb->pcb_flags & PCB_KERNFPU_THR) == 0)
                        clear_pcb_flags(pcb, PCB_FPUINITDONE | PCB_KERNFPU);
        } else {
                if ((ctx->flags & FPU_KERN_CTX_FPUINITDONE) != 0)
@@ -1243,7 +1244,7 @@ fpu_kern_thread(u_int flags)
            ("mangled pcb_save"));
        KASSERT(PCB_USER_FPU(curpcb), ("recursive call"));
 
-       set_pcb_flags(curpcb, PCB_KERNFPU);
+       set_pcb_flags(curpcb, PCB_KERNFPU | PCB_KERNFPU_THR);
        return (0);
 }
 
@@ -1253,7 +1254,7 @@ is_fpu_kern_thread(u_int flags)
 
        if ((curthread->td_pflags & TDP_KTHREAD) == 0)
                return (0);
-       return ((curpcb->pcb_flags & PCB_KERNFPU) != 0);
+       return ((curpcb->pcb_flags & PCB_KERNFPU_THR) != 0);
 }
 
 /*

Modified: stable/12/sys/amd64/include/pcb.h
==============================================================================
--- stable/12/sys/amd64/include/pcb.h   Wed Oct 21 15:04:12 2020        
(r366909)
+++ stable/12/sys/amd64/include/pcb.h   Wed Oct 21 15:06:44 2020        
(r366910)
@@ -84,6 +84,7 @@ struct pcb {
 #define        PCB_KERNFPU     0x04    /* kernel uses fpu */
 #define        PCB_FPUINITDONE 0x08    /* fpu state is initialized */
 #define        PCB_USERFPUINITDONE 0x10 /* fpu user state is initialized */
+#define        PCB_KERNFPU_THR 0x20    /* fpu_kern_thread() */
 #define        PCB_32BIT       0x40    /* process has 32 bit context (segs 
etc) */
 #define        PCB_FPUNOSAVE   0x80    /* no save area for current FPU ctx */
 

Modified: stable/12/sys/i386/i386/npx.c
==============================================================================
--- stable/12/sys/i386/i386/npx.c       Wed Oct 21 15:04:12 2020        
(r366909)
+++ stable/12/sys/i386/i386/npx.c       Wed Oct 21 15:06:44 2020        
(r366910)
@@ -1427,11 +1427,12 @@ fpu_kern_leave(struct thread *td, struct fpu_kern_ctx 
                npxdrop();
        pcb->pcb_save = ctx->prev;
        if (pcb->pcb_save == get_pcb_user_save_pcb(pcb)) {
-               if ((pcb->pcb_flags & PCB_NPXUSERINITDONE) != 0)
+               if ((pcb->pcb_flags & PCB_NPXUSERINITDONE) != 0) {
                        pcb->pcb_flags |= PCB_NPXINITDONE;
-               else
-                       pcb->pcb_flags &= ~PCB_NPXINITDONE;
-               pcb->pcb_flags &= ~PCB_KERNNPX;
+                       if ((pcb->pcb_flags & PCB_KERNNPX_THR) == 0)
+                               pcb->pcb_flags &= ~PCB_KERNNPX;
+               } else if ((pcb->pcb_flags & PCB_KERNNPX_THR) == 0)
+                       pcb->pcb_flags &= ~(PCB_NPXINITDONE | PCB_KERNNPX);
        } else {
                if ((ctx->flags & FPU_KERN_CTX_NPXINITDONE) != 0)
                        pcb->pcb_flags |= PCB_NPXINITDONE;
@@ -1453,7 +1454,7 @@ fpu_kern_thread(u_int flags)
            ("mangled pcb_save"));
        KASSERT(PCB_USER_FPU(curpcb), ("recursive call"));
 
-       curpcb->pcb_flags |= PCB_KERNNPX;
+       curpcb->pcb_flags |= PCB_KERNNPX | PCB_KERNNPX_THR;
        return (0);
 }
 
@@ -1463,7 +1464,7 @@ is_fpu_kern_thread(u_int flags)
 
        if ((curthread->td_pflags & TDP_KTHREAD) == 0)
                return (0);
-       return ((curpcb->pcb_flags & PCB_KERNNPX) != 0);
+       return ((curpcb->pcb_flags & PCB_KERNNPX_THR) != 0);
 }
 
 /*

Modified: stable/12/sys/i386/include/pcb.h
==============================================================================
--- stable/12/sys/i386/include/pcb.h    Wed Oct 21 15:04:12 2020        
(r366909)
+++ stable/12/sys/i386/include/pcb.h    Wed Oct 21 15:06:44 2020        
(r366910)
@@ -82,6 +82,7 @@ struct pcb {
 
        u_int   pcb_flags;
 #define        PCB_DBREGS      0x02    /* process using debug registers */
+#define        PCB_KERNNPX_THR 0x04    /* fpu_kern_thread() */
 #define        PCB_NPXINITDONE 0x08    /* fpu state is initialized */
 #define        PCB_VM86CALL    0x10    /* in vm86 call */
 #define        PCB_NPXUSERINITDONE 0x20 /* user fpu state is initialized */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to