diff options
Diffstat (limited to 'arch/x86/crypto/aesni-intel_glue.c')
-rw-r--r-- | arch/x86/crypto/aesni-intel_glue.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c index 545d0ce59818..c799352e24fc 100644 --- a/arch/x86/crypto/aesni-intel_glue.c +++ b/arch/x86/crypto/aesni-intel_glue.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <crypto/aes.h> | 28 | #include <crypto/aes.h> |
29 | #include <crypto/cryptd.h> | 29 | #include <crypto/cryptd.h> |
30 | #include <crypto/ctr.h> | 30 | #include <crypto/ctr.h> |
31 | #include <asm/cpu_device_id.h> | ||
31 | #include <asm/i387.h> | 32 | #include <asm/i387.h> |
32 | #include <asm/aes.h> | 33 | #include <asm/aes.h> |
33 | #include <crypto/scatterwalk.h> | 34 | #include <crypto/scatterwalk.h> |
@@ -1107,12 +1108,12 @@ static int __driver_rfc4106_encrypt(struct aead_request *req) | |||
1107 | one_entry_in_sg = 1; | 1108 | one_entry_in_sg = 1; |
1108 | scatterwalk_start(&src_sg_walk, req->src); | 1109 | scatterwalk_start(&src_sg_walk, req->src); |
1109 | scatterwalk_start(&assoc_sg_walk, req->assoc); | 1110 | scatterwalk_start(&assoc_sg_walk, req->assoc); |
1110 | src = scatterwalk_map(&src_sg_walk, 0); | 1111 | src = scatterwalk_map(&src_sg_walk); |
1111 | assoc = scatterwalk_map(&assoc_sg_walk, 0); | 1112 | assoc = scatterwalk_map(&assoc_sg_walk); |
1112 | dst = src; | 1113 | dst = src; |
1113 | if (unlikely(req->src != req->dst)) { | 1114 | if (unlikely(req->src != req->dst)) { |
1114 | scatterwalk_start(&dst_sg_walk, req->dst); | 1115 | scatterwalk_start(&dst_sg_walk, req->dst); |
1115 | dst = scatterwalk_map(&dst_sg_walk, 0); | 1116 | dst = scatterwalk_map(&dst_sg_walk); |
1116 | } | 1117 | } |
1117 | 1118 | ||
1118 | } else { | 1119 | } else { |
@@ -1136,11 +1137,11 @@ static int __driver_rfc4106_encrypt(struct aead_request *req) | |||
1136 | * back to the packet. */ | 1137 | * back to the packet. */ |
1137 | if (one_entry_in_sg) { | 1138 | if (one_entry_in_sg) { |
1138 | if (unlikely(req->src != req->dst)) { | 1139 | if (unlikely(req->src != req->dst)) { |
1139 | scatterwalk_unmap(dst, 0); | 1140 | scatterwalk_unmap(dst); |
1140 | scatterwalk_done(&dst_sg_walk, 0, 0); | 1141 | scatterwalk_done(&dst_sg_walk, 0, 0); |
1141 | } | 1142 | } |
1142 | scatterwalk_unmap(src, 0); | 1143 | scatterwalk_unmap(src); |
1143 | scatterwalk_unmap(assoc, 0); | 1144 | scatterwalk_unmap(assoc); |
1144 | scatterwalk_done(&src_sg_walk, 0, 0); | 1145 | scatterwalk_done(&src_sg_walk, 0, 0); |
1145 | scatterwalk_done(&assoc_sg_walk, 0, 0); | 1146 | scatterwalk_done(&assoc_sg_walk, 0, 0); |
1146 | } else { | 1147 | } else { |
@@ -1189,12 +1190,12 @@ static int __driver_rfc4106_decrypt(struct aead_request *req) | |||
1189 | one_entry_in_sg = 1; | 1190 | one_entry_in_sg = 1; |
1190 | scatterwalk_start(&src_sg_walk, req->src); | 1191 | scatterwalk_start(&src_sg_walk, req->src); |
1191 | scatterwalk_start(&assoc_sg_walk, req->assoc); | 1192 | scatterwalk_start(&assoc_sg_walk, req->assoc); |
1192 | src = scatterwalk_map(&src_sg_walk, 0); | 1193 | src = scatterwalk_map(&src_sg_walk); |
1193 | assoc = scatterwalk_map(&assoc_sg_walk, 0); | 1194 | assoc = scatterwalk_map(&assoc_sg_walk); |
1194 | dst = src; | 1195 | dst = src; |
1195 | if (unlikely(req->src != req->dst)) { | 1196 | if (unlikely(req->src != req->dst)) { |
1196 | scatterwalk_start(&dst_sg_walk, req->dst); | 1197 | scatterwalk_start(&dst_sg_walk, req->dst); |
1197 | dst = scatterwalk_map(&dst_sg_walk, 0); | 1198 | dst = scatterwalk_map(&dst_sg_walk); |
1198 | } | 1199 | } |
1199 | 1200 | ||
1200 | } else { | 1201 | } else { |
@@ -1219,11 +1220,11 @@ static int __driver_rfc4106_decrypt(struct aead_request *req) | |||
1219 | 1220 | ||
1220 | if (one_entry_in_sg) { | 1221 | if (one_entry_in_sg) { |
1221 | if (unlikely(req->src != req->dst)) { | 1222 | if (unlikely(req->src != req->dst)) { |
1222 | scatterwalk_unmap(dst, 0); | 1223 | scatterwalk_unmap(dst); |
1223 | scatterwalk_done(&dst_sg_walk, 0, 0); | 1224 | scatterwalk_done(&dst_sg_walk, 0, 0); |
1224 | } | 1225 | } |
1225 | scatterwalk_unmap(src, 0); | 1226 | scatterwalk_unmap(src); |
1226 | scatterwalk_unmap(assoc, 0); | 1227 | scatterwalk_unmap(assoc); |
1227 | scatterwalk_done(&src_sg_walk, 0, 0); | 1228 | scatterwalk_done(&src_sg_walk, 0, 0); |
1228 | scatterwalk_done(&assoc_sg_walk, 0, 0); | 1229 | scatterwalk_done(&assoc_sg_walk, 0, 0); |
1229 | } else { | 1230 | } else { |
@@ -1253,14 +1254,19 @@ static struct crypto_alg __rfc4106_alg = { | |||
1253 | }; | 1254 | }; |
1254 | #endif | 1255 | #endif |
1255 | 1256 | ||
1257 | |||
1258 | static const struct x86_cpu_id aesni_cpu_id[] = { | ||
1259 | X86_FEATURE_MATCH(X86_FEATURE_AES), | ||
1260 | {} | ||
1261 | }; | ||
1262 | MODULE_DEVICE_TABLE(x86cpu, aesni_cpu_id); | ||
1263 | |||
1256 | static int __init aesni_init(void) | 1264 | static int __init aesni_init(void) |
1257 | { | 1265 | { |
1258 | int err; | 1266 | int err; |
1259 | 1267 | ||
1260 | if (!cpu_has_aes) { | 1268 | if (!x86_match_cpu(aesni_cpu_id)) |
1261 | printk(KERN_INFO "Intel AES-NI instructions are not detected.\n"); | ||
1262 | return -ENODEV; | 1269 | return -ENODEV; |
1263 | } | ||
1264 | 1270 | ||
1265 | if ((err = crypto_fpu_init())) | 1271 | if ((err = crypto_fpu_init())) |
1266 | goto fpu_err; | 1272 | goto fpu_err; |