x86: enable soft float support for Zephyr SDK

This adds the correct compiler and linker flags to
support software floating point operations. The flags
need to be added to TOOLCHAIN_*_FLAGS for GCC to find
the correct library (when calling GCC with
--print-libgcc-file-name).

Note that software floating point needs to be turned
on for Newlib. This is due to Newlib having floating
point numbers in its various printf() functions which
results in floating point instructions being emitted
from toolchain. These instructions are placed very
early in the functions which results in them being
executed even though the format string contains
no floating point conversions. Without using CONFIG_FPU
to enable hardware floating point support, any calls to
printf() like functions will result in exceptions
complaining FPU is not available. Although forcing
CONFIG_FPU=y with newlib is an option, and because
the OS doesn't know which threads would call these
printf() functions, Zephyr has to assume all threads
are using FPU and thus incurring performance penalty as
every context switching now needs to save FPU registers.
A compromise here is to use soft float instead. Newlib
with soft float enabled does not have floating point
instructions and yet can still support its printf()
like functions.

Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
Daniel Leung 2020-12-10 13:08:33 -08:00 committed by Anas Nashif
commit ff720cd9b3
4 changed files with 301 additions and 1 deletions

View file

@ -86,7 +86,8 @@ config X86_PAE
more memory for paging structures.
menu "Architecture Floating Point Options"
depends on CPU_HAS_FPU
if CPU_HAS_FPU
config SSE
bool "SSE registers"
@ -138,6 +139,15 @@ config LAZY_FPU_SHARING
malware to read the contents of all floating point registers, see
CVE-2018-3665.
endif # CPU_HAS_FPU
config X86_FP_USE_SOFT_FLOAT
bool
prompt "Use Software Floating Point Operations" if !(NEWLIB_LIBC && !FPU)
default y if NEWLIB_LIBC && !FPU
help
Enable using software floating point operations.
endmenu
config DCACHE_LINE_SIZE