Skip to content

Commit 9a6a336

Browse files
committed
bsdkm: x86 crypto acceleration support.
1 parent 4574a0c commit 9a6a336

File tree

13 files changed

+1564
-58
lines changed

13 files changed

+1564
-58
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,17 @@ linuxkm/linuxkm
239239
linuxkm/src
240240
linuxkm/patches/src
241241
*.nds
242+
243+
# Generated during FreeBSD kernel module build.
242244
bsdkm/export_syms
243245
bsdkm/i386
244246
bsdkm/libwolfssl.ko
245247
bsdkm/machine
246248
bsdkm/opt_global.h
247249
bsdkm/x86
250+
bsdkm/bus_if.h
251+
bsdkm/cryptodev_if.h
252+
bsdkm/device_if.h
248253

249254
# autotools generated
250255
scripts/unit.test

Makefile.am

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,9 @@ if BUILD_BSDKM
247247
EXTRA_CFLAGS EXTRA_CPPFLAGS EXTRA_CCASFLAGS EXTRA_LDFLAGS \
248248
AM_CPPFLAGS CPPFLAGS AM_CFLAGS CFLAGS \
249249
AM_CCASFLAGS CCASFLAGS \
250-
src_libwolfssl_la_OBJECTS ENABLED_CRYPT_TESTS
251-
250+
src_libwolfssl_la_OBJECTS ENABLED_CRYPT_TESTS ENABLED_BSDKM_REGISTER \
251+
ENABLED_ASM ENABLED_AESNI \
252+
ENABLED_KERNEL_BENCHMARKS
252253
endif
253254

254255

bsdkm/Makefile

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,52 @@
11
# wolfssl kernel module name and source, and root dir.
2-
KMOD=libwolfssl
3-
SRCS=wolfkmod.c
4-
WOLFSSL_DIR=../
2+
KMOD = libwolfssl
3+
SRCS = wolfkmod.c
4+
WOLFSSL_DIR = ../
55

66
CFLAGS+=-I${WOLFSSL_DIR}
77
CFLAGS+=-DWOLFSSL_IGNORE_FILE_WARN -DHAVE_CONFIG_H -DNO_MAIN_DRIVER
8+
89
#
910
# debug options
1011
# verbose printing:
11-
# CFLAGS+=-DWOLFSSL_BSDKM_VERBOSE_DEBUG
12+
# CFLAGS += -DWOLFSSL_BSDKM_VERBOSE_DEBUG
1213
#
1314
# print memory mallocs / frees:
14-
# CFLAGS+=-DWOLFSSL_BSDKM_MEMORY_DEBUG
15+
# CFLAGS += -DWOLFSSL_BSDKM_MEMORY_DEBUG
1516
#
16-
CFLAGS+=$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
17+
CFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
18+
19+
.if defined(ENABLED_BSDKM_REGISTER)
20+
# These device header files are generated during build.
21+
SRCS += bus_if.h cryptodev_if.h device_if.h
22+
.endif
1723

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

30+
# wolfcrypt test
2431
.if ${ENABLED_CRYPT_TESTS} == "yes"
2532
WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/test/test.o
2633
.else
27-
CFLAGS+=-DNO_CRYPT_TEST
34+
CFLAGS += -DNO_CRYPT_TEST
35+
.endif
36+
37+
# wolfcrypt benchmark
38+
.if ${ENABLED_KERNEL_BENCHMARKS} == "yes"
39+
WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/benchmark/benchmark.o
40+
CFLAGS+=-DWOLFSSL_NO_FLOAT_FMT
2841
.endif
2942

3043
OBJS += ${WOLFSSL_OBJS}
3144

3245
# Export no public symbols by default.
3346
.if !defined(BSDKM_EXPORT_SYMS)
34-
EXPORT_SYMS=NO
47+
EXPORT_SYMS = NO
3548
.else
36-
EXPORT_SYMS=${BSDKM_EXPORT_SYMS}
49+
EXPORT_SYMS = ${BSDKM_EXPORT_SYMS}
3750
.endif
3851

3952
# Default to live kernel src tree makefile at
@@ -45,12 +58,37 @@ OBJS += ${WOLFSSL_OBJS}
4558
.endif
4659
.include "${SYSDIR}/conf/kmod.mk"
4760

