Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Oct 2020 15:06:44 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r366910 - in stable/12/sys: amd64/amd64 amd64/include i386/i386 i386/include
Message-ID:  <202010211506.09LF6iJa045082@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010211506.09LF6iJa045082>