diff options
Diffstat (limited to 'drivers/crypto/vmx/aes_xts.c')
-rw-r--r-- | drivers/crypto/vmx/aes_xts.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/crypto/vmx/aes_xts.c b/drivers/crypto/vmx/aes_xts.c index 8bd9aff0f55f..e9954a7d4694 100644 --- a/drivers/crypto/vmx/aes_xts.c +++ b/drivers/crypto/vmx/aes_xts.c | |||
@@ -116,32 +116,39 @@ static int p8_aes_xts_crypt(struct blkcipher_desc *desc, | |||
116 | ret = enc? crypto_skcipher_encrypt(req) : crypto_skcipher_decrypt(req); | 116 | ret = enc? crypto_skcipher_encrypt(req) : crypto_skcipher_decrypt(req); |
117 | skcipher_request_zero(req); | 117 | skcipher_request_zero(req); |
118 | } else { | 118 | } else { |
119 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
120 | |||
121 | ret = blkcipher_walk_virt(desc, &walk); | ||
122 | |||
119 | preempt_disable(); | 123 | preempt_disable(); |
120 | pagefault_disable(); | 124 | pagefault_disable(); |
121 | enable_kernel_vsx(); | 125 | enable_kernel_vsx(); |
122 | 126 | ||
123 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
124 | |||
125 | ret = blkcipher_walk_virt(desc, &walk); | ||
126 | iv = walk.iv; | 127 | iv = walk.iv; |
127 | memset(tweak, 0, AES_BLOCK_SIZE); | 128 | memset(tweak, 0, AES_BLOCK_SIZE); |
128 | aes_p8_encrypt(iv, tweak, &ctx->tweak_key); | 129 | aes_p8_encrypt(iv, tweak, &ctx->tweak_key); |
129 | 130 | ||
131 | disable_kernel_vsx(); | ||
132 | pagefault_enable(); | ||
133 | preempt_enable(); | ||
134 | |||
130 | while ((nbytes = walk.nbytes)) { | 135 | while ((nbytes = walk.nbytes)) { |
136 | preempt_disable(); | ||
137 | pagefault_disable(); | ||
138 | enable_kernel_vsx(); | ||
131 | if (enc) | 139 | if (enc) |
132 | aes_p8_xts_encrypt(walk.src.virt.addr, walk.dst.virt.addr, | 140 | aes_p8_xts_encrypt(walk.src.virt.addr, walk.dst.virt.addr, |
133 | nbytes & AES_BLOCK_MASK, &ctx->enc_key, NULL, tweak); | 141 | nbytes & AES_BLOCK_MASK, &ctx->enc_key, NULL, tweak); |
134 | else | 142 | else |
135 | aes_p8_xts_decrypt(walk.src.virt.addr, walk.dst.virt.addr, | 143 | aes_p8_xts_decrypt(walk.src.virt.addr, walk.dst.virt.addr, |
136 | nbytes & AES_BLOCK_MASK, &ctx->dec_key, NULL, tweak); | 144 | nbytes & AES_BLOCK_MASK, &ctx->dec_key, NULL, tweak); |
145 | disable_kernel_vsx(); | ||
146 | pagefault_enable(); | ||
147 | preempt_enable(); | ||
137 | 148 | ||
138 | nbytes &= AES_BLOCK_SIZE - 1; | 149 | nbytes &= AES_BLOCK_SIZE - 1; |
139 | ret = blkcipher_walk_done(desc, &walk, nbytes); | 150 | ret = blkcipher_walk_done(desc, &walk, nbytes); |
140 | } | 151 | } |
141 | |||
142 | disable_kernel_vsx(); | ||
143 | pagefault_enable(); | ||
144 | preempt_enable(); | ||
145 | } | 152 | } |
146 | return ret; | 153 | return ret; |
147 | } | 154 | } |