diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 17:46:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 17:46:51 -0400 |
commit | 2a8ba8f032160552a3beffab8aae9019ff477504 (patch) | |
tree | b50f70a3c8f7c2e179e1587d33ea3542d68525f9 /arch | |
parent | ec2a7587e0a91d5c1afe23a0a73edfce06c5e4e0 (diff) | |
parent | e954bc91bdd4bb08b8325478c5004b24a23a3522 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (46 commits)
random: simplify fips mode
crypto: authenc - Fix cryptlen calculation
crypto: talitos - add support for sha224
crypto: talitos - add hash algorithms
crypto: talitos - second prepare step for adding ahash algorithms
crypto: talitos - prepare for adding ahash algorithms
crypto: n2 - Add Niagara2 crypto driver
crypto: skcipher - Add ablkcipher_walk interfaces
crypto: testmgr - Add testing for async hashing and update/final
crypto: tcrypt - Add speed tests for async hashing
crypto: scatterwalk - Fix scatterwalk_done() test
crypto: hifn_795x - Rename ablkcipher_walk to hifn_cipher_walk
padata: Use get_online_cpus/put_online_cpus in padata_free
padata: Add some code comments
padata: Flush the padata queues actively
padata: Use a timer to handle remaining objects in the reorder queues
crypto: shash - Remove usage of CRYPTO_MINALIGN
crypto: mv_cesa - Use resource_size
crypto: omap - OMAP macros corrected
padata: Use get_online_cpus/put_online_cpus
...
Fix up conflicts in arch/arm/mach-omap2/devices.c
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/clock2420_data.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock2430_data.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/clock3xxx_data.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap2/devices.c | 58 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/plat/omap34xx.h | 5 | ||||
-rw-r--r-- | arch/x86/crypto/aesni-intel_asm.S | 115 | ||||
-rw-r--r-- | arch/x86/crypto/aesni-intel_glue.c | 130 | ||||
-rw-r--r-- | arch/x86/include/asm/inst.h | 96 |
8 files changed, 387 insertions, 23 deletions
diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c index 23bc981574f6..37d65d62ed8f 100644 --- a/arch/arm/mach-omap2/clock2420_data.c +++ b/arch/arm/mach-omap2/clock2420_data.c | |||
@@ -1836,7 +1836,7 @@ static struct omap_clk omap2420_clks[] = { | |||
1836 | CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X), | 1836 | CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X), |
1837 | CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X), | 1837 | CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X), |
1838 | CLK(NULL, "des_ick", &des_ick, CK_242X), | 1838 | CLK(NULL, "des_ick", &des_ick, CK_242X), |
1839 | CLK(NULL, "sha_ick", &sha_ick, CK_242X), | 1839 | CLK("omap-sham", "ick", &sha_ick, CK_242X), |
1840 | CLK("omap_rng", "ick", &rng_ick, CK_242X), | 1840 | CLK("omap_rng", "ick", &rng_ick, CK_242X), |
1841 | CLK(NULL, "aes_ick", &aes_ick, CK_242X), | 1841 | CLK(NULL, "aes_ick", &aes_ick, CK_242X), |
1842 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), | 1842 | CLK(NULL, "pka_ick", &pka_ick, CK_242X), |
diff --git a/arch/arm/mach-omap2/clock2430_data.c b/arch/arm/mach-omap2/clock2430_data.c index 2df50d97deb2..b33118fb6a87 100644 --- a/arch/arm/mach-omap2/clock2430_data.c +++ b/arch/arm/mach-omap2/clock2430_data.c | |||
@@ -1924,7 +1924,7 @@ static struct omap_clk omap2430_clks[] = { | |||
1924 | CLK(NULL, "sdma_ick", &sdma_ick, CK_243X), | 1924 | CLK(NULL, "sdma_ick", &sdma_ick, CK_243X), |
1925 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_243X), | 1925 | CLK(NULL, "sdrc_ick", &sdrc_ick, CK_243X), |
1926 | CLK(NULL, "des_ick", &des_ick, CK_243X), | 1926 | CLK(NULL, "des_ick", &des_ick, CK_243X), |
1927 | CLK(NULL, "sha_ick", &sha_ick, CK_243X), | 1927 | CLK("omap-sham", "ick", &sha_ick, CK_243X), |
1928 | CLK("omap_rng", "ick", &rng_ick, CK_243X), | 1928 | CLK("omap_rng", "ick", &rng_ick, CK_243X), |
1929 | CLK(NULL, "aes_ick", &aes_ick, CK_243X), | 1929 | CLK(NULL, "aes_ick", &aes_ick, CK_243X), |
1930 | CLK(NULL, "pka_ick", &pka_ick, CK_243X), | 1930 | CLK(NULL, "pka_ick", &pka_ick, CK_243X), |
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c index 833be485c89e..41b155acfca7 100644 --- a/arch/arm/mach-omap2/clock3xxx_data.c +++ b/arch/arm/mach-omap2/clock3xxx_data.c | |||
@@ -3284,7 +3284,7 @@ static struct omap_clk omap3xxx_clks[] = { | |||
3284 | CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2 | CK_AM35XX), | 3284 | CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2 | CK_AM35XX), |
3285 | CLK(NULL, "icr_ick", &icr_ick, CK_343X), | 3285 | CLK(NULL, "icr_ick", &icr_ick, CK_343X), |
3286 | CLK(NULL, "aes2_ick", &aes2_ick, CK_343X), | 3286 | CLK(NULL, "aes2_ick", &aes2_ick, CK_343X), |
3287 | CLK(NULL, "sha12_ick", &sha12_ick, CK_343X), | 3287 | CLK("omap-sham", "ick", &sha12_ick, CK_343X), |
3288 | CLK(NULL, "des2_ick", &des2_ick, CK_343X), | 3288 | CLK(NULL, "des2_ick", &des2_ick, CK_343X), |
3289 | CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_3XXX), | 3289 | CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_3XXX), |
3290 | CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_3XXX), | 3290 | CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_3XXX), |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 705a7a30a87f..03e6c9ed82a4 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <plat/mux.h> | 28 | #include <plat/mux.h> |
29 | #include <mach/gpio.h> | 29 | #include <mach/gpio.h> |
30 | #include <plat/mmc.h> | 30 | #include <plat/mmc.h> |
31 | #include <plat/dma.h> | ||
31 | 32 | ||
32 | #include "mux.h" | 33 | #include "mux.h" |
33 | 34 | ||
@@ -486,8 +487,10 @@ static void omap_init_pmu(void) | |||
486 | } | 487 | } |
487 | 488 | ||
488 | 489 | ||
489 | #ifdef CONFIG_OMAP_SHA1_MD5 | 490 | #if defined(CONFIG_CRYPTO_DEV_OMAP_SHAM) || defined(CONFIG_CRYPTO_DEV_OMAP_SHAM_MODULE) |
490 | static struct resource sha1_md5_resources[] = { | 491 | |
492 | #ifdef CONFIG_ARCH_OMAP2 | ||
493 | static struct resource omap2_sham_resources[] = { | ||
491 | { | 494 | { |
492 | .start = OMAP24XX_SEC_SHA1MD5_BASE, | 495 | .start = OMAP24XX_SEC_SHA1MD5_BASE, |
493 | .end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64, | 496 | .end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64, |
@@ -498,20 +501,55 @@ static struct resource sha1_md5_resources[] = { | |||
498 | .flags = IORESOURCE_IRQ, | 501 | .flags = IORESOURCE_IRQ, |
499 | } | 502 | } |
500 | }; | 503 | }; |
504 | static int omap2_sham_resources_sz = ARRAY_SIZE(omap2_sham_resources); | ||
505 | #else | ||
506 | #define omap2_sham_resources NULL | ||
507 | #define omap2_sham_resources_sz 0 | ||
508 | #endif | ||
501 | 509 | ||
502 | static struct platform_device sha1_md5_device = { | 510 | #ifdef CONFIG_ARCH_OMAP3 |
503 | .name = "OMAP SHA1/MD5", | 511 | static struct resource omap3_sham_resources[] = { |
512 | { | ||
513 | .start = OMAP34XX_SEC_SHA1MD5_BASE, | ||
514 | .end = OMAP34XX_SEC_SHA1MD5_BASE + 0x64, | ||
515 | .flags = IORESOURCE_MEM, | ||
516 | }, | ||
517 | { | ||
518 | .start = INT_34XX_SHA1MD52_IRQ, | ||
519 | .flags = IORESOURCE_IRQ, | ||
520 | }, | ||
521 | { | ||
522 | .start = OMAP34XX_DMA_SHA1MD5_RX, | ||
523 | .flags = IORESOURCE_DMA, | ||
524 | } | ||
525 | }; | ||
526 | static int omap3_sham_resources_sz = ARRAY_SIZE(omap3_sham_resources); | ||
527 | #else | ||
528 | #define omap3_sham_resources NULL | ||
529 | #define omap3_sham_resources_sz 0 | ||
530 | #endif | ||
531 | |||
532 | static struct platform_device sham_device = { | ||
533 | .name = "omap-sham", | ||
504 | .id = -1, | 534 | .id = -1, |
505 | .num_resources = ARRAY_SIZE(sha1_md5_resources), | ||
506 | .resource = sha1_md5_resources, | ||
507 | }; | 535 | }; |
508 | 536 | ||
509 | static void omap_init_sha1_md5(void) | 537 | static void omap_init_sham(void) |
510 | { | 538 | { |
511 | platform_device_register(&sha1_md5_device); | 539 | if (cpu_is_omap24xx()) { |
540 | sham_device.resource = omap2_sham_resources; | ||
541 | sham_device.num_resources = omap2_sham_resources_sz; | ||
542 | } else if (cpu_is_omap34xx()) { | ||
543 | sham_device.resource = omap3_sham_resources; | ||
544 | sham_device.num_resources = omap3_sham_resources_sz; | ||
545 | } else { | ||
546 | pr_err("%s: platform not supported\n", __func__); | ||
547 | return; | ||
548 | } | ||
549 | platform_device_register(&sham_device); | ||
512 | } | 550 | } |
513 | #else | 551 | #else |
514 | static inline void omap_init_sha1_md5(void) { } | 552 | static inline void omap_init_sham(void) { } |
515 | #endif | 553 | #endif |
516 | 554 | ||
517 | /*-------------------------------------------------------------------------*/ | 555 | /*-------------------------------------------------------------------------*/ |
@@ -869,7 +907,7 @@ static int __init omap2_init_devices(void) | |||
869 | omap_init_pmu(); | 907 | omap_init_pmu(); |
870 | omap_hdq_init(); | 908 | omap_hdq_init(); |
871 | omap_init_sti(); | 909 | omap_init_sti(); |
872 | omap_init_sha1_md5(); | 910 | omap_init_sham(); |
873 | omap_init_vout(); | 911 | omap_init_vout(); |
874 | 912 | ||
875 | return 0; | 913 | return 0; |
diff --git a/arch/arm/plat-omap/include/plat/omap34xx.h b/arch/arm/plat-omap/include/plat/omap34xx.h index 2845fdc658b0..98fc8b4a4cc4 100644 --- a/arch/arm/plat-omap/include/plat/omap34xx.h +++ b/arch/arm/plat-omap/include/plat/omap34xx.h | |||
@@ -82,5 +82,10 @@ | |||
82 | 82 | ||
83 | #define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000) | 83 | #define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000) |
84 | 84 | ||
85 | /* Security */ | ||
86 | #define OMAP34XX_SEC_BASE (L4_34XX_BASE + 0xA0000) | ||
87 | #define OMAP34XX_SEC_SHA1MD5_BASE (OMAP34XX_SEC_BASE + 0x23000) | ||
88 | #define OMAP34XX_SEC_AES_BASE (OMAP34XX_SEC_BASE + 0x25000) | ||
89 | |||
85 | #endif /* __ASM_ARCH_OMAP3_H */ | 90 | #endif /* __ASM_ARCH_OMAP3_H */ |
86 | 91 | ||
diff --git a/arch/x86/crypto/aesni-intel_asm.S b/arch/x86/crypto/aesni-intel_asm.S index 20bb0e1ac681..ff16756a51c1 100644 --- a/arch/x86/crypto/aesni-intel_asm.S +++ b/arch/x86/crypto/aesni-intel_asm.S | |||
@@ -32,6 +32,9 @@ | |||
32 | #define IN IN1 | 32 | #define IN IN1 |
33 | #define KEY %xmm2 | 33 | #define KEY %xmm2 |
34 | #define IV %xmm3 | 34 | #define IV %xmm3 |
35 | #define BSWAP_MASK %xmm10 | ||
36 | #define CTR %xmm11 | ||
37 | #define INC %xmm12 | ||
35 | 38 | ||
36 | #define KEYP %rdi | 39 | #define KEYP %rdi |
37 | #define OUTP %rsi | 40 | #define OUTP %rsi |
@@ -42,6 +45,7 @@ | |||
42 | #define T1 %r10 | 45 | #define T1 %r10 |
43 | #define TKEYP T1 | 46 | #define TKEYP T1 |
44 | #define T2 %r11 | 47 | #define T2 %r11 |
48 | #define TCTR_LOW T2 | ||
45 | 49 | ||
46 | _key_expansion_128: | 50 | _key_expansion_128: |
47 | _key_expansion_256a: | 51 | _key_expansion_256a: |
@@ -724,3 +728,114 @@ ENTRY(aesni_cbc_dec) | |||
724 | movups IV, (IVP) | 728 | movups IV, (IVP) |
725 | .Lcbc_dec_just_ret: | 729 | .Lcbc_dec_just_ret: |
726 | ret | 730 | ret |
731 | |||
732 | .align 16 | ||
733 | .Lbswap_mask: | ||
734 | .byte 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 | ||
735 | |||
736 | /* | ||
737 | * _aesni_inc_init: internal ABI | ||
738 | * setup registers used by _aesni_inc | ||
739 | * input: | ||
740 | * IV | ||
741 | * output: | ||
742 | * CTR: == IV, in little endian | ||
743 | * TCTR_LOW: == lower qword of CTR | ||
744 | * INC: == 1, in little endian | ||
745 | * BSWAP_MASK == endian swapping mask | ||
746 | */ | ||
747 | _aesni_inc_init: | ||
748 | movaps .Lbswap_mask, BSWAP_MASK | ||
749 | movaps IV, CTR | ||
750 | PSHUFB_XMM BSWAP_MASK CTR | ||
751 | mov $1, TCTR_LOW | ||
752 | MOVQ_R64_XMM TCTR_LOW INC | ||
753 | MOVQ_R64_XMM CTR TCTR_LOW | ||
754 | ret | ||
755 | |||
756 | /* | ||
757 | * _aesni_inc: internal ABI | ||
758 | * Increase IV by 1, IV is in big endian | ||
759 | * input: | ||
760 | * IV | ||
761 | * CTR: == IV, in little endian | ||
762 | * TCTR_LOW: == lower qword of CTR | ||
763 | * INC: == 1, in little endian | ||
764 | * BSWAP_MASK == endian swapping mask | ||
765 | * output: | ||
766 | * IV: Increase by 1 | ||
767 | * changed: | ||
768 | * CTR: == output IV, in little endian | ||
769 | * TCTR_LOW: == lower qword of CTR | ||
770 | */ | ||
771 | _aesni_inc: | ||
772 | paddq INC, CTR | ||
773 | add $1, TCTR_LOW | ||
774 | jnc .Linc_low | ||
775 | pslldq $8, INC | ||
776 | paddq INC, CTR | ||
777 | psrldq $8, INC | ||
778 | .Linc_low: | ||
779 | movaps CTR, IV | ||
780 | PSHUFB_XMM BSWAP_MASK IV | ||
781 | ret | ||
782 | |||
783 | /* | ||
784 | * void aesni_ctr_enc(struct crypto_aes_ctx *ctx, const u8 *dst, u8 *src, | ||
785 | * size_t len, u8 *iv) | ||
786 | */ | ||
787 | ENTRY(aesni_ctr_enc) | ||
788 | cmp $16, LEN | ||
789 | jb .Lctr_enc_just_ret | ||
790 | mov 480(KEYP), KLEN | ||
791 | movups (IVP), IV | ||
792 | call _aesni_inc_init | ||
793 | cmp $64, LEN | ||
794 | jb .Lctr_enc_loop1 | ||
795 | .align 4 | ||
796 | .Lctr_enc_loop4: | ||
797 | movaps IV, STATE1 | ||
798 | call _aesni_inc | ||
799 | movups (INP), IN1 | ||
800 | movaps IV, STATE2 | ||
801 | call _aesni_inc | ||
802 | movups 0x10(INP), IN2 | ||
803 | movaps IV, STATE3 | ||
804 | call _aesni_inc | ||
805 | movups 0x20(INP), IN3 | ||
806 | movaps IV, STATE4 | ||
807 | call _aesni_inc | ||
808 | movups 0x30(INP), IN4 | ||
809 | call _aesni_enc4 | ||
810 | pxor IN1, STATE1 | ||
811 | movups STATE1, (OUTP) | ||
812 | pxor IN2, STATE2 | ||
813 | movups STATE2, 0x10(OUTP) | ||
814 | pxor IN3, STATE3 | ||
815 | movups STATE3, 0x20(OUTP) | ||
816 | pxor IN4, STATE4 | ||
817 | movups STATE4, 0x30(OUTP) | ||
818 | sub $64, LEN | ||
819 | add $64, INP | ||
820 | add $64, OUTP | ||
821 | cmp $64, LEN | ||
822 | jge .Lctr_enc_loop4 | ||
823 | cmp $16, LEN | ||
824 | jb .Lctr_enc_ret | ||
825 | .align 4 | ||
826 | .Lctr_enc_loop1: | ||
827 | movaps IV, STATE | ||
828 | call _aesni_inc | ||
829 | movups (INP), IN | ||
830 | call _aesni_enc1 | ||
831 | pxor IN, STATE | ||
832 | movups STATE, (OUTP) | ||
833 | sub $16, LEN | ||
834 | add $16, INP | ||
835 | add $16, OUTP | ||
836 | cmp $16, LEN | ||
837 | jge .Lctr_enc_loop1 | ||
838 | .Lctr_enc_ret: | ||
839 | movups IV, (IVP) | ||
840 | .Lctr_enc_just_ret: | ||
841 | ret | ||
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c index 49c552c060e9..2cb3dcc4490a 100644 --- a/arch/x86/crypto/aesni-intel_glue.c +++ b/arch/x86/crypto/aesni-intel_glue.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <crypto/algapi.h> | 18 | #include <crypto/algapi.h> |
19 | #include <crypto/aes.h> | 19 | #include <crypto/aes.h> |
20 | #include <crypto/cryptd.h> | 20 | #include <crypto/cryptd.h> |
21 | #include <crypto/ctr.h> | ||
21 | #include <asm/i387.h> | 22 | #include <asm/i387.h> |
22 | #include <asm/aes.h> | 23 | #include <asm/aes.h> |
23 | 24 | ||
@@ -58,6 +59,8 @@ asmlinkage void aesni_cbc_enc(struct crypto_aes_ctx *ctx, u8 *out, | |||
58 | const u8 *in, unsigned int len, u8 *iv); | 59 | const u8 *in, unsigned int len, u8 *iv); |
59 | asmlinkage void aesni_cbc_dec(struct crypto_aes_ctx *ctx, u8 *out, | 60 | asmlinkage void aesni_cbc_dec(struct crypto_aes_ctx *ctx, u8 *out, |
60 | const u8 *in, unsigned int len, u8 *iv); | 61 | const u8 *in, unsigned int len, u8 *iv); |
62 | asmlinkage void aesni_ctr_enc(struct crypto_aes_ctx *ctx, u8 *out, | ||
63 | const u8 *in, unsigned int len, u8 *iv); | ||
61 | 64 | ||
62 | static inline struct crypto_aes_ctx *aes_ctx(void *raw_ctx) | 65 | static inline struct crypto_aes_ctx *aes_ctx(void *raw_ctx) |
63 | { | 66 | { |
@@ -321,6 +324,72 @@ static struct crypto_alg blk_cbc_alg = { | |||
321 | }, | 324 | }, |
322 | }; | 325 | }; |
323 | 326 | ||
327 | static void ctr_crypt_final(struct crypto_aes_ctx *ctx, | ||
328 | struct blkcipher_walk *walk) | ||
329 | { | ||
330 | u8 *ctrblk = walk->iv; | ||
331 | u8 keystream[AES_BLOCK_SIZE]; | ||
332 | u8 *src = walk->src.virt.addr; | ||
333 | u8 *dst = walk->dst.virt.addr; | ||
334 | unsigned int nbytes = walk->nbytes; | ||
335 | |||
336 | aesni_enc(ctx, keystream, ctrblk); | ||
337 | crypto_xor(keystream, src, nbytes); | ||
338 | memcpy(dst, keystream, nbytes); | ||
339 | crypto_inc(ctrblk, AES_BLOCK_SIZE); | ||
340 | } | ||
341 | |||
342 | static int ctr_crypt(struct blkcipher_desc *desc, | ||
343 | struct scatterlist *dst, struct scatterlist *src, | ||
344 | unsigned int nbytes) | ||
345 | { | ||
346 | struct crypto_aes_ctx *ctx = aes_ctx(crypto_blkcipher_ctx(desc->tfm)); | ||
347 | struct blkcipher_walk walk; | ||
348 | int err; | ||
349 | |||
350 | blkcipher_walk_init(&walk, dst, src, nbytes); | ||
351 | err = blkcipher_walk_virt_block(desc, &walk, AES_BLOCK_SIZE); | ||
352 | desc->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; | ||
353 | |||
354 | kernel_fpu_begin(); | ||
355 | while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { | ||
356 | aesni_ctr_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, | ||
357 | nbytes & AES_BLOCK_MASK, walk.iv); | ||
358 | nbytes &= AES_BLOCK_SIZE - 1; | ||
359 | err = blkcipher_walk_done(desc, &walk, nbytes); | ||
360 | } | ||
361 | if (walk.nbytes) { | ||
362 | ctr_crypt_final(ctx, &walk); | ||
363 | err = blkcipher_walk_done(desc, &walk, 0); | ||
364 | } | ||
365 | kernel_fpu_end(); | ||
366 | |||
367 | return err; | ||
368 | } | ||
369 | |||
370 | static struct crypto_alg blk_ctr_alg = { | ||
371 | .cra_name = "__ctr-aes-aesni", | ||
372 | .cra_driver_name = "__driver-ctr-aes-aesni", | ||
373 | .cra_priority = 0, | ||
374 | .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, | ||
375 | .cra_blocksize = 1, | ||
376 | .cra_ctxsize = sizeof(struct crypto_aes_ctx)+AESNI_ALIGN-1, | ||
377 | .cra_alignmask = 0, | ||
378 | .cra_type = &crypto_blkcipher_type, | ||
379 | .cra_module = THIS_MODULE, | ||
380 | .cra_list = LIST_HEAD_INIT(blk_ctr_alg.cra_list), | ||
381 | .cra_u = { | ||
382 | .blkcipher = { | ||
383 | .min_keysize = AES_MIN_KEY_SIZE, | ||
384 | .max_keysize = AES_MAX_KEY_SIZE, | ||
385 | .ivsize = AES_BLOCK_SIZE, | ||
386 | .setkey = aes_set_key, | ||
387 | .encrypt = ctr_crypt, | ||
388 | .decrypt = ctr_crypt, | ||
389 | }, | ||
390 | }, | ||
391 | }; | ||
392 | |||
324 | static int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, | 393 | static int ablk_set_key(struct crypto_ablkcipher *tfm, const u8 *key, |
325 | unsigned int key_len) | 394 | unsigned int key_len) |
326 | { | 395 | { |
@@ -467,13 +536,11 @@ static struct crypto_alg ablk_cbc_alg = { | |||
467 | }, | 536 | }, |
468 | }; | 537 | }; |
469 | 538 | ||
470 | #ifdef HAS_CTR | ||
471 | static int ablk_ctr_init(struct crypto_tfm *tfm) | 539 | static int ablk_ctr_init(struct crypto_tfm *tfm) |
472 | { | 540 | { |
473 | struct cryptd_ablkcipher *cryptd_tfm; | 541 | struct cryptd_ablkcipher *cryptd_tfm; |
474 | 542 | ||
475 | cryptd_tfm = cryptd_alloc_ablkcipher("fpu(ctr(__driver-aes-aesni))", | 543 | cryptd_tfm = cryptd_alloc_ablkcipher("__driver-ctr-aes-aesni", 0, 0); |
476 | 0, 0); | ||
477 | if (IS_ERR(cryptd_tfm)) | 544 | if (IS_ERR(cryptd_tfm)) |
478 | return PTR_ERR(cryptd_tfm); | 545 | return PTR_ERR(cryptd_tfm); |
479 | ablk_init_common(tfm, cryptd_tfm); | 546 | ablk_init_common(tfm, cryptd_tfm); |
@@ -500,11 +567,50 @@ static struct crypto_alg ablk_ctr_alg = { | |||
500 | .ivsize = AES_BLOCK_SIZE, | 567 | .ivsize = AES_BLOCK_SIZE, |
501 | .setkey = ablk_set_key, | 568 | .setkey = ablk_set_key, |
502 | .encrypt = ablk_encrypt, | 569 | .encrypt = ablk_encrypt, |
503 | .decrypt = ablk_decrypt, | 570 | .decrypt = ablk_encrypt, |
504 | .geniv = "chainiv", | 571 | .geniv = "chainiv", |
505 | }, | 572 | }, |
506 | }, | 573 | }, |
507 | }; | 574 | }; |
575 | |||
576 | #ifdef HAS_CTR | ||
577 | static int ablk_rfc3686_ctr_init(struct crypto_tfm *tfm) | ||
578 | { | ||
579 | struct cryptd_ablkcipher *cryptd_tfm; | ||
580 | |||
581 | cryptd_tfm = cryptd_alloc_ablkcipher( | ||
582 | "rfc3686(__driver-ctr-aes-aesni)", 0, 0); | ||
583 | if (IS_ERR(cryptd_tfm)) | ||
584 | return PTR_ERR(cryptd_tfm); | ||
585 | ablk_init_common(tfm, cryptd_tfm); | ||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | static struct crypto_alg ablk_rfc3686_ctr_alg = { | ||
590 | .cra_name = "rfc3686(ctr(aes))", | ||
591 | .cra_driver_name = "rfc3686-ctr-aes-aesni", | ||
592 | .cra_priority = 400, | ||
593 | .cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC, | ||
594 | .cra_blocksize = 1, | ||
595 | .cra_ctxsize = sizeof(struct async_aes_ctx), | ||
596 | .cra_alignmask = 0, | ||
597 | .cra_type = &crypto_ablkcipher_type, | ||
598 | .cra_module = THIS_MODULE, | ||
599 | .cra_list = LIST_HEAD_INIT(ablk_rfc3686_ctr_alg.cra_list), | ||
600 | .cra_init = ablk_rfc3686_ctr_init, | ||
601 | .cra_exit = ablk_exit, | ||
602 | .cra_u = { | ||
603 | .ablkcipher = { | ||
604 | .min_keysize = AES_MIN_KEY_SIZE+CTR_RFC3686_NONCE_SIZE, | ||
605 | .max_keysize = AES_MAX_KEY_SIZE+CTR_RFC3686_NONCE_SIZE, | ||
606 | .ivsize = CTR_RFC3686_IV_SIZE, | ||
607 | .setkey = ablk_set_key, | ||
608 | .encrypt = ablk_encrypt, | ||
609 | .decrypt = ablk_decrypt, | ||
610 | .geniv = "seqiv", | ||
611 | }, | ||
612 | }, | ||
613 | }; | ||
508 | #endif | 614 | #endif |
509 | 615 | ||
510 | #ifdef HAS_LRW | 616 | #ifdef HAS_LRW |
@@ -640,13 +746,17 @@ static int __init aesni_init(void) | |||
640 | goto blk_ecb_err; | 746 | goto blk_ecb_err; |
641 | if ((err = crypto_register_alg(&blk_cbc_alg))) | 747 | if ((err = crypto_register_alg(&blk_cbc_alg))) |
642 | goto blk_cbc_err; | 748 | goto blk_cbc_err; |
749 | if ((err = crypto_register_alg(&blk_ctr_alg))) | ||
750 | goto blk_ctr_err; | ||
643 | if ((err = crypto_register_alg(&ablk_ecb_alg))) | 751 | if ((err = crypto_register_alg(&ablk_ecb_alg))) |
644 | goto ablk_ecb_err; | 752 | goto ablk_ecb_err; |
645 | if ((err = crypto_register_alg(&ablk_cbc_alg))) | 753 | if ((err = crypto_register_alg(&ablk_cbc_alg))) |
646 | goto ablk_cbc_err; | 754 | goto ablk_cbc_err; |
647 | #ifdef HAS_CTR | ||
648 | if ((err = crypto_register_alg(&ablk_ctr_alg))) | 755 | if ((err = crypto_register_alg(&ablk_ctr_alg))) |
649 | goto ablk_ctr_err; | 756 | goto ablk_ctr_err; |
757 | #ifdef HAS_CTR | ||
758 | if ((err = crypto_register_alg(&ablk_rfc3686_ctr_alg))) | ||
759 | goto ablk_rfc3686_ctr_err; | ||
650 | #endif | 760 | #endif |
651 | #ifdef HAS_LRW | 761 | #ifdef HAS_LRW |
652 | if ((err = crypto_register_alg(&ablk_lrw_alg))) | 762 | if ((err = crypto_register_alg(&ablk_lrw_alg))) |
@@ -675,13 +785,17 @@ ablk_pcbc_err: | |||
675 | ablk_lrw_err: | 785 | ablk_lrw_err: |
676 | #endif | 786 | #endif |
677 | #ifdef HAS_CTR | 787 | #ifdef HAS_CTR |
788 | crypto_unregister_alg(&ablk_rfc3686_ctr_alg); | ||
789 | ablk_rfc3686_ctr_err: | ||
790 | #endif | ||
678 | crypto_unregister_alg(&ablk_ctr_alg); | 791 | crypto_unregister_alg(&ablk_ctr_alg); |
679 | ablk_ctr_err: | 792 | ablk_ctr_err: |
680 | #endif | ||
681 | crypto_unregister_alg(&ablk_cbc_alg); | 793 | crypto_unregister_alg(&ablk_cbc_alg); |
682 | ablk_cbc_err: | 794 | ablk_cbc_err: |
683 | crypto_unregister_alg(&ablk_ecb_alg); | 795 | crypto_unregister_alg(&ablk_ecb_alg); |
684 | ablk_ecb_err: | 796 | ablk_ecb_err: |
797 | crypto_unregister_alg(&blk_ctr_alg); | ||
798 | blk_ctr_err: | ||
685 | crypto_unregister_alg(&blk_cbc_alg); | 799 | crypto_unregister_alg(&blk_cbc_alg); |
686 | blk_cbc_err: | 800 | blk_cbc_err: |
687 | crypto_unregister_alg(&blk_ecb_alg); | 801 | crypto_unregister_alg(&blk_ecb_alg); |
@@ -705,10 +819,12 @@ static void __exit aesni_exit(void) | |||
705 | crypto_unregister_alg(&ablk_lrw_alg); | 819 | crypto_unregister_alg(&ablk_lrw_alg); |
706 | #endif | 820 | #endif |
707 | #ifdef HAS_CTR | 821 | #ifdef HAS_CTR |
708 | crypto_unregister_alg(&ablk_ctr_alg); | 822 | crypto_unregister_alg(&ablk_rfc3686_ctr_alg); |
709 | #endif | 823 | #endif |
824 | crypto_unregister_alg(&ablk_ctr_alg); | ||
710 | crypto_unregister_alg(&ablk_cbc_alg); | 825 | crypto_unregister_alg(&ablk_cbc_alg); |
711 | crypto_unregister_alg(&ablk_ecb_alg); | 826 | crypto_unregister_alg(&ablk_ecb_alg); |
827 | crypto_unregister_alg(&blk_ctr_alg); | ||
712 | crypto_unregister_alg(&blk_cbc_alg); | 828 | crypto_unregister_alg(&blk_cbc_alg); |
713 | crypto_unregister_alg(&blk_ecb_alg); | 829 | crypto_unregister_alg(&blk_ecb_alg); |
714 | crypto_unregister_alg(&__aesni_alg); | 830 | crypto_unregister_alg(&__aesni_alg); |
diff --git a/arch/x86/include/asm/inst.h b/arch/x86/include/asm/inst.h index 14cf526091f9..280bf7fb6aba 100644 --- a/arch/x86/include/asm/inst.h +++ b/arch/x86/include/asm/inst.h | |||
@@ -7,7 +7,66 @@ | |||
7 | 7 | ||
8 | #ifdef __ASSEMBLY__ | 8 | #ifdef __ASSEMBLY__ |
9 | 9 | ||
10 | #define REG_NUM_INVALID 100 | ||
11 | |||
12 | #define REG_TYPE_R64 0 | ||
13 | #define REG_TYPE_XMM 1 | ||
14 | #define REG_TYPE_INVALID 100 | ||
15 | |||
16 | .macro R64_NUM opd r64 | ||
17 | \opd = REG_NUM_INVALID | ||
18 | .ifc \r64,%rax | ||
19 | \opd = 0 | ||
20 | .endif | ||
21 | .ifc \r64,%rcx | ||
22 | \opd = 1 | ||
23 | .endif | ||
24 | .ifc \r64,%rdx | ||
25 | \opd = 2 | ||
26 | .endif | ||
27 | .ifc \r64,%rbx | ||
28 | \opd = 3 | ||
29 | .endif | ||
30 | .ifc \r64,%rsp | ||
31 | \opd = 4 | ||
32 | .endif | ||
33 | .ifc \r64,%rbp | ||
34 | \opd = 5 | ||
35 | .endif | ||
36 | .ifc \r64,%rsi | ||
37 | \opd = 6 | ||
38 | .endif | ||
39 | .ifc \r64,%rdi | ||
40 | \opd = 7 | ||
41 | .endif | ||
42 | .ifc \r64,%r8 | ||
43 | \opd = 8 | ||
44 | .endif | ||
45 | .ifc \r64,%r9 | ||
46 | \opd = 9 | ||
47 | .endif | ||
48 | .ifc \r64,%r10 | ||
49 | \opd = 10 | ||
50 | .endif | ||
51 | .ifc \r64,%r11 | ||
52 | \opd = 11 | ||
53 | .endif | ||
54 | .ifc \r64,%r12 | ||
55 | \opd = 12 | ||
56 | .endif | ||
57 | .ifc \r64,%r13 | ||
58 | \opd = 13 | ||
59 | .endif | ||
60 | .ifc \r64,%r14 | ||
61 | \opd = 14 | ||
62 | .endif | ||
63 | .ifc \r64,%r15 | ||
64 | \opd = 15 | ||
65 | .endif | ||
66 | .endm | ||
67 | |||
10 | .macro XMM_NUM opd xmm | 68 | .macro XMM_NUM opd xmm |
69 | \opd = REG_NUM_INVALID | ||
11 | .ifc \xmm,%xmm0 | 70 | .ifc \xmm,%xmm0 |
12 | \opd = 0 | 71 | \opd = 0 |
13 | .endif | 72 | .endif |
@@ -58,13 +117,25 @@ | |||
58 | .endif | 117 | .endif |
59 | .endm | 118 | .endm |
60 | 119 | ||
120 | .macro REG_TYPE type reg | ||
121 | R64_NUM reg_type_r64 \reg | ||
122 | XMM_NUM reg_type_xmm \reg | ||
123 | .if reg_type_r64 <> REG_NUM_INVALID | ||
124 | \type = REG_TYPE_R64 | ||
125 | .elseif reg_type_xmm <> REG_NUM_INVALID | ||
126 | \type = REG_TYPE_XMM | ||
127 | .else | ||
128 | \type = REG_TYPE_INVALID | ||
129 | .endif | ||
130 | .endm | ||
131 | |||
61 | .macro PFX_OPD_SIZE | 132 | .macro PFX_OPD_SIZE |
62 | .byte 0x66 | 133 | .byte 0x66 |
63 | .endm | 134 | .endm |
64 | 135 | ||
65 | .macro PFX_REX opd1 opd2 | 136 | .macro PFX_REX opd1 opd2 W=0 |
66 | .if (\opd1 | \opd2) & 8 | 137 | .if ((\opd1 | \opd2) & 8) || \W |
67 | .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | 138 | .byte 0x40 | ((\opd1 & 8) >> 3) | ((\opd2 & 8) >> 1) | (\W << 3) |
68 | .endif | 139 | .endif |
69 | .endm | 140 | .endm |
70 | 141 | ||
@@ -145,6 +216,25 @@ | |||
145 | .byte 0x0f, 0x38, 0xdf | 216 | .byte 0x0f, 0x38, 0xdf |
146 | MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 | 217 | MODRM 0xc0 aesdeclast_opd1 aesdeclast_opd2 |
147 | .endm | 218 | .endm |
219 | |||
220 | .macro MOVQ_R64_XMM opd1 opd2 | ||
221 | REG_TYPE movq_r64_xmm_opd1_type \opd1 | ||
222 | .if movq_r64_xmm_opd1_type == REG_TYPE_XMM | ||
223 | XMM_NUM movq_r64_xmm_opd1 \opd1 | ||
224 | R64_NUM movq_r64_xmm_opd2 \opd2 | ||
225 | .else | ||
226 | R64_NUM movq_r64_xmm_opd1 \opd1 | ||
227 | XMM_NUM movq_r64_xmm_opd2 \opd2 | ||
228 | .endif | ||
229 | PFX_OPD_SIZE | ||
230 | PFX_REX movq_r64_xmm_opd1 movq_r64_xmm_opd2 1 | ||
231 | .if movq_r64_xmm_opd1_type == REG_TYPE_XMM | ||
232 | .byte 0x0f, 0x7e | ||
233 | .else | ||
234 | .byte 0x0f, 0x6e | ||
235 | .endif | ||
236 | MODRM 0xc0 movq_r64_xmm_opd1 movq_r64_xmm_opd2 | ||
237 | .endm | ||
148 | #endif | 238 | #endif |
149 | 239 | ||
150 | #endif | 240 | #endif |