diff --git a/Makefile.am b/Makefile.am index 3ce3118ef..436315d43 100644 --- a/Makefile.am +++ b/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 diff --git a/configure.ac b/configure.ac index 3464283b7..663242ff2 100644 --- a/configure.ac +++ b/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" diff --git a/linuxkm/Kbuild b/linuxkm/Kbuild index 432b9ba75..3f807d18b 100644 --- a/linuxkm/Kbuild +++ b/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) diff --git a/m4/ax_linuxkm.m4 b/m4/ax_linuxkm.m4 index 1f6d59811..f9c8be7a8 100644 --- a/m4/ax_linuxkm.m4 +++ b/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 +])