Date: Mon, 5 Jun 2006 21:10:25 GMT From: Rostislav Krasny <rosti.bsd@gmail.com> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/98460 : [kernel] [patch] fpu_clean_state() cannot be disabled for not AMD processors, those are not vulnerable to FreeBSD-SA-06:14.fpu Message-ID: <200606052110.k55LAP0K061952@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/98460; it has been noted by GNATS.
From: Rostislav Krasny <rosti.bsd@gmail.com>
To: Bruce Evans <bde@zeta.org.au>
Cc: freebsd-gnats-submit@FreeBSD.org
Subject: Re: kern/98460 : [kernel] [patch] fpu_clean_state() cannot be
disabled for not AMD processors, those are not vulnerable to
FreeBSD-SA-06:14.fpu
Date: Tue, 6 Jun 2006 00:00:28 +0300
On Mon, 5 Jun 2006 08:25:06 +1000 (EST)
Bruce Evans <bde@zeta.org.au> wrote:
> On Sun, 4 Jun 2006, Rostislav Krasny wrote:
>
> > On Sun, 4 Jun 2006, Bruce Evans wrote:
> > > The configuration should be dynamic and automatic, so that it doesn't
> > > take changes to zillions of configuration files to implement and
> > > document an option that almost no one will know to set. I think there
> > > is a simple feature test for the AMD misfeature.
> >
> > David Xu had proposed something like that. But from Colin Percival's
> > reply I understood that it is hard to be done effectively. See their
> > discussion by the first URL in this PR.
>
> I don't see how it can be hard. Perhaps it is too CPU-dependent for
> tests based on cpuid to be easy or future-proof, but a runtime test
> in the probe would be easy. Here is a userland version. It gives the
> expected result on the following systems P2(Celeron) (mine), P3
> (freefall), P4(Xeon) (nosedive), AthlonXP (mine) and Opteron (sledge).
> It would crash on systems without FXSR. To be complete, the userland
> version should repeat the test many times to reduce the chance of a
> misprobe due to broken context switching clobbering the pointer
> underneath it. The kernel version can check for FXSR more easily and
> can just prevent context switching.
>
> %%%
> #include <sys/types.h>
>
> #ifdef __amd64__
> #include <machine/fpu.h>
>
> static struct savefpu xmmstate;
> #define en_fip en_rip
> #else
> #include <machine/npx.h>
>
> static struct savexmm xmmstate;
> #endif
>
> int
> main(void)
> {
> /* Set up a fairly clean state with a zero last-instruction pointer. */
> asm("fninit");
>
> /* Set the last-instruction pointer mod 2^32 to nonzero. */
> asm(".align 2,0x90; nop; fnop");
>
> /* Try to see what the last-instruction pointer got changed to. */
> asm("fxsave xmmstate");
>
> /* Have dubious AMD optimizations iff the change didn't get saved. */
> if (xmmstate.sv_env.en_fip == 0) {
> printf("cpu_fxsr |= CPU_FXSR_NEEDCLEAN;\n");
> return (1);
> } else {
> printf("cpu_fxsr &= ~CPU_FXSR_NEEDCLEAN;\n");
> return (0);
> }
> }
> %%%
And then you want to call the fpu_clean_state() function conditionally,
like in following example?
if (cpu_fxsr & CPU_FXSR_NEEDCLEAN)
fpu_clean_state();
But this looks same to what Davi Xu had proposed. Read what Colin
Percival had replied about that proposition:
http://lists.freebsd.org/pipermail/freebsd-current/2006-May/062683.html
Eliminating the fpu_clean_state() by "options CPU_FXSAVE_NO_LEAK" could
be used as a custom optimization. No one is obliged to use it, as well
as many other CPU_* optimization options.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606052110.k55LAP0K061952>
