lib/crc32: make core crc32() routines weak so they can be overridden

Allow architectures to drop in accelerated CRC32 routines by making
the crc32_le/__crc32c_le entry points weak, and exposing non-weak
aliases for them that may be used by the accelerated versions as
fallbacks in case the instructions they rely upon are not available.

Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
Ard Biesheuvel 2018-08-27 13:02:42 +02:00 committed by Catalin Marinas
parent cbbac1c3e6
commit 9784d82db3

View File

@ -183,21 +183,21 @@ static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
} }
#if CRC_LE_BITS == 1 #if CRC_LE_BITS == 1
u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) u32 __pure __weak crc32_le(u32 crc, unsigned char const *p, size_t len)
{ {
return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE); return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE);
} }
u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len) u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
{ {
return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE); return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
} }
#else #else
u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len) u32 __pure __weak crc32_le(u32 crc, unsigned char const *p, size_t len)
{ {
return crc32_le_generic(crc, p, len, return crc32_le_generic(crc, p, len,
(const u32 (*)[256])crc32table_le, CRC32_POLY_LE); (const u32 (*)[256])crc32table_le, CRC32_POLY_LE);
} }
u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len) u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
{ {
return crc32_le_generic(crc, p, len, return crc32_le_generic(crc, p, len,
(const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE); (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
@ -206,6 +206,9 @@ u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
EXPORT_SYMBOL(crc32_le); EXPORT_SYMBOL(crc32_le);
EXPORT_SYMBOL(__crc32c_le); EXPORT_SYMBOL(__crc32c_le);
u32 crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);
u32 __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);
/* /*
* This multiplies the polynomials x and y modulo the given modulus. * This multiplies the polynomials x and y modulo the given modulus.
* This follows the "little-endian" CRC convention that the lsbit * This follows the "little-endian" CRC convention that the lsbit