diff options
author | Zachary Leaf <zachary.leaf@arm.com> | 2023-08-31 13:11:53 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2023-12-29 21:49:42 +0000 |
commit | f7e5bdbc683acb6c3cfb9a2ae95716e75478e776 (patch) | |
tree | 95b7dda839d813dbe2cdebb03419ea4818f1a6bc | |
parent | 7945b99a003fec545140532662412696e93f1ae1 (diff) | |
download | src-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.c | 4 |
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: |