-mno-sse -mno-sse2 -mno-mmx -mno-3dnow when compiling kernel

Peter Wemm peter at wemm.org
Thu Feb 17 13:49:31 PST 2005


On Sunday 13 February 2005 10:29 am, Thomas Krause -CI- wrote:
> Hello,
> why are the Switches "-mno-sse -mno-sse2 -mno-mmx -mno-3dnow" are set
> when compiling an amd64 kernel? I think, the CPU supports all thease
> features.
>
> Features=0x78bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,P
>GE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2>
>
> I have no CPUTYPE specified in /etc/make.conf, as I could not
> find a matching option in /usr/src/share/examples/etc/make.conf.

For speed reasons, we restrict the kernel to using integer instructions 
only.  This means we can avoid the considerable expense of 
saving/restoring floating point context unnecessarily for syscalls, 
interrupts, etc.

On FreeBSD/i386, the compiler generally doesn't generate floating point 
instructions unless there is a reason to.  But on FreeBSD/amd64, the 
compiler will do it readily because things like MMX, SSE and SSE2 are 
*known* to exist on this family and are part of the function calling 
conventions, especially for things like varargs functions.

The upshot of this is that we are not in a lot of danger of the i386 
compiler accidently generating floating point code for the kernel, but 
on FreeBSD/amd64, it can and does if you give it the chance.

How the code for the kernel is generated has no bearing on the user code 
environment at all.  The floating point/mmx/sse/sse2 context is 
reserved entirely for the user.

Note that we *could* concievably set aside a few xmm registers for 
faster data copies inside the kernel, but we don't do it yet.  I 
believe linux makes %xmm0 and %xmm1 available in the kernel and saves 
them with every trap into kernel mode.
-- 
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5


More information about the freebsd-amd64 mailing list