[CRYPTO] api: Align tfm context as wide as possible
Since tfm contexts can contain arbitrary types we should provide at least natural alignment (__attribute__ ((__aligned__))) for them. In particular, this is needed on the Xscale which is a 32-bit architecture with a u64 type that requires 64-bit alignment. This problem was reported by Ronen Shitrit. The crypto_tfm structure's size was 44 bytes on 32-bit architectures and 80 bytes on 64-bit architectures. So adding this requirement only means that we have to add an extra 4 bytes on 32-bit architectures. On i386 the natural alignment is 16 bytes which also benefits the VIA Padlock as it no longer has to manually align its context structure to 128 bits. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
a5f8c47305
commit
f10b7897ee
3 changed files with 15 additions and 3 deletions
|
@ -165,7 +165,7 @@ static unsigned int crypto_ctxsize(struct crypto_alg *alg, int flags)
|
||||||
break;
|
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)
|
struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags)
|
||||||
|
|
|
@ -284,7 +284,11 @@ aes_hw_extkey_available(uint8_t key_len)
|
||||||
|
|
||||||
static inline struct aes_ctx *aes_ctx(void *ctx)
|
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
|
static int
|
||||||
|
|
|
@ -229,6 +229,8 @@ struct crypto_tfm {
|
||||||
} crt_u;
|
} crt_u;
|
||||||
|
|
||||||
struct crypto_alg *__crt_alg;
|
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)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue