mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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:
		
							parent
							
								
									cbbac1c3e6
								
							
						
					
					
						commit
						9784d82db3
					
				
					 1 changed files with 7 additions and 4 deletions
				
			
		
							
								
								
									
										11
									
								
								lib/crc32.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								lib/crc32.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -183,21 +183,21 @@ static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
#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);
 | 
			
		||||
}
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
#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,
 | 
			
		||||
			(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,
 | 
			
		||||
			(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(__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 follows the "little-endian" CRC convention that the lsbit
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue