diff options
author | jhb <jhb@FreeBSD.org> | 2009-03-25 22:08:30 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2009-03-25 22:08:30 +0000 |
commit | afc2ecb61b9348611fdae9f1b66b88494c3891d5 (patch) | |
tree | 856f56f219282bb7da4e7a2456d17f41f65cbfaf | |
parent | 9c09aaf3a38f2d4fba3349ede23e3c51d6a523ea (diff) | |
download | FreeBSD-src-afc2ecb61b9348611fdae9f1b66b88494c3891d5.zip FreeBSD-src-afc2ecb61b9348611fdae9f1b66b88494c3891d5.tar.gz |
Fix a few nits in the earlier changes to prevent local information leakage
in AMD FPUs:
- Do not clear the affected state in the case that the FPU registers for
the thread that already owns the FPU are changed via fpu_setregs(). The
only local information the thread would see is its own state in that
case.
- Fix a type mismatch for the dummy variable used in a "fld". It accepts
a float, not a double.
Reviewed by: bde
Approved by: so (cperciva)
MFC after: 1 month
-rw-r--r-- | sys/amd64/amd64/fpu.c | 3 | ||||
-rw-r--r-- | sys/i386/isa/npx.c | 12 |
2 files changed, 9 insertions, 6 deletions
diff --git a/sys/amd64/amd64/fpu.c b/sys/amd64/amd64/fpu.c index c2f7d00..10cb6c2 100644 --- a/sys/amd64/amd64/fpu.c +++ b/sys/amd64/amd64/fpu.c @@ -480,7 +480,6 @@ fpusetregs(struct thread *td, struct savefpu *addr) s = intr_disable(); if (td == PCPU_GET(fpcurthread)) { - fpu_clean_state(); fxrstor(addr); intr_restore(s); } else { @@ -499,10 +498,10 @@ fpusetregs(struct thread *td, struct savefpu *addr) * In order to avoid leaking this information across processes, we clean * these values by performing a dummy load before executing fxrstor(). */ -static double dummy_variable = 0.0; static void fpu_clean_state(void) { + static float dummy_variable = 0.0; u_short status; /* diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c index e57d9d4..6da4b4c 100644 --- a/sys/i386/isa/npx.c +++ b/sys/i386/isa/npx.c @@ -794,6 +794,11 @@ npxdna(void) PCPU_SET(fpcurthread, curthread); pcb = PCPU_GET(curpcb); +#ifdef CPU_ENABLE_SSE + if (cpu_fxsr) + fpu_clean_state(); +#endif + if ((pcb->pcb_flags & PCB_NPXINITDONE) == 0) { /* * This is the first time this thread has used the FPU or @@ -976,10 +981,10 @@ fpusave(addr) * In order to avoid leaking this information across processes, we clean * these values by performing a dummy load before executing fxrstor(). */ -static double dummy_variable = 0.0; static void fpu_clean_state(void) { + static float dummy_variable = 0.0; u_short status; /* @@ -1005,10 +1010,9 @@ fpurstor(addr) { #ifdef CPU_ENABLE_SSE - if (cpu_fxsr) { - fpu_clean_state(); + if (cpu_fxsr) fxrstor(addr); - } else + else #endif frstor(addr); } |