summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-06-23 07:37:54 +0000
committerkib <kib@FreeBSD.org>2014-06-23 07:37:54 +0000
commitfe547198b1973809825a6d6e48d12cf6f1c93741 (patch)
treea51002de5281f8a64709f9e315f0f0337d66108c /sys/amd64
parentc2a4e94982dc22b2ff3eb85b284839f96f217faf (diff)
downloadFreeBSD-src-fe547198b1973809825a6d6e48d12cf6f1c93741.zip
FreeBSD-src-fe547198b1973809825a6d6e48d12cf6f1c93741.tar.gz
Add FPU_KERN_KTHR flag to fpu_kern_enter(9), which avoids saving FPU
context into memory for the kernel threads which called fpu_kern_thread(9). This allows the fpu_kern_enter() callers to not check for is_fpu_kern_thread() to get the optimization. Apply the flag to padlock(4) and aesni(4). In aesni_cipher_process(), do not leak FPU context state on error. Sponsored by: The FreeBSD Foundation MFC after: 1 week
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/fpu.c8
-rw-r--r--sys/amd64/include/fpu.h1
2 files changed, 9 insertions, 0 deletions
diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c
index d2d506a..0f4b2b5 100644
--- a/sys/amd64/amd64/fpu.c
+++ b/sys/amd64/amd64/fpu.c
@@ -890,6 +890,7 @@ static MALLOC_DEFINE(M_FPUKERN_CTX, "fpukern_ctx",
"Kernel contexts for FPU state");
#define FPU_KERN_CTX_FPUINITDONE 0x01
+#define FPU_KERN_CTX_DUMMY 0x02 /* avoided save for the kern thread */
struct fpu_kern_ctx {
struct savefpu *prev;
@@ -933,6 +934,10 @@ fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx, u_int flags)
{
struct pcb *pcb;
+ if ((flags & FPU_KERN_KTHR) != 0 && is_fpu_kern_thread(0)) {
+ ctx->flags = FPU_KERN_CTX_DUMMY;
+ return (0);
+ }
pcb = td->td_pcb;
KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save ==
get_pcb_user_save_pcb(pcb), ("mangled pcb_save"));
@@ -952,6 +957,9 @@ fpu_kern_leave(struct thread *td, struct fpu_kern_ctx *ctx)
{
struct pcb *pcb;
+ 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"));
pcb = td->td_pcb;
critical_enter();
if (curthread == PCPU_GET(fpcurthread))
diff --git a/sys/amd64/include/fpu.h b/sys/amd64/include/fpu.h
index ef5d623..be1bdc6 100644
--- a/sys/amd64/include/fpu.h
+++ b/sys/amd64/include/fpu.h
@@ -84,6 +84,7 @@ void fpu_save_area_reset(struct savefpu *fsa);
*/
#define FPU_KERN_NORMAL 0x0000
#define FPU_KERN_NOWAIT 0x0001
+#define FPU_KERN_KTHR 0x0002
#endif
OpenPOWER on IntegriCloud