Skip to content

Commit 2d6f060

Browse files
Leonidas Da Silva Barbosaherbertx
authored andcommitted
crypto: vmx - Adding enable_kernel_vsx() to access VSX instructions
vmx-crypto driver make use of some VSX instructions which are only available if VSX is enabled. Running in cases where VSX are not enabled vmx-crypto fails in a VSX exception. In order to fix this enable_kernel_vsx() was added to turn on VSX instructions for vmx-crypto. Signed-off-by: Leonidas S. Barbosa <leosilva@linux.vnet.ibm.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 72cd7b4 commit 2d6f060

File tree

4 files changed

+13
-0
lines changed

4 files changed

+13
-0
lines changed

drivers/crypto/vmx/aes.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ static int p8_aes_setkey(struct crypto_tfm *tfm, const u8 *key,
8484
preempt_disable();
8585
pagefault_disable();
8686
enable_kernel_altivec();
87+
enable_kernel_vsx();
8788
ret = aes_p8_set_encrypt_key(key, keylen * 8, &ctx->enc_key);
8889
ret += aes_p8_set_decrypt_key(key, keylen * 8, &ctx->dec_key);
8990
pagefault_enable();
@@ -103,6 +104,7 @@ static void p8_aes_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
103104
preempt_disable();
104105
pagefault_disable();
105106
enable_kernel_altivec();
107+
enable_kernel_vsx();
106108
aes_p8_encrypt(src, dst, &ctx->enc_key);
107109
pagefault_enable();
108110
preempt_enable();
@@ -119,6 +121,7 @@ static void p8_aes_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
119121
preempt_disable();
120122
pagefault_disable();
121123
enable_kernel_altivec();
124+
enable_kernel_vsx();
122125
aes_p8_decrypt(src, dst, &ctx->dec_key);
123126
pagefault_enable();
124127
preempt_enable();

drivers/crypto/vmx/aes_cbc.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ static int p8_aes_cbc_setkey(struct crypto_tfm *tfm, const u8 *key,
8585
preempt_disable();
8686
pagefault_disable();
8787
enable_kernel_altivec();
88+
enable_kernel_vsx();
8889
ret = aes_p8_set_encrypt_key(key, keylen * 8, &ctx->enc_key);
8990
ret += aes_p8_set_decrypt_key(key, keylen * 8, &ctx->dec_key);
9091
pagefault_enable();
@@ -115,6 +116,7 @@ static int p8_aes_cbc_encrypt(struct blkcipher_desc *desc,
115116
preempt_disable();
116117
pagefault_disable();
117118
enable_kernel_altivec();
119+
enable_kernel_vsx();
118120

119121
blkcipher_walk_init(&walk, dst, src, nbytes);
120122
ret = blkcipher_walk_virt(desc, &walk);
@@ -155,6 +157,7 @@ static int p8_aes_cbc_decrypt(struct blkcipher_desc *desc,
155157
preempt_disable();
156158
pagefault_disable();
157159
enable_kernel_altivec();
160+
enable_kernel_vsx();
158161

159162
blkcipher_walk_init(&walk, dst, src, nbytes);
160163
ret = blkcipher_walk_virt(desc, &walk);

drivers/crypto/vmx/aes_ctr.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ static int p8_aes_ctr_setkey(struct crypto_tfm *tfm, const u8 *key,
8282

8383
pagefault_disable();
8484
enable_kernel_altivec();
85+
enable_kernel_vsx();
8586
ret = aes_p8_set_encrypt_key(key, keylen * 8, &ctx->enc_key);
8687
pagefault_enable();
8788

@@ -100,6 +101,7 @@ static void p8_aes_ctr_final(struct p8_aes_ctr_ctx *ctx,
100101

101102
pagefault_disable();
102103
enable_kernel_altivec();
104+
enable_kernel_vsx();
103105
aes_p8_encrypt(ctrblk, keystream, &ctx->enc_key);
104106
pagefault_enable();
105107

@@ -131,6 +133,7 @@ static int p8_aes_ctr_crypt(struct blkcipher_desc *desc,
131133
while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) {
132134
pagefault_disable();
133135
enable_kernel_altivec();
136+
enable_kernel_vsx();
134137
aes_p8_ctr32_encrypt_blocks(walk.src.virt.addr,
135138
walk.dst.virt.addr,
136139
(nbytes &

drivers/crypto/vmx/ghash.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ static int p8_ghash_setkey(struct crypto_shash *tfm, const u8 *key,
119119
preempt_disable();
120120
pagefault_disable();
121121
enable_kernel_altivec();
122+
enable_kernel_vsx();
122123
enable_kernel_fp();
123124
gcm_init_p8(ctx->htable, (const u64 *) key);
124125
pagefault_enable();
@@ -149,6 +150,7 @@ static int p8_ghash_update(struct shash_desc *desc,
149150
preempt_disable();
150151
pagefault_disable();
151152
enable_kernel_altivec();
153+
enable_kernel_vsx();
152154
enable_kernel_fp();
153155
gcm_ghash_p8(dctx->shash, ctx->htable,
154156
dctx->buffer, GHASH_DIGEST_SIZE);
@@ -163,6 +165,7 @@ static int p8_ghash_update(struct shash_desc *desc,
163165
preempt_disable();
164166
pagefault_disable();
165167
enable_kernel_altivec();
168+
enable_kernel_vsx();
166169
enable_kernel_fp();
167170
gcm_ghash_p8(dctx->shash, ctx->htable, src, len);
168171
pagefault_enable();
@@ -193,6 +196,7 @@ static int p8_ghash_final(struct shash_desc *desc, u8 *out)
193196
preempt_disable();
194197
pagefault_disable();
195198
enable_kernel_altivec();
199+
enable_kernel_vsx();
196200
enable_kernel_fp();
197201
gcm_ghash_p8(dctx->shash, ctx->htable,
198202
dctx->buffer, GHASH_DIGEST_SIZE);

0 commit comments

Comments
 (0)