Explorar el Código

linuxkm: add autotools detection of usable compiler flags for enabling and disabling SIMD and fp registers and auto-vectorization, and integrate into linuxkm makefiles.

Daniel Pouzzner hace 3 años
padre
commit
5589565051
Se han modificado 4 ficheros con 77 adiciones y 29 borrados
  1. 5 2
      Makefile.am
  2. 17 3
      configure.ac
  3. 4 24
      linuxkm/Kbuild
  4. 51 0
      m4/ax_linuxkm.m4

+ 5 - 2
Makefile.am

@@ -198,8 +198,11 @@ endif
 include scripts/include.am
 
 if BUILD_LINUXKM
-export KERNEL_ROOT KERNEL_ARCH KERNEL_OPT AM_CFLAGS CFLAGS AM_CCASFLAGS CCASFLAGS src_libwolfssl_la_OBJECTS ENABLED_CRYPT_TESTS ENABLED_ASM
-SUBDIRS = linuxkm
+    export KERNEL_ROOT KERNEL_ARCH KERNEL_EXTRA_CFLAGS AM_CFLAGS CFLAGS AM_CCASFLAGS CCASFLAGS \
+        src_libwolfssl_la_OBJECTS ENABLED_CRYPT_TESTS ENABLED_ASM CFLAGS_FPU_DISABLE \
+        CFLAGS_FPU_ENABLE CFLAGS_SIMD_DISABLE CFLAGS_SIMD_ENABLE \
+        CFLAGS_AUTO_VECTORIZE_DISABLE CFLAGS_AUTO_VECTORIZE_ENABLE
+    SUBDIRS = linuxkm
 endif
 
 if USE_VALGRIND

+ 17 - 3
configure.ac

@@ -5332,6 +5332,14 @@ case $host_os in
 esac
 
 if test "x$ENABLED_LINUXKM" = "xyes"; then
+    AX_SIMD_CC_COMPILER_FLAGS
+    AC_SUBST([CFLAGS_FPU_DISABLE])
+    AC_SUBST([CFLAGS_FPU_ENABLE])
+    AC_SUBST([CFLAGS_SIMD_DISABLE])
+    AC_SUBST([CFLAGS_SIMD_ENABLE])
+    AC_SUBST([CFLAGS_AUTO_VECTORIZE_DISABLE])
+    AC_SUBST([CFLAGS_AUTO_VECTORIZE_ENABLE])
+
     if test "$ENABLED_DISTRO" = "yes"; then
         AC_MSG_ERROR([--enable-distro is incompatible with --enable-linuxkm.])
     fi
@@ -5633,6 +5641,15 @@ echo "   * C++ Flags:                  $CXXFLAGS"
 echo "   * CPP Flags:                  $CPPFLAGS"
 echo "   * CCAS Flags:                 $CCASFLAGS"
 echo "   * LIB Flags:                  $LIB"
+test "$ENABLED_LINUXKM" = "yes" && \
+echo "   * Linux Kernel Build Root:    $KERNEL_ROOT" && \
+echo "   * Linux Kernel Build Arch:    $KERNEL_ARCH" && \
+echo "   * fpu disable C flags:        $CFLAGS_FPU_DISABLE" && \
+echo "   * fpu enable C flags:         $CFLAGS_FPU_ENABLE" && \
+echo "   * SIMD disable C flags:       $CFLAGS_SIMD_DISABLE" && \
+echo "   * SIMD enable C flags:        $CFLAGS_SIMD_ENABLE" && \
+echo "   * No-auto-vectorize C flags:  $CFLAGS_AUTO_VECTORIZE_DISABLE" && \
+echo "   * Auto-vectorize C flags:     $CFLAGS_AUTO_VECTORIZE_ENABLE"
 echo "   * Debug enabled:              $ax_enable_debug"
 echo "   * Coverage enabled:           $ax_enable_coverage"
 echo "   * Warnings as failure:        $ac_cv_warnings_as_errors"
@@ -5764,9 +5781,6 @@ echo "   * wolfSCEP                    $ENABLED_WOLFSCEP"
 echo "   * Secure Remote Password      $ENABLED_SRP"
 echo "   * Small Stack:                $ENABLED_SMALL_STACK"
 echo "   * Linux Kernel Module:        $ENABLED_LINUXKM"
-test "$ENABLED_LINUXKM" = "yes" && \
-echo "   * Linux Kernel Build Root:    $KERNEL_ROOT" && \
-echo "   * Linux Kernel Build Arch:    $KERNEL_ARCH"
 echo "   * valgrind unit tests:        $ENABLED_VALGRIND"
 echo "   * LIBZ:                       $ENABLED_LIBZ"
 echo "   * Examples:                   $ENABLED_EXAMPLES"

+ 4 - 24
linuxkm/Kbuild

@@ -50,31 +50,11 @@ MAX_STACK_FRAME_SIZE=$(shell echo $$(( $(KERNEL_THREAD_STACK_SIZE) / 4)))
 
 libwolfssl-y := $(WOLFSSL_OBJ_FILES) linuxkm/module_hooks.o linuxkm/module_exports.o
 
-ifeq "$(KERNEL_ARCH)" "x86"
-    WOLFSSL_CFLAGS_NO_VECTOR_INSNS ::= -mno-sse -mno-80387 -mno-fp-ret-in-387
-    ifeq "$(ENABLED_ASM)" "yes"
-        # reenable minimum subset of vector ops needed for compilation of explicitly vectorized
-        # code, while explicitly disabling auto-vectorization, and leave fp disabled.
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= -msse -mmmx -msse2 -mavx -mavx2 -mno-80387 -mno-fp-ret-in-387 -fno-builtin -fno-tree-vectorize -fno-tree-loop-vectorize -fno-tree-slp-vectorize
-    else
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= $(WOLFSSL_CFLAGS_NO_VECTOR_INSNS)
-    endif
-else ifeq "$(KERNEL_ARCH)" "arm64"
-    WOLFSSL_CFLAGS_NO_VECTOR_INSNS ::= -mgeneral-regs-only -mno-fpu
-    ifeq "$(ENABLED_ASM)" "yes"
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= -mno-general-regs-only -mno-fpu -fno-builtin -fno-tree-vectorize -fno-tree-loop-vectorize -fno-tree-slp-vectorize
-    else
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= $(WOLFSSL_CFLAGS_NO_VECTOR_INSNS)
-    endif
-else ifeq "$(KERNEL_ARCH)" "arm"
-    WOLFSSL_CFLAGS_NO_VECTOR_INSNS ::= -mgeneral-regs-only -mno-fpu
-    ifeq "$(ENABLED_ASM)" "yes"
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= -mno-general-regs-only -mno-fpu -fno-builtin -fno-tree-vectorize -fno-tree-loop-vectorize -fno-tree-slp-vectorize
-    else
-        WOLFSSL_CFLAGS_YES_VECTOR_INSNS ::= $(WOLFSSL_CFLAGS_NO_VECTOR_INSNS)
-    endif
+WOLFSSL_CFLAGS_NO_VECTOR_INSNS := $(CFLAGS_SIMD_DISABLE) $(CFLAGS_FPU_DISABLE)
+ifeq "$(ENABLED_ASM)" "yes"
+    WOLFSSL_CFLAGS_YES_VECTOR_INSNS := $(CFLAGS_SIMD_ENABLE) $(CFLAGS_FPU_DISABLE) $(CFLAGS_AUTO_VECTORIZE_DISABLE)
 else
-    $(error Don't know how to target arch $(KERNEL_ARCH).)
+    WOLFSSL_CFLAGS_YES_VECTOR_INSNS := $(WOLFSSL_CFLAGS_NO_VECTOR_INSNS)
 endif
 
 ccflags-y = $(WOLFSSL_CFLAGS) $(WOLFSSL_CFLAGS_NO_VECTOR_INSNS)

+ 51 - 0
m4/ax_linuxkm.m4

@@ -47,3 +47,54 @@ else
   AC_MSG_RESULT([no default configured kernel arch found])
 fi
 ])
+
+
+AC_DEFUN([AX_SIMD_CC_COMPILER_FLAGS], [
+    AX_REQUIRE_DEFINED([AX_APPEND_COMPILE_FLAGS])
+    AC_REQUIRE([AX_VCS_CHECKOUT])
+    AC_REQUIRE([AX_DEBUG])
+
+    AC_LANG_PUSH([C])
+
+    if test -z "$CFLAGS_FPU_DISABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-mno-80387],[CFLAGS_FPU_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-mno-fp-ret-in-387],[CFLAGS_FPU_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-mno-fpu],[CFLAGS_FPU_DISABLE])
+    fi
+
+    if test -z "$CFLAGS_FPU_ENABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-m80387],[CFLAGS_FPU_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-mfpu],[CFLAGS_FPU_ENABLE])
+    fi
+
+    if test -z "$CFLAGS_SIMD_DISABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-mno-sse],[CFLAGS_SIMD_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-mgeneral-regs-only],[CFLAGS_SIMD_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-mno-sse],[CFLAGS_SIMD_DISABLE])
+    fi
+
+    if test -z "$CFLAGS_SIMD_ENABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-msse],[CFLAGS_SIMD_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-mmmx],[CFLAGS_SIMD_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-msse2],[CFLAGS_SIMD_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-mavx],[CFLAGS_SIMD_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-mavx2],[CFLAGS_SIMD_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-mno-general-regs-only],[CFLAGS_SIMD_ENABLE])
+    fi
+
+    if test -z "$CFLAGS_AUTO_VECTORIZE_DISABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-fno-builtin],[CFLAGS_AUTO_VECTORIZE_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-fno-tree-vectorize],[CFLAGS_AUTO_VECTORIZE_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-fno-tree-loop-vectorize],[CFLAGS_AUTO_VECTORIZE_DISABLE])
+        AX_APPEND_COMPILE_FLAGS([-fno-tree-slp-vectorize],[CFLAGS_AUTO_VECTORIZE_DISABLE])
+    fi
+
+    if test -z "$CFLAGS_AUTO_VECTORIZE_ENABLE"; then
+        AX_APPEND_COMPILE_FLAGS([-fbuiltin],[CFLAGS_AUTO_VECTORIZE_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-ftree-vectorize],[CFLAGS_AUTO_VECTORIZE_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-ftree-loop-vectorize],[CFLAGS_AUTO_VECTORIZE_ENABLE])
+        AX_APPEND_COMPILE_FLAGS([-ftree-slp-vectorize],[CFLAGS_AUTO_VECTORIZE_ENABLE])
+    fi
+
+    AC_LANG_POP
+])