61+
# To use aesni in FreeBSD kernel we need to adjust build flags.
62+
# See these for reference:
63+
# - /usr/src/sys/modules/aesni/Makefile
64+
# - /usr/src/sys/conf/kern.mk
65+
.if ${ENABLED_ASM} == "yes"
66+
CFLAGS.aes.c += -msse -msse2 -msse4.1 -maes -mpclmul -mavx -mavx2
67+
CFLAGS.aes.c := ${CFLAGS.aes.c:N-nostdinc}
68+
CFLAGS.aes.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
69+
70+
CFLAGS.poly1305.c += -msse -msse2 -msse4.1 -maes -mpclmul
71+
CFLAGS.poly1305.c := ${CFLAGS.aes.c:N-nostdinc}
72+
CFLAGS.poly1305.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
73+
74+
CFLAGS.chacha.c += -msse -msse2 -msse4.1 -maes -mpclmul
75+
CFLAGS.chacha.c := ${CFLAGS.aes.c:N-nostdinc}
76+
CFLAGS.chacha.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
77+
78+
CFLAGS.sha.c += -msse -msse2 -msse4.1 -maes -mpclmul -mavx -mavx2
79+
CFLAGS.sha256.c += -msse -msse2 -msse4.1 -maes -mpclmul -mavx -mavx2
80+
CFLAGS.benchmark.c += -msse -msse2 -msse4.1 -maes -mpclmul -mavx -mavx2
81+
CFLAGS.benchmark.c := ${CFLAGS.aes.c:N-nostdinc}
82+
CFLAGS.benchmark.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
83+
.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
84+
.endif
85+
4886
# Smooth out a few inconsistencies between FreeBSD default compiler flags
4987
# in /usr/src/sys/conf/kern.mk, vs wolfssl harden flags in
5088
# m4/ax_harden_compiler_flags.m4. E.g. some FreeBSD header files shorten
5189
# 64 to 32 bit, and some wolfcrypt functions cast away const.
52-
CFLAGS+= -Wno-unused-function
53-
CFLAGS+= -Wno-cast-qual
54-
CFLAGS+= -Wno-error=cast-qual
55-
CFLAGS+= -Wno-shorten-64-to-32
56-
CFLAGS+= -DLIBWOLFSSL_GLOBAL_EXTRA_CFLAGS="\" $(KERNEL_EXTRA_CFLAGS)\""
90+
CFLAGS += -Wno-unused-function
91+
CFLAGS += -Wno-cast-qual
92+
CFLAGS += -Wno-error=cast-qual
93+
CFLAGS += -Wno-shorten-64-to-32
94+
CFLAGS += -DLIBWOLFSSL_GLOBAL_EXTRA_CFLAGS="\" $(KERNEL_EXTRA_CFLAGS)\""

bsdkm/bsdkm_wc_port.h

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ static inline time_t wolfkmod_time(time_t * tloc) {
6161
#define WOLFSSL_DEBUG_PRINTF_FN printf
6262

6363
/* str and char utility functions */
64-
#define XATOI(s) ({ \
65-
char * endptr = NULL; \
66-
long _xatoi_ret = strtol(s, &endptr, 10); \
67-
if ((s) == endptr || *endptr != '\0') { \
68-
_xatoi_ret = 0; \
69-
} \
70-
(int)_xatoi_ret; \
64+
#define XATOI(s) ({ \
65+
char * endptr = NULL; \
66+
long _xatoi_ret = strtol(s, &endptr, 10); \
67+
if ((s) == endptr || *endptr != '\0') { \
68+
_xatoi_ret = 0; \
69+
} \
70+
(int)_xatoi_ret; \
7171
})
7272

7373
#if !defined(XMALLOC_OVERRIDE)
@@ -103,6 +103,34 @@ extern struct malloc_type M_WOLFSSL[1];
103103
})
104104
#endif /* WOLFSSL_BSDKM_DEBUG_MEMORY */
105105

106+
107+
#if defined(WOLFSSL_AESNI) || defined(WOLFSSL_KERNEL_BENCHMARKS)
108+
int wolfkmod_vecreg_init(void);
109+
void wolfkmod_vecreg_exit(void);
110+
int wolfkmod_vecreg_save(int flags_unused);
111+
void wolfkmod_vecreg_restore(void);
112+
/* wrapper defines for FPU_KERN(9).
113+
* /usr/src/sys/amd64/amd64/fpu.c
114+
* /usr/src/sys/amd64/include/pcb.h
115+
* */
116+
#ifndef WOLFSSL_USE_SAVE_VECTOR_REGISTERS
117+
#define WOLFSSL_USE_SAVE_VECTOR_REGISTERS
118+
#endif
119+
120+
121+
#define SAVE_VECTOR_REGISTERS(fail_clause) { \
122+
int _svr_ret = wolfkmod_vecreg_save(0); \
123+
if (_svr_ret != 0) { \
124+
fail_clause \
125+
} \
126+
}
127+
128+
#define SAVE_VECTOR_REGISTERS2() wolfkmod_vecreg_save(0)
129+
130+
#define RESTORE_VECTOR_REGISTERS() wolfkmod_vecreg_restore()
131+
132+
#endif /* WOLFSSL_AESNI || WOLFSSL_KERNEL_BENCHMARKS */
133+
106134
#if !defined(SINGLE_THREADED)
107135
#define WC_MUTEX_OPS_INLINE
108136

@@ -149,7 +177,8 @@ extern struct malloc_type M_WOLFSSL[1];
149177
typedef volatile int wolfSSL_Atomic_Int;
150178
typedef volatile unsigned int wolfSSL_Atomic_Uint;
151179
#define WOLFSSL_ATOMIC_INITIALIZER(x) (x)
152-
#define WOLFSSL_ATOMIC_LOAD(x) (int)atomic_load_acq_int(&(x))
180+
#define WOLFSSL_ATOMIC_LOAD(x) (int)atomic_load_acq_int(&(x))
181+
#define WOLFSSL_ATOMIC_LOAD_UINT(x) atomic_load_acq_int(&(x))
153182
#define WOLFSSL_ATOMIC_STORE(x, v) atomic_store_rel_int(&(x), (v))
154183
#define WOLFSSL_ATOMIC_OPS
155184

bsdkm/include.am

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
# included from Top Level Makefile.am
33
# All paths should be given relative to the root
44

5-
EXTRA_DIST += m4/ax_bsdkm.m4 \
6-
bsdkm/Makefile \
7-
bsdkm/README.md \
8-
bsdkm/wolfkmod.c \
5+
EXTRA_DIST += m4/ax_bsdkm.m4 \
6+
bsdkm/Makefile \
7+
bsdkm/README.md \
8+
bsdkm/wolfkmod.c \
9+
bsdkm/wolfkmod_aes.c \
10+
bsdkm/x86_vecreg.c \
911
bsdkm/bsdkm_wc_port.h

0 commit comments

Comments
 (0)