diff --git a/.gitignore b/.gitignore index 41b0b5dca..372fba3d3 100644 --- a/.gitignore +++ b/.gitignore @@ -229,6 +229,15 @@ IDE/MDK-ARM/LPC43xx/LPC43xx/ *.gcno *.gcda *.gcov +!linuxkm/Makefile +/Kbuild +linuxkm/*.ko +linuxkm/Module.symvers +linuxkm/built-in.a +linuxkm/modules.order +linuxkm/wolfcrypt +linuxkm/libwolfssl.mod +linuxkm/libwolfssl.mod.c # MPLAB Generated Files (OS X) mcapi/wolfcrypt_mcapi.X/nbproject/Makefile-* diff --git a/Makefile.am b/Makefile.am index 49dc6c689..a8154b1bd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -195,7 +195,8 @@ endif include scripts/include.am if BUILD_LINUXKM -SUBDIRS = . linuxkm +export KROOT KARCH AM_CFLAGS CFLAGS AM_CCASFLAGS CCASFLAGS src_libwolfssl_la_OBJECTS +SUBDIRS = linuxkm endif if USE_VALGRIND diff --git a/configure.ac b/configure.ac index 9dae016de..0780439bc 100644 --- a/configure.ac +++ b/configure.ac @@ -3381,16 +3381,18 @@ then [AS_HELP_STRING([--with-linux-source=PATH],[PATH to root of Linux kernel build tree])], [KROOT=$withval], [KROOT=$DEFAULT_KROOT]) + AC_SUBST([KROOT]) AC_DEFAULT_KERNEL_ARCH AC_ARG_WITH([linux-arch], [AS_HELP_STRING([--with-linux-arch=arch],[built arch (SRCARCH) of Linux kernel build tree])], [KARCH=$withval], [KARCH=$DEFAULT_KARCH]) + AC_SUBST([KARCH]) - AC_DEFINE_KERNEL_KFLAGS - - AM_CPPFLAGS="$KFLAGS $AM_CPPFLAGS" +# AC_DEFINE_KERNEL_KFLAGS +# +# AM_CPPFLAGS="$KFLAGS $AM_CPPFLAGS" fi @@ -5413,7 +5415,7 @@ AC_SUBST([LIB_STATIC_ADD]) # FINAL AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) -AC_CONFIG_FILES([Makefile wolfssl/version.h wolfssl/options.h cyassl/options.h support/wolfssl.pc rpm/spec linuxkm/Makefile]) +AC_CONFIG_FILES([Makefile wolfssl/version.h wolfssl/options.h cyassl/options.h support/wolfssl.pc rpm/spec]) AX_CREATE_GENERIC_CONFIG AX_AM_JOBSERVER([yes]) @@ -5665,8 +5667,7 @@ echo " * Small Stack: $ENABLED_SMALL_STACK" echo " * Linux Kernel Module: $ENABLED_LINUXKM" test "$ENABLED_LINUXKM" = "yes" && \ echo " * Linux Kernel Build Root: $KROOT" && \ -echo " * Linux Kernel Build Arch: $KARCH" && \ -echo " * Linux Kernel Build Flags: $KFLAGS" +echo " * Linux Kernel Build Arch: $KARCH" echo " * valgrind unit tests: $ENABLED_VALGRIND" echo " * LIBZ: $ENABLED_LIBZ" echo " * Examples: $ENABLED_EXAMPLES" diff --git a/linuxkm/Kbuild b/linuxkm/Kbuild new file mode 100644 index 000000000..83d1d3c68 --- /dev/null +++ b/linuxkm/Kbuild @@ -0,0 +1,29 @@ +# libwolfssl Kbuild + +# wolfcrypto asm provokes many objtool complaints: +# "call without frame pointer save/setup", +# "BP used as a scratch register", +# "indirect jump found in RETPOLINE build", +# and "is missing an ELF size annotation" +# see /usr/src/linux/tools/objtool/Documentation/stack-validation.txt +OBJECT_FILES_NON_STANDARD := y + +obj-m := libwolfssl.o + +ifeq "$(WOLFSSL_OBJ_FILES)" "" +$(error $$WOLFSSL_OBJ_FILES is unset.) +endif + +ifeq "$(WOLFSSL_CFLAGS)" "" +$(error $$WOLFSSL_CFLAGS is unset.) +endif + +ifeq "$(WOLFSSL_ASFLAGS)" "" +$(error $$WOLFSSL_ASFLAGS is unset.) +endif + +libwolfssl-y := $(WOLFSSL_OBJ_FILES) + +ccflags-y := $(WOLFSSL_CFLAGS) + +asflags-y := $(WOLFSSL_ASFLAGS) diff --git a/linuxkm/Makefile b/linuxkm/Makefile new file mode 100644 index 000000000..b3c77f106 --- /dev/null +++ b/linuxkm/Makefile @@ -0,0 +1,38 @@ +all: libwolfssl.ko + +.PHONY: libwolfssl.ko + +ifndef MODULE_TOP +MODULE_TOP=$(CURDIR) +endif + +ifndef SRC_TOP +SRC_TOP=$(shell dirname $(MODULE_TOP)) +endif + +ifeq "$(KROOT)" "" +$(error $$KROOT is unset.) +endif + +ifeq "$(AM_CFLAGS)$(CFLAGS)" "" +$(error $$AM_CFLAGS and $$CFLAGS are both unset.) +endif + +ifeq "$(AM_CCASFLAGS)$(CCASFLAGS)" "" +$(error $$AM_CCASFLAGS and $$CCASFLAGS are both unset.) +endif + +ifeq "$(src_libwolfssl_la_OBJECTS)" "" +$(error $$src_libwolfssl_la_OBJECTS is unset.) +endif + +WOLFSSL_CFLAGS=-DHAVE_CONFIG_H -I$(SRC_TOP) -DBUILDING_WOLFSSL $(AM_CFLAGS) $(CFLAGS) -Wframe-larger-than=262144 +WOLFSSL_ASFLAGS=-DHAVE_CONFIG_H -I$(SRC_TOP) -DBUILDING_WOLFSSL $(AM_CCASFLAGS) $(CCASFLAGS) +WOLFSSL_OBJ_FILES=linuxkm/module_hooks.o $(patsubst %.lo, %.o, $(patsubst src/libwolfssl_la-%, src/%, $(patsubst wolfcrypt/src/src_libwolfssl_la-%, wolfcrypt/src/%, $(src_libwolfssl_la_OBJECTS)))) + +export WOLFSSL_CFLAGS WOLFSSL_ASFLAGS WOLFSSL_OBJ_FILES + +libwolfssl.ko: + @mkdir -p linuxkm src wolfcrypt/src + @if [[ ! -h $(SRC_TOP)/Kbuild ]]; then ln -s $(MODULE_TOP)/Kbuild $(SRC_TOP)/Kbuild; fi + make -C $(KROOT) M=$(MODULE_TOP) src=$(SRC_TOP) diff --git a/linuxkm/Makefile.am b/linuxkm/Makefile.am deleted file mode 100644 index ba09ba50e..000000000 --- a/linuxkm/Makefile.am +++ /dev/null @@ -1,5 +0,0 @@ -EXTRA_PROGRAMS = automake_dummy -automake_dummy_SOURCES = wolfssl_linuxkm.c -module_DATA = wolfssl_linuxkm.o -#include ../Makefile.common -include Makefile.common diff --git a/linuxkm/Makefile.common b/linuxkm/Makefile.common deleted file mode 100644 index faaa14f2d..000000000 --- a/linuxkm/Makefile.common +++ /dev/null @@ -1,20 +0,0 @@ -# Makefile.common -moduledir = @moduledir@ -KERNEL_LOCATION=@kerneldir@ -KBUILD_VERBOSE = 1 -MOD_DEVDIR = $(PWD) - -export module_DATA - -$(module_DATA): $(automake_dummy_SOURCES) - echo "not building kernel module yet" - -# mv Makefile Makefile.automake -# cp $(srcdir)/../Makefile.kernel Makefile -# CPPFLAGS="" CFLAGS="" LDFLAGS="" \ -# $(MAKE) -C $(KROOT) \ -# ARCH="$KARCH" CC="gcc" M=$(PWD) modules\ -# KBUILD_VERBOSE=$(KBUILD_VERBOSE) -# mv Makefile.automake Makefile - -CLEANFILES = $(module_DATA) .$(module_DATA).flags $(module_DATA:.o=.mod.c) $(module_DATA:.o=.@kernelext@) *~ diff --git a/linuxkm/module_hooks.c b/linuxkm/module_hooks.c new file mode 100644 index 000000000..1a25bad04 --- /dev/null +++ b/linuxkm/module_hooks.c @@ -0,0 +1,43 @@ +/* http://h-wrt.com/en/mini-how-to/autotoolsSimpleModule */ + +/* src/module_hello.c */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +static int __init wolfssl_init(void) +{ + int ret = wolfSSL_Init(); + if (ret != WOLFSSL_SUCCESS) { + pr_err("wolfSSL_Init() failed: %s", wc_GetErrorString(ret)); + return -ENOTRECOVERABLE; + } + + pr_info("wolfSSL " LIBWOLFSSL_VERSION_STRING " loaded. See https://www.wolfssl.com/ for information.\n"); + pr_info("Copyright (C) 2006-2020 wolfSSL Inc. All Rights Reserved.\n"); + + return 0; +} + +module_init(wolfssl_init); + +static void __exit wolfssl_exit(void) +{ + int ret = wolfSSL_Cleanup(); + if (ret != WOLFSSL_SUCCESS) + pr_err("wolfSSL_Cleanup() failed: %s", wc_GetErrorString(ret)); + + return; +} + +module_exit(wolfssl_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("https://www.wolfssl.com/"); +MODULE_DESCRIPTION("libwolfssl cryptographic and protocol facilities"); +MODULE_VERSION(LIBWOLFSSL_VERSION_STRING); diff --git a/linuxkm/wolfssl_linuxkm.c b/linuxkm/wolfssl_linuxkm.c deleted file mode 100644 index 0dee82a59..000000000 --- a/linuxkm/wolfssl_linuxkm.c +++ /dev/null @@ -1,28 +0,0 @@ -/* http://h-wrt.com/en/mini-how-to/autotoolsSimpleModule */ - -/* src/module_hello.c */ - -#include -#include - -static int __init -hello_init(void) -{ - printk("Hello, world!\n"); - return 0; -} - -module_init(hello_init); - -static void __exit -hello_exit(void) -{ - printk("Goodbye, world!\n"); -} - -module_exit(hello_exit); - -MODULE_LICENSE("GPL"); -MODULE_AUTHOR("noname "); -MODULE_DESCRIPTION("\"Hello, world!\" test module"); -MODULE_VERSION("printk"); diff --git a/m4/ax_linuxkm.m4 b/m4/ax_linuxkm.m4 index 081b0389b..88aea5bb4 100644 --- a/m4/ax_linuxkm.m4 +++ b/m4/ax_linuxkm.m4 @@ -28,14 +28,15 @@ else fi ]) -AC_DEFUN([AC_DEFINE_KERNEL_KFLAGS], -[ - AC_MSG_CHECKING([flags for compiling objects for kernel module]) - if test -z "${KROOT}" || test -z "${KARCH}"; then - AC_MSG_ERROR([Linux kernel configuration incomplete (KROOT=${KROOT}, KARCH=${KARCH}).]) - else - GCC_SHORT_VERSION="$($CC -dumpversion)" - KFLAGS="-I${KROOT}/include -I${KROOT}/include/uapi -I${KROOT}/arch/${KARCH}/include -I${KROOT}/arch/${KARCH}/include/generated -I${KROOT}/arch/${KARCH}/include/generated/uapi -I${KROOT}/arch/${KARCH}/include/uapi -I${KROOT}/tools/include -I${KROOT}/tools/arch/${KARCH}/include -I${KROOT}/tools/include/uapi -I/usr/lib/gcc/${host_cpu}-${host_vendor}-${host_os}/${GCC_SHORT_VERSION}/include" - AC_MSG_RESULT([$KFLAGS]) - fi -]) +dnl AC_DEFUN([AC_DEFINE_KERNEL_KFLAGS], +dnl [ +dnl AC_MSG_CHECKING([flags for compiling objects for kernel module]) +dnl if test -z "${KROOT}" || test -z "${KARCH}"; then +dnl AC_MSG_ERROR([Linux kernel configuration incomplete (KROOT=${KROOT}, KARCH=${KARCH}).]) +dnl else +dnl GCC_SHORT_VERSION="$($CC -dumpversion)" +dnl KFLAGS="-I${KROOT}/include -I${KROOT}/include/uapi -I${KROOT}/arch/${KARCH}/include -I${KROOT}/arch/${KARCH}/include/generated -I${KROOT}/arch/${KARCH}/include/generated/uapi -I${KROOT}/arch/${KARCH}/include/uapi -I${KROOT}/tools/include -I${KROOT}/tools/arch/${KARCH}/include -I${KROOT}/tools/include/uapi -I/usr/lib/gcc/${host_cpu}-${host_vendor}-${host_os}/${GCC_SHORT_VERSION}/include" +dnl AC_MSG_RESULT([$KFLAGS]) +dnl fi +dnl ]) +dnl