# wolfssl kernel module name and main source, and wolfssl root dir.
KMOD        = libwolfssl
SRCS        = wolfkmod.c
WOLFSSL_DIR = ../

CFLAGS += -I${WOLFSSL_DIR}
CFLAGS += -DWOLFSSL_IGNORE_FILE_WARN -DHAVE_CONFIG_H -DNO_MAIN_DRIVER
#
# debug options
#   verbose printing:
#   CFLAGS += -DWOLFSSL_BSDKM_VERBOSE_DEBUG
#
#   print memory mallocs / frees:
#   CFLAGS += -DWOLFSSL_BSDKM_MEMORY_DEBUG
#
#   print fpu_kern_enter / leave:
#   CFLAGS += WOLFSSL_BSDKM_FPU_DEBUG
#
CFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)

.if defined(ENABLED_BSDKM_REGISTER)
  # These device header files are generated during build.
  SRCS += bus_if.h cryptodev_if.h device_if.h
.endif

# FreeBSD make does not support GNU make's patsubst and related. Filter
# through sed instead.
WOLFSSL_OBJS != echo ${src_libwolfssl_la_OBJECTS} | \
  sed 's|src_libwolfssl_la-||g' | sed 's|\.lo|.o|g' | \
  sed 's|wolfcrypt/src/|${WOLFSSL_DIR}/wolfcrypt/src/|g'

# wolfcrypt test
.if ${ENABLED_CRYPT_TESTS} == "yes"
    WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/test/test.o
.else
    CFLAGS += -DNO_CRYPT_TEST
.endif

# wolfcrypt benchmark
.if ${ENABLED_KERNEL_BENCHMARKS} == "yes"
    WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/benchmark/benchmark.o
    CFLAGS.benchmark.c += -DWOLFSSL_NO_FLOAT_FMT -DMAIN_NO_ARGS
.endif

OBJS += ${WOLFSSL_OBJS}

# Export no public symbols by default.
.if !defined(BSDKM_EXPORT_SYMS)
    EXPORT_SYMS = NO
.else
    EXPORT_SYMS = ${BSDKM_EXPORT_SYMS}
.endif

# Default to live kernel src tree makefile at
# /usr/src/sys/conf/kmod.mk
.if !defined(KERNEL_ROOT)
    SYSDIR?= /usr/src/sys
.else
    SYSDIR?= ${KERNEL_ROOT}
.endif
.include "${SYSDIR}/conf/kmod.mk"

#
# To use aesni and friends in FreeBSD kernel we need to adjust build flags.
# See these kernel makefiles for reference:
#   - /usr/src/sys/modules/aesni/Makefile
#   - /usr/src/sys/conf/kern.mk
#
WOLFKMOD_SIMD_BASE = -msse -msse2 -msse4.1
WOLFKMOD_SIMD_AES  = -maes -mpclmul
WOLFKMOD_SIMD_AVX  = -mavx -mavx2

.if ${ENABLED_AESNI} == "yes"
  CFLAGS.aes.c += ${WOLFKMOD_SIMD_BASE}
  CFLAGS.aes.c += ${WOLFKMOD_SIMD_AES}
.if ${ENABLED_AESNI_WITH_AVX} == "yes"
  CFLAGS.aes.c += ${WOLFKMOD_SIMD_AVX}
.endif # ENABLED_AESNI_WITH_AVX #
  CFLAGS.aes.c := ${CFLAGS.aes.c:N-nostdinc}
  CFLAGS.aes.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
.endif # ENABLED_AESNI

.if ${ENABLED_ASM} == "yes"
.for f in chacha dilithium poly1305 sha sha256 sha3 sha512
  CFLAGS.${f}.c += ${WOLFKMOD_SIMD_BASE}
  CFLAGS.${f}.c += ${WOLFKMOD_SIMD_AVX}
  CFLAGS.${f}.c := ${CFLAGS.${f}.c:N-nostdinc}
  CFLAGS.${f}.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
.endfor

.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
.endif # ENABLED_ASM == "yes"

# wolfcrypt benchmark always needs simd for the floating point timings.
.if ${ENABLED_KERNEL_BENCHMARKS} == "yes"
  CFLAGS.benchmark.c += ${WOLFKMOD_SIMD_BASE}
  CFLAGS.benchmark.c := ${CFLAGS.benchmark.c:N-nostdinc}
  CFLAGS.benchmark.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
  .PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
.endif

# Smooth out a few inconsistencies between FreeBSD default compiler flags
# in /usr/src/sys/conf/kern.mk, vs wolfssl harden flags in
# m4/ax_harden_compiler_flags.m4. E.g. some FreeBSD header files shorten
# 64 to 32 bit, and some wolfcrypt functions cast away const.
CFLAGS += -Wno-unused-function
CFLAGS += -Wno-cast-qual
CFLAGS += -Wno-error=cast-qual
CFLAGS += -Wno-shorten-64-to-32
CFLAGS += -DLIBWOLFSSL_GLOBAL_EXTRA_CFLAGS="\" $(KERNEL_EXTRA_CFLAGS)\""
