Skip to content

Commit 8ae27c7

Browse files
committed
bsdkm: x86 crypto acceleration support.
1 parent c807903 commit 8ae27c7

File tree

14 files changed

+1539
-66
lines changed

14 files changed

+1539
-66
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

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ BLAKE2B_SELFTEST
3636
BLAKE2S_SELFTEST
3737
BLOCKING
3838
BSDKM_EXPORT_SYMS
39+
ENABLED_BSDKM_REGISTER
3940
BSP_DEFAULT_IO_CHANNEL_DEFINED
4041
BSP_LED_0
4142
BSP_LED_1

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_INTELASM ENABLED_AESNI ENABLED_AESNI_WITH_AVX \
252+
ENABLED_KERNEL_BENCHMARKS
252253
endif
253254

254255

bsdkm/Makefile

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

6-
CFLAGS+=-I${WOLFSSL_DIR}
7-
CFLAGS+=-DWOLFSSL_IGNORE_FILE_WARN -DHAVE_CONFIG_H -DNO_MAIN_DRIVER
6+
CFLAGS += -I${WOLFSSL_DIR}
7+
CFLAGS += -DWOLFSSL_IGNORE_FILE_WARN -DHAVE_CONFIG_H -DNO_MAIN_DRIVER
88
#
99
# debug options
1010
# verbose printing:
11-
# CFLAGS+=-DWOLFSSL_BSDKM_VERBOSE_DEBUG
11+
# CFLAGS += -DWOLFSSL_BSDKM_VERBOSE_DEBUG
1212
#
1313
# print memory mallocs / frees:
14-
# CFLAGS+=-DWOLFSSL_BSDKM_MEMORY_DEBUG
14+
# CFLAGS += -DWOLFSSL_BSDKM_MEMORY_DEBUG
1515
#
16-
CFLAGS+=$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
16+
# print fpu_kern_enter / leave:
17+
# CFLAGS += WOLFSSL_BSDKM_FPU_DEBUG
18+
#
19+
CFLAGS += $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS)
20+
21+
.if defined(ENABLED_BSDKM_REGISTER)
22+
# These device header files are generated during build.
23+
SRCS += bus_if.h cryptodev_if.h device_if.h
24+
.endif
1725

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

32+
# wolfcrypt test
2433
.if ${ENABLED_CRYPT_TESTS} == "yes"
2534
WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/test/test.o
2635
.else
27-
CFLAGS+=-DNO_CRYPT_TEST
36+
CFLAGS += -DNO_CRYPT_TEST
37+
.endif
38+
39+
# wolfcrypt benchmark
40+
.if ${ENABLED_KERNEL_BENCHMARKS} == "yes"
41+
WOLFSSL_OBJS += ${WOLFSSL_DIR}/wolfcrypt/benchmark/benchmark.o
42+
CFLAGS += -DWOLFSSL_NO_FLOAT_FMT
2843
.endif
2944

3045
OBJS += ${WOLFSSL_OBJS}
3146

3247
# Export no public symbols by default.
3348
.if !defined(BSDKM_EXPORT_SYMS)
34-
EXPORT_SYMS=NO
49+
EXPORT_SYMS = NO
3550
.else
36-
EXPORT_SYMS=${BSDKM_EXPORT_SYMS}
51+
EXPORT_SYMS = ${BSDKM_EXPORT_SYMS}
3752
.endif
3853

3954
# Default to live kernel src tree makefile at
@@ -45,12 +60,52 @@ OBJS += ${WOLFSSL_OBJS}
4560
.endif
4661
.include "${SYSDIR}/conf/kmod.mk"
4762

