aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZachary Leaf <zachary.leaf@arm.com>2023-08-31 13:11:53 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2023-12-29 21:49:42 +0000
commitf7e5bdbc683acb6c3cfb9a2ae95716e75478e776 (patch)
tree95b7dda839d813dbe2cdebb03419ea4818f1a6bc
parent7945b99a003fec545140532662412696e93f1ae1 (diff)
downloadsrc-f7e5bdbc683acb6c3cfb9a2ae95716e75478e776.tar.gz
src-f7e5bdbc683acb6c3cfb9a2ae95716e75478e776.zip
armv8_crypto: fix recursive fpu_kern_enter call
Now armv8_crypto is using FPU_KERN_NOCTX, this results in a kernel panic in armv8_crypto.c:armv8_crypto_cipher_setup: panic: recursive fpu_kern_enter while in PCB_FP_NOSAVE state This is because in armv8_crypto.c:armv8_crypto_cipher_process, directly after calling fpu_kern_enter() a call is made to armv8_crypto_cipher_setup(), resulting in nested calls to fpu_kern_enter() without the required fpu_kern_leave() in between. Move fpu_kern_enter() in armv8_crypto_cipher_process() after the call to armv8_crypto_cipher_setup() to resolve this. Reviewed by: markj, andrew Fixes: 6485286f536f ("armv8_crypto: Switch to using FPU_KERN_NOCTX") Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D41671 (cherry picked from commit 565c887a775284bfb1a15eadee2c3f312d288c01)
-rw-r--r--sys/crypto/armv8/armv8_crypto.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/sys/crypto/armv8/armv8_crypto.c b/sys/crypto/armv8/armv8_crypto.c
index fd1d845c29b0..fcbc7e77de29 100644
--- a/sys/crypto/armv8/armv8_crypto.c
+++ b/sys/crypto/armv8/armv8_crypto.c
@@ -336,8 +336,6 @@ armv8_crypto_cipher_process(struct armv8_crypto_session *ses,
crypto_cursor_copy(&fromc, &toc);
}
- fpu_kern_enter(curthread, NULL, FPU_KERN_NORMAL | FPU_KERN_NOCTX);
-
if (crp->crp_cipher_key != NULL) {
armv8_crypto_cipher_setup(ses, csp, crp->crp_cipher_key,
csp->csp_cipher_klen);
@@ -345,6 +343,8 @@ armv8_crypto_cipher_process(struct armv8_crypto_session *ses,
crypto_read_iv(crp, iv);
+ fpu_kern_enter(curthread, NULL, FPU_KERN_NORMAL | FPU_KERN_NOCTX);
+
error = 0;
switch (csp->csp_cipher_alg) {
case CRYPTO_AES_CBC: