1919 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
2020 */
2121
22+ /* included by linuxkm/lkcapi_glue.c */
23+ #ifndef WC_SKIP_INCLUDED_C_FILES
24+
2225#ifndef LINUXKM_LKCAPI_REGISTER
2326 #error lkcapi_sha_glue.c included in non-LINUXKM_LKCAPI_REGISTER project.
2427#endif
374377 !defined(LINUXKM_LKCAPI_REGISTER_HASH_DRBG )
375378 #define LINUXKM_LKCAPI_REGISTER_HASH_DRBG
376379 #endif
377- #if (defined(LINUXKM_LKCAPI_REGISTER_ALL ) && !defined(LINUXKM_LKCAPI_DONT_REGISTER_HASH_DRBG_DEFAULT )) && \
378- !defined(LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT )
379- #define LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT
380- #endif
380+ /* setup for LINUXKM_LKCAPI_REGISTER_HASH_DRBG_DEFAULT is in linuxkm_wc_port.h */
381381#else
382382 #undef LINUXKM_LKCAPI_REGISTER_HASH_DRBG
383383#endif
@@ -968,7 +968,6 @@ struct wc_linuxkm_drbg_ctx {
968968 struct wc_rng_inst {
969969 wolfSSL_Atomic_Int lock ;
970970 WC_RNG rng ;
971- int disabled_vec_ops ;
972971 } * rngs ; /* one per CPU ID */
973972};
974973
@@ -1090,14 +1089,8 @@ static inline struct wc_rng_inst *get_drbg(struct crypto_rng *tfm) {
10901089
10911090 for (;;) {
10921091 int expected = 0 ;
1093- if (likely (__atomic_compare_exchange_n (& ctx -> rngs [n ].lock , & expected , new_lock_value , 0 , __ATOMIC_SEQ_CST , __ATOMIC_ACQUIRE ))) {
1094- struct wc_rng_inst * drbg = & ctx -> rngs [n ];
1095- if (tfm == crypto_default_rng )
1096- drbg -> disabled_vec_ops = (DISABLE_VECTOR_REGISTERS () == 0 );
1097- else
1098- drbg -> disabled_vec_ops = 0 ;
1099- return drbg ;
1100- }
1092+ if (likely (__atomic_compare_exchange_n (& ctx -> rngs [n ].lock , & expected , new_lock_value , 0 , __ATOMIC_SEQ_CST , __ATOMIC_ACQUIRE )))
1093+ return & ctx -> rngs [n ];
11011094 ++ n ;
11021095 if (n >= (int )ctx -> n_rngs )
11031096 n = 0 ;
@@ -1115,11 +1108,8 @@ static inline struct wc_rng_inst *get_drbg_n(struct wc_linuxkm_drbg_ctx *ctx, in
11151108
11161109 for (;;) {
11171110 int expected = 0 ;
1118- if (likely (__atomic_compare_exchange_n (& ctx -> rngs [n ].lock , & expected , 1 , 0 , __ATOMIC_SEQ_CST , __ATOMIC_ACQUIRE ))) {
1119- struct wc_rng_inst * drbg = & ctx -> rngs [n ];
1120- drbg -> disabled_vec_ops = 0 ;
1121- return drbg ;
1122- }
1111+ if (likely (__atomic_compare_exchange_n (& ctx -> rngs [n ].lock , & expected , 1 , 0 , __ATOMIC_SEQ_CST , __ATOMIC_ACQUIRE )))
1112+ return & ctx -> rngs [n ];
11231113 if (can_sleep ) {
11241114 if (signal_pending (current ))
11251115 return NULL ;
@@ -1137,10 +1127,6 @@ static inline void put_drbg(struct wc_rng_inst *drbg) {
11371127 (LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 7 , 0 ))
11381128 int migration_disabled = (drbg -> lock == 2 );
11391129 #endif
1140- if (drbg -> disabled_vec_ops ) {
1141- REENABLE_VECTOR_REGISTERS ();
1142- drbg -> disabled_vec_ops = 0 ;
1143- }
11441130 __atomic_store_n (& (drbg -> lock ),0 ,__ATOMIC_RELEASE );
11451131 #if defined(CONFIG_SMP ) && !defined(CONFIG_PREEMPT_COUNT ) && \
11461132 (LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 7 , 0 ))
@@ -1154,13 +1140,19 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
11541140 u8 * dst , unsigned int dlen )
11551141{
11561142 int ret , retried = 0 ;
1143+ int need_fpu_restore ;
11571144 struct wc_rng_inst * drbg = get_drbg (tfm );
11581145
11591146 if (! drbg ) {
11601147 pr_err_once ("BUG: get_drbg() failed." );
11611148 return - EFAULT ;
11621149 }
11631150
1151+ /* for the default RNG, make sure we don't cache an underlying SHA256
1152+ * method that uses vector insns (forbidden from irq handlers).
1153+ */
1154+ need_fpu_restore = (tfm == crypto_default_rng ) ? (DISABLE_VECTOR_REGISTERS () == 0 ) : 0 ;
1155+
11641156retry :
11651157
11661158 if (slen > 0 ) {
@@ -1194,6 +1186,8 @@ static int wc_linuxkm_drbg_generate(struct crypto_rng *tfm,
11941186
11951187out :
11961188
1189+ if (need_fpu_restore )
1190+ REENABLE_VECTOR_REGISTERS ();
11971191 put_drbg (drbg );
11981192
11991193 return ret ;
@@ -2054,3 +2048,5 @@ static int wc_linuxkm_drbg_cleanup(void) {
20542048}
20552049
20562050#endif /* LINUXKM_LKCAPI_REGISTER_HASH_DRBG */
2051+
2052+ #endif /* !WC_SKIP_INCLUDED_C_FILES */
0 commit comments