63+
#
64+
# To use aesni and friends in FreeBSD kernel we need to adjust build flags.
65+
# See these kernel makefiles for reference:
66+
# - /usr/src/sys/modules/aesni/Makefile
67+
# - /usr/src/sys/conf/kern.mk
68+
#
69+
WOLFKMOD_SIMD_BASE = -msse -msse2 -msse4.1
70+
WOLFKMOD_SIMD_AES = -maes -mpclmul
71+
WOLFKMOD_SIMD_AVX = -mavx -mavx2
72+
73+
.if ${ENABLED_AESNI} == "yes"
74+
CFLAGS.aes.c += ${WOLFKMOD_SIMD_BASE}
75+
CFLAGS.aes.c += ${WOLFKMOD_SIMD_AES}
76+
.if ${ENABLED_AESNI_WITH_AVX} == "yes"
77+
CFLAGS.aes.c += ${WOLFKMOD_SIMD_AVX}
78+
.endif # ENABLED_AESNI_WITH_AVX #
79+
CFLAGS.aes.c := ${CFLAGS.aes.c:N-nostdinc}
80+
CFLAGS.aes.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
81+
.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
82+
.endif # ENABLED_AESNI
83+
84+
.if ${ENABLED_ASM} == "yes"
85+
.for f in chacha dilithium poly1305 sha sha256 sha3 sha512
86+
CFLAGS.${f}.c += ${WOLFKMOD_SIMD_BASE}
87+
CFLAGS.${f}.c += ${WOLFKMOD_SIMD_AVX}
88+
CFLAGS.${f}.c := ${CFLAGS.${f}.c:N-nostdinc}
89+
CFLAGS.${f}.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
90+
.endfor
91+
92+
.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
93+
.endif # ENABLED_ASM == "yes"
94+
95+
# wolfcrypt benchmark always needs simd for the floating point timings.
96+
.if ${ENABLED_KERNEL_BENCHMARKS} == "yes"
97+
CFLAGS.benchmark.c += ${WOLFKMOD_SIMD_BASE}
98+
CFLAGS.benchmark.c := ${CFLAGS.benchmark.c:N-nostdinc}
99+
CFLAGS.benchmark.c += -I${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
100+
.PATH: ${SYSDIR}/../contrib/llvm-project/clang/lib/Headers
101+
.endif
102+
48103
# Smooth out a few inconsistencies between FreeBSD default compiler flags
49104
# in /usr/src/sys/conf/kern.mk, vs wolfssl harden flags in
50105
# m4/ax_harden_compiler_flags.m4. E.g. some FreeBSD header files shorten
51106
# 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)\""
107+
CFLAGS += -Wno-unused-function
108+
CFLAGS += -Wno-cast-qual
109+
CFLAGS += -Wno-error=cast-qual
110+
CFLAGS += -Wno-shorten-64-to-32
111+
CFLAGS += -DLIBWOLFSSL_GLOBAL_EXTRA_CFLAGS="\" $(KERNEL_EXTRA_CFLAGS)\""

bsdkm/README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ other loadable modules to link to wolfCrypt.
77
Supported features:
88
- wolfCrypt in kernel.
99
- FIPS-wolfcrypt.
10+
- crypto acceleration: AES-NI, AVX, etc.
1011

1112
Planned features:
12-
- crypto acceleration: AES-NI, AVX, etc.
13-
- kernel opencrypto driver registration.
13+
- kernel opencrypto driver registration (supported for internal testing presently).
1414
- full wolfSSL in kernel (kernel TLS).
1515

1616
## Building and Installing
@@ -44,10 +44,12 @@ sudo kldunload libwolfssl
4444

4545
### options
4646

47-
| freebsdkm option | description |
48-
| :------------------------------- | :--------------------------------------- |
49-
| --with-bsd-export-syms=LIST | Export list of symbols as global. <br>. Options are 'all', 'none', or <br> comma separated list of symbols. |
50-
| --with-kernel-source=PATH | Path to kernel tree root (default `/usr/src/sys`) |
47+
| freebsdkm option | description |
48+
| :--------------------------------- | :--------------------------------------- |
49+
| --with-bsd-export-syms=LIST | Export list of symbols as global. <br>. Options are 'all', 'none', or <br> comma separated list of symbols. |
50+
| --with-kernel-source=PATH | Path to kernel tree root (default `/usr/src/sys`) |
51+
| --enable-kernel-benchmarks | Run wolfcrypt benchmark at module load |
52+
| --enable-freebsdkm-crypto-register | Register with the FreeBSD kernel opencrypto <br>framework (preliminary, for testing) |
5153

5254
### FIPS
5355

bsdkm/bsdkm_wc_port.h

Lines changed: 36 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,33 @@ 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+
#define SAVE_VECTOR_REGISTERS(fail_clause) { \
121+
int _svr_ret = wolfkmod_vecreg_save(0); \
122+
if (_svr_ret != 0) { \
123+
fail_clause \
124+
} \
125+
}
126+
127+
#define SAVE_VECTOR_REGISTERS2() wolfkmod_vecreg_save(0)
128+
129+
#define RESTORE_VECTOR_REGISTERS() wolfkmod_vecreg_restore()
130+
131+
#endif /* WOLFSSL_AESNI || WOLFSSL_KERNEL_BENCHMARKS */
132+
106133
#if !defined(SINGLE_THREADED)
107134
#define WC_MUTEX_OPS_INLINE
108135

@@ -149,7 +176,8 @@ extern struct malloc_type M_WOLFSSL[1];
149176
typedef volatile int wolfSSL_Atomic_Int;
150177
typedef volatile unsigned int wolfSSL_Atomic_Uint;
151178
#define WOLFSSL_ATOMIC_INITIALIZER(x) (x)
152-
#define WOLFSSL_ATOMIC_LOAD(x) (int)atomic_load_acq_int(&(x))
179+
#define WOLFSSL_ATOMIC_LOAD(x) (int)atomic_load_acq_int(&(x))
180+
#define WOLFSSL_ATOMIC_LOAD_UINT(x) atomic_load_acq_int(&(x))
153181
#define WOLFSSL_ATOMIC_STORE(x, v) atomic_store_rel_int(&(x), (v))
154182
#define WOLFSSL_ATOMIC_OPS
155183

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)