[PATCH v4 09/12] x86: Enable SSE in 64-bit mode

Bin Meng bmeng.cn at gmail.com
Mon Nov 13 23:08:33 CET 2023


Hi Simon,

On Mon, Nov 13, 2023 at 4:03 AM Simon Glass <sjg at chromium.org> wrote:
>
> This is needed to support Truetype fonts. In any case, the compiler
> expects SSE to be available in 64-bit mode. Provide an option to enable
> SSE so that hardware floating-point arithmetic works.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Suggested-by: Bin Meng <bmeng.cn at gmail.com>
> ---
>
> Changes in v4:
> - Use a Kconfig option
>
>  arch/x86/Kconfig          |  8 ++++++++
>  arch/x86/config.mk        |  4 ++++
>  arch/x86/cpu/x86_64/cpu.c | 12 ++++++++++++
>  drivers/video/Kconfig     |  1 +
>  4 files changed, 25 insertions(+)
>
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 99e59d94c606..6b532d712ee8 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -723,6 +723,14 @@ config ROM_TABLE_SIZE
>         hex
>         default 0x10000
>
> +config X86_HARDFP
> +       bool "Support hardware floating point"
> +       help
> +         U-Boot generally does not make use of floating point. Where this is
> +         needed, it can be enabled using this option. This adjusts the
> +         start-up code for 64-bit mode and changes the compiler options for
> +         64-bit to enable SSE.

As discussed in another thread, this option should be made global to
all architectures and by default no.

> +
>  config HAVE_ITSS
>         bool "Enable ITSS"
>         help
> diff --git a/arch/x86/config.mk b/arch/x86/config.mk
> index 26ec1af2f0b0..2e3a7119e798 100644
> --- a/arch/x86/config.mk
> +++ b/arch/x86/config.mk
> @@ -27,9 +27,13 @@ ifeq ($(IS_32BIT),y)
>  PLATFORM_CPPFLAGS += -march=i386 -m32
>  else
>  PLATFORM_CPPFLAGS += $(if $(CONFIG_SPL_BUILD),,-fpic) -fno-common -march=core2 -m64
> +
> +ifndef CONFIG_X86_HARDFP
>  PLATFORM_CPPFLAGS += -mno-mmx -mno-sse
>  endif
>
> +endif # IS_32BIT
> +
>  PLATFORM_RELFLAGS += -fdata-sections -ffunction-sections -fvisibility=hidden
>
>  KBUILD_LDFLAGS += -Bsymbolic -Bsymbolic-functions
> diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
> index 2647bff891f8..5ea746ecce4d 100644
> --- a/arch/x86/cpu/x86_64/cpu.c
> +++ b/arch/x86/cpu/x86_64/cpu.c
> @@ -10,6 +10,7 @@
>  #include <init.h>
>  #include <asm/cpu.h>
>  #include <asm/global_data.h>
> +#include <asm/processor-flags.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -39,11 +40,22 @@ int x86_mp_init(void)
>         return 0;
>  }
>
> +/* enable SSE features for hardware floating point */
> +static void setup_sse_features(void)
> +{
> +       asm ("mov %%cr4, %%rax\n" \
> +       "or  %0, %%rax\n" \
> +       "mov %%rax, %%cr4\n" \
> +       : : "i" (X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT) : "eax");
> +}
> +
>  int x86_cpu_reinit_f(void)
>  {
>         /* set the vendor to Intel so that native_calibrate_tsc() works */
>         gd->arch.x86_vendor = X86_VENDOR_INTEL;
>         gd->arch.has_mtrr = true;
> +       if (IS_ENABLED(CONFIG_X86_HARDFP))
> +               setup_sse_features();
>
>         return 0;
>  }
> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> index 6f319ba0d544..39c82521be16 100644
> --- a/drivers/video/Kconfig
> +++ b/drivers/video/Kconfig
> @@ -180,6 +180,7 @@ config CONSOLE_ROTATION
>
>  config CONSOLE_TRUETYPE
>         bool "Support a console that uses TrueType fonts"
> +       select X86_HARDFP if X86

This should be "depends on HARDFP", indicating that the TrueType
library is using hardware fp itself, and user has to explicitly turn
the hardware fp Kconfig option on.

"Select" does not work for architectures that does not have the
"enabling hardware fp" logic in place.

>         help
>           TrueTrype fonts can provide outline-drawing capability rather than
>           needing to provide a bitmap for each font and size that is needed.
> --

Regards,
Bin


More information about the U-Boot mailing list