Page MenuHomeFreeBSD

D25511.1786536721.diff
No OneTemporary

Size
3 KB
Referenced Files
None
Subscribers
None

D25511.1786536721.diff

Index: head/sys/amd64/amd64/fpu.c
===================================================================
--- head/sys/amd64/amd64/fpu.c
+++ head/sys/amd64/amd64/fpu.c
@@ -1230,8 +1230,9 @@
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)
@@ -1254,7 +1255,7 @@
("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);
}
@@ -1264,7 +1265,7 @@
if ((curthread->td_pflags & TDP_KTHREAD) == 0)
return (0);
- return ((curpcb->pcb_flags & PCB_KERNFPU) != 0);
+ return ((curpcb->pcb_flags & PCB_KERNFPU_THR) != 0);
}
/*
Index: head/sys/amd64/include/pcb.h
===================================================================
--- head/sys/amd64/include/pcb.h
+++ head/sys/amd64/include/pcb.h
@@ -84,6 +84,7 @@
#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 */
Index: head/sys/i386/i386/npx.c
===================================================================
--- head/sys/i386/i386/npx.c
+++ head/sys/i386/i386/npx.c
@@ -1472,11 +1472,12 @@
}
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;
@@ -1498,7 +1499,7 @@
("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);
}
@@ -1508,7 +1509,7 @@
if ((curthread->td_pflags & TDP_KTHREAD) == 0)
return (0);
- return ((curpcb->pcb_flags & PCB_KERNNPX) != 0);
+ return ((curpcb->pcb_flags & PCB_KERNNPX_THR) != 0);
}
/*
Index: head/sys/i386/include/pcb.h
===================================================================
--- head/sys/i386/include/pcb.h
+++ head/sys/i386/include/pcb.h
@@ -82,6 +82,7 @@
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 */

File Metadata

Mime Type
text/plain
Expires
Wed, Aug 12, 12:12 PM (7 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29399308
Default Alt Text
D25511.1786536721.diff (3 KB)

Event Timeline