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
This commit is contained in:
John Baldwin 2009-03-25 22:08:30 +00:00
parent 284699a790
commit b9dda9d6fe
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=190426
2 changed files with 9 additions and 6 deletions

View File

@ -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;
/*

View File

@ -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);
}