Now that aesni won't reuse fpu contexts (D3016), add seatbelts to the
fpu code to prevent other reuse of the contexts in the future... Differential Revision: https://reviews.freebsd.org/D3015 Reviewed by: kib, gnn
This commit is contained in:
parent
9d38fd076e
commit
e808e13b8b
@ -916,6 +916,7 @@ static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx",
|
||||
|
||||
#define FPU_KERN_CTX_FPUINITDONE 0x01
|
||||
#define FPU_KERN_CTX_DUMMY 0x02 /* avoided save for the kern thread */
|
||||
#define FPU_KERN_CTX_INUSE 0x04
|
||||
|
||||
struct fpu_kern_ctx {
|
||||
struct savefpu *prev;
|
||||
@ -940,6 +941,7 @@ void
|
||||
fpu_kern_free_ctx(struct fpu_kern_ctx *ctx)
|
||||
{
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) == 0, ("free'ing inuse ctx"));
|
||||
/* XXXKIB clear the memory ? */
|
||||
free(ctx, M_FPUKERN_CTX);
|
||||
}
|
||||
@ -959,14 +961,16 @@ fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) == 0, ("using inuse ctx"));
|
||||
|
||||
if ((flags & FPU_KERN_KTHR) != 0 && is_fpu_kern_thread(0)) {
|
||||
ctx->flags = FPU_KERN_CTX_DUMMY;
|
||||
ctx->flags = FPU_KERN_CTX_DUMMY | FPU_KERN_CTX_INUSE;
|
||||
return (0);
|
||||
}
|
||||
pcb = td->td_pcb;
|
||||
KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save ==
|
||||
get_pcb_user_save_pcb(pcb), ("mangled pcb_save"));
|
||||
ctx->flags = 0;
|
||||
ctx->flags = FPU_KERN_CTX_INUSE;
|
||||
if ((pcb->pcb_flags & PCB_FPUINITDONE) != 0)
|
||||
ctx->flags |= FPU_KERN_CTX_FPUINITDONE;
|
||||
fpuexit(td);
|
||||
@ -982,6 +986,10 @@ fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) != 0,
|
||||
("leaving not inuse ctx"));
|
||||
ctx->flags &= ~FPU_KERN_CTX_INUSE;
|
||||
|
||||
if (is_fpu_kern_thread(0) && (ctx->flags & FPU_KERN_CTX_DUMMY) != 0)
|
||||
return (0);
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_DUMMY) == 0, ("dummy ctx"));
|
||||
|
@ -1359,6 +1359,7 @@ static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx",
|
||||
|
||||
#define FPU_KERN_CTX_NPXINITDONE 0x01
|
||||
#define FPU_KERN_CTX_DUMMY 0x02
|
||||
#define FPU_KERN_CTX_INUSE 0x04
|
||||
|
||||
struct fpu_kern_ctx {
|
||||
union savefpu *prev;
|
||||
@ -1383,6 +1384,7 @@ void
|
||||
fpu_kern_free_ctx(struct fpu_kern_ctx *ctx)
|
||||
{
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) == 0, ("free'ing inuse ctx"));
|
||||
/* XXXKIB clear the memory ? */
|
||||
free(ctx, M_FPUKERN_CTX);
|
||||
}
|
||||
@ -1402,14 +1404,16 @@ fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) == 0, ("using inuse ctx"));
|
||||
|
||||
if ((flags & FPU_KERN_KTHR) != 0 && is_fpu_kern_thread(0)) {
|
||||
ctx->flags = FPU_KERN_CTX_DUMMY;
|
||||
ctx->flags = FPU_KERN_CTX_DUMMY | FPU_KERN_CTX_INUSE;
|
||||
return (0);
|
||||
}
|
||||
pcb = td->td_pcb;
|
||||
KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save ==
|
||||
get_pcb_user_save_pcb(pcb), ("mangled pcb_save"));
|
||||
ctx->flags = 0;
|
||||
ctx->flags = FPU_KERN_CTX_INUSE;
|
||||
if ((pcb->pcb_flags & PCB_NPXINITDONE) != 0)
|
||||
ctx->flags |= FPU_KERN_CTX_NPXINITDONE;
|
||||
npxexit(td);
|
||||
@ -1425,6 +1429,10 @@ fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx)
|
||||
{
|
||||
struct pcb *pcb;
|
||||
|
||||
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) != 0,
|
||||
("leaving not inuse ctx"));
|
||||
ctx->flags &= ~FPU_KERN_CTX_INUSE;
|
||||
|
||||
if (is_fpu_kern_thread(0) && (ctx->flags & FPU_KERN_CTX_DUMMY) != 0)
|
||||
return (0);
|
||||
pcb = td->td_pcb;
|
||||
|
Loading…
Reference in New Issue
Block a user