Browse Source

linuxkm: add ASFLAGS_FPU_DISABLE_SIMD_ENABLE ASFLAGS_FPU_ENABLE_SIMD_DISABLE ASFLAGS_FPUSIMD_DISABLE ASFLAGS_FPUSIMD_ENABLE to facilitate erroring for unexpected fp/simd instructions in Kbuild, while allowing expected ones.

Daniel Pouzzner 3 years ago
parent
commit
331fe47eb6
3 changed files with 61 additions and 2 deletions
  1. 4 1
      Makefile.am
  2. 9 1
      configure.ac
  3. 48 0
      m4/ax_linuxkm.m4

+ 4 - 1
Makefile.am

@@ -201,7 +201,10 @@ if BUILD_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
+        CFLAGS_AUTO_VECTORIZE_DISABLE CFLAGS_AUTO_VECTORIZE_ENABLE \
+        ASFLAGS_FPU_DISABLE_SIMD_ENABLE ASFLAGS_FPU_ENABLE_SIMD_DISABLE \
+        ASFLAGS_FPUSIMD_DISABLE ASFLAGS_FPUSIMD_ENABLE
+
     SUBDIRS = linuxkm
 endif
 

+ 9 - 1
configure.ac

@@ -5357,6 +5357,10 @@ if test "x$ENABLED_LINUXKM" = "xyes"; then
     AC_SUBST([CFLAGS_SIMD_ENABLE])
     AC_SUBST([CFLAGS_AUTO_VECTORIZE_DISABLE])
     AC_SUBST([CFLAGS_AUTO_VECTORIZE_ENABLE])
+    AC_SUBST([ASFLAGS_FPU_DISABLE_SIMD_ENABLE])
+    AC_SUBST([ASFLAGS_FPU_ENABLE_SIMD_DISABLE])
+    AC_SUBST([ASFLAGS_FPUSIMD_DISABLE])
+    AC_SUBST([ASFLAGS_FPUSIMD_ENABLE])
 
     if test "$ENABLED_AFALG" = "yes"; then
         AC_MSG_ERROR([--enable-afalg is incompatible with --enable-linuxkm.])
@@ -5673,7 +5677,11 @@ 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 "   * Auto-vectorize C flags:     $CFLAGS_AUTO_VECTORIZE_ENABLE" && \
+echo "   * SIMD enable as flags:       $ASFLAGS_FPU_DISABLE_SIMD_ENABLE" && \
+echo "   * FPU enable as flags:        $ASFLAGS_FPU_ENABLE_SIMD_DISABLE" && \
+echo "   * SIMD+FPU disable as flags:  $ASFLAGS_FPUSIMD_DISABLE" && \
+echo "   * SIMD+FPU enable as flags:   $ASFLAGS_FPUSIMD_ENABLE"
 echo "   * Debug enabled:              $ax_enable_debug"
 echo "   * Coverage enabled:           $ax_enable_coverage"
 echo "   * Warnings as failure:        $ac_cv_warnings_as_errors"

+ 48 - 0
m4/ax_linuxkm.m4

@@ -96,5 +96,53 @@ AC_DEFUN([AX_SIMD_CC_COMPILER_FLAGS], [
         AX_APPEND_COMPILE_FLAGS([-ftree-slp-vectorize],[CFLAGS_AUTO_VECTORIZE_ENABLE])
     fi
 
+    case "$host_cpu" in
+    x86_64)
+        # note that gnu as accepts archs of the form -march=+no387, signifying the
+        # default target arch modified with no387.  by default, we use that here.
+        if test "$ASFLAGS_FPU_DISABLE_SIMD_ENABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+no87+no287+no387+no687+sse+sse2+sse3+ssse3+sse4.1+sse4.2+sse4+avx+avx2+avx512f"],[ASFLAGS_FPU_DISABLE_SIMD_ENABLE])
+        fi
+
+        if test "$ASFLAGS_FPU_ENABLE_SIMD_DISABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+387+687+nosse+nosse2+nosse3+nossse3+nosse4.1+nosse4.2+nosse4+noavx+noavx2+noavx512f"],[ASFLAGS_FPU_ENABLE_SIMD_DISABLE])
+        fi
+
+        if test "$ASFLAGS_FPUSIMD_DISABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+no387+no687+nosse+nosse2+nosse3+nossse3+nosse4.1+nosse4.2+nosse4+noavx+noavx2+noavx512f"],[ASFLAGS_FPUSIMD_DISABLE])
+        fi
+
+        if test "$ASFLAGS_FPUSIMD_ENABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+387+687+sse+sse2+sse3+ssse3+sse4.1+sse4.2+sse4+avx+avx2+avx512f"],[ASFLAGS_FPUSIMD_ENABLE])
+        fi
+
+        ;;
+    aarch64)
+        if test "$BASE_TARGET_ARCH" = ""; then
+            BASE_TARGET_ARCH=all
+        fi
+
+        if test "$ASFLAGS_FPU_DISABLE_SIMD_ENABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+nofpu+simd"],[ASFLAGS_FPU_DISABLE_SIMD_ENABLE])
+        fi
+
+        if test "$ASFLAGS_FPU_ENABLE_SIMD_DISABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+fpu+nosimd"],[ASFLAGS_FPU_ENABLE_SIMD_DISABLE])
+        fi
+
+        if test "$ASFLAGS_FPUSIMD_DISABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+nofpu+nosimd"],[ASFLAGS_FPUSIMD_DISABLE])
+        fi
+
+        if test "$ASFLAGS_FPUSIMD_ENABLE" = ""; then
+            AX_APPEND_COMPILE_FLAGS([-Wa,-march="${BASE_TARGET_ARCH}+fpu+simd"],[$ASFLAGS_FPUSIMD_ENABLE])
+        fi
+
+        ;;
+    *)
+        AC_MSG_ERROR(["Don\'t know how to construct assembler flags for target \"${host_cpu}\"."])
+        ;;
+    esac
+
     AC_LANG_POP
 ])