From e0c502214bcb44f292d32af97cab826e463d2b31 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Wed, 25 Jan 2006 22:34:01 +1100 Subject: [PATCH] --- yaml --- r: 22338 b: refs/heads/master c: f10b7897ee29649fa7f0ccdc8d859ccd6ce7dbfd h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/crypto/api.c | 2 +- trunk/drivers/crypto/padlock-aes.c | 6 +++++- trunk/include/linux/crypto.h | 10 +++++++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 7ec552fbca00..c504a88b0ec9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a5f8c473052bc693cdbe2f9ae4b424b993886ff5 +refs/heads/master: f10b7897ee29649fa7f0ccdc8d859ccd6ce7dbfd diff --git a/trunk/crypto/api.c b/trunk/crypto/api.c index e26156f71839..34e02caffc2a 100644 --- a/trunk/crypto/api.c +++ b/trunk/crypto/api.c @@ -165,7 +165,7 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, int flags) break; } - return len + alg->cra_alignmask; + return len + (alg->cra_alignmask & ~(crypto_tfm_ctx_alignment() - 1)); } struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags) diff --git a/trunk/drivers/crypto/padlock-aes.c b/trunk/drivers/crypto/padlock-aes.c index 0c08c58252be..5158a9db4bc5 100644 --- a/trunk/drivers/crypto/padlock-aes.c +++ b/trunk/drivers/crypto/padlock-aes.c @@ -284,7 +284,11 @@ aes_hw_extkey_available(uint8_t key_len) static inline struct aes_ctx *aes_ctx(void *ctx) { - return (struct aes_ctx *)ALIGN((unsigned long)ctx, PADLOCK_ALIGNMENT); + unsigned long align = PADLOCK_ALIGNMENT; + + if (align <= crypto_tfm_ctx_alignment()) + align = 1; + return (struct aes_ctx *)ALIGN((unsigned long)ctx, align); } static int diff --git a/trunk/include/linux/crypto.h b/trunk/include/linux/crypto.h index d88bf8aa8b47..0ab1bc1152ca 100644 --- a/trunk/include/linux/crypto.h +++ b/trunk/include/linux/crypto.h @@ -229,6 +229,8 @@ struct crypto_tfm { } crt_u; struct crypto_alg *__crt_alg; + + char __crt_ctx[] __attribute__ ((__aligned__)); }; /* @@ -301,7 +303,13 @@ static inline unsigned int crypto_tfm_alg_alignmask(struct crypto_tfm *tfm) static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm) { - return (void *)&tfm[1]; + return tfm->__crt_ctx; +} + +static inline unsigned int crypto_tfm_ctx_alignment(void) +{ + struct crypto_tfm *tfm; + return __alignof__(tfm->__crt_ctx); } /*