forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib/crc32: remove other generic implementations
Now that we've standardized on the byte-by-byte implementation of CRC32 as the only generic implementation (see previous commit for the rationale), remove the code for the other implementations. Tested with crc_kunit. Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Ard Biesheuvel <[email protected]> Reviewed-by: Martin K. Petersen <[email protected]> Signed-off-by: Eric Biggers <[email protected]>
- Loading branch information
Showing
4 changed files
with
40 additions
and
361 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,178 +30,27 @@ | |
#include <linux/crc32poly.h> | ||
#include <linux/module.h> | ||
#include <linux/types.h> | ||
#include <linux/sched.h> | ||
#include "crc32defs.h" | ||
|
||
#if CRC_LE_BITS > 8 | ||
# define tole(x) ((__force u32) cpu_to_le32(x)) | ||
#else | ||
# define tole(x) (x) | ||
#endif | ||
|
||
#if CRC_BE_BITS > 8 | ||
# define tobe(x) ((__force u32) cpu_to_be32(x)) | ||
#else | ||
# define tobe(x) (x) | ||
#endif | ||
|
||
#include "crc32table.h" | ||
|
||
MODULE_AUTHOR("Matt Domsch <[email protected]>"); | ||
MODULE_DESCRIPTION("Various CRC32 calculations"); | ||
MODULE_LICENSE("GPL"); | ||
|
||
#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8 | ||
|
||
/* implements slicing-by-4 or slicing-by-8 algorithm */ | ||
static inline u32 __pure | ||
crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256]) | ||
{ | ||
# ifdef __LITTLE_ENDIAN | ||
# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8) | ||
# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \ | ||
t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255]) | ||
# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \ | ||
t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255]) | ||
# else | ||
# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) | ||
# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \ | ||
t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255]) | ||
# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \ | ||
t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255]) | ||
# endif | ||
const u32 *b; | ||
size_t rem_len; | ||
# ifdef CONFIG_X86 | ||
size_t i; | ||
# endif | ||
const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3]; | ||
# if CRC_LE_BITS != 32 | ||
const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7]; | ||
# endif | ||
u32 q; | ||
|
||
/* Align it */ | ||
if (unlikely((long)buf & 3 && len)) { | ||
do { | ||
DO_CRC(*buf++); | ||
} while ((--len) && ((long)buf)&3); | ||
} | ||
|
||
# if CRC_LE_BITS == 32 | ||
rem_len = len & 3; | ||
len = len >> 2; | ||
# else | ||
rem_len = len & 7; | ||
len = len >> 3; | ||
# endif | ||
|
||
b = (const u32 *)buf; | ||
# ifdef CONFIG_X86 | ||
--b; | ||
for (i = 0; i < len; i++) { | ||
# else | ||
for (--b; len; --len) { | ||
# endif | ||
q = crc ^ *++b; /* use pre increment for speed */ | ||
# if CRC_LE_BITS == 32 | ||
crc = DO_CRC4; | ||
# else | ||
crc = DO_CRC8; | ||
q = *++b; | ||
crc ^= DO_CRC4; | ||
# endif | ||
} | ||
len = rem_len; | ||
/* And the last few bytes */ | ||
if (len) { | ||
u8 *p = (u8 *)(b + 1) - 1; | ||
# ifdef CONFIG_X86 | ||
for (i = 0; i < len; i++) | ||
DO_CRC(*++p); /* use pre increment for speed */ | ||
# else | ||
do { | ||
DO_CRC(*++p); /* use pre increment for speed */ | ||
} while (--len); | ||
# endif | ||
} | ||
return crc; | ||
#undef DO_CRC | ||
#undef DO_CRC4 | ||
#undef DO_CRC8 | ||
} | ||
#endif | ||
|
||
|
||
/** | ||
* crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II | ||
* CRC32/CRC32C | ||
* @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for other | ||
* uses, or the previous crc32/crc32c value if computing incrementally. | ||
* @p: pointer to buffer over which CRC32/CRC32C is run | ||
* @len: length of buffer @p | ||
* @tab: little-endian Ethernet table | ||
* @polynomial: CRC32/CRC32c LE polynomial | ||
*/ | ||
static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p, | ||
size_t len, const u32 (*tab)[256], | ||
u32 polynomial) | ||
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
#if CRC_LE_BITS == 1 | ||
int i; | ||
while (len--) { | ||
crc ^= *p++; | ||
for (i = 0; i < 8; i++) | ||
crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0); | ||
} | ||
# elif CRC_LE_BITS == 2 | ||
while (len--) { | ||
crc ^= *p++; | ||
crc = (crc >> 2) ^ tab[0][crc & 3]; | ||
crc = (crc >> 2) ^ tab[0][crc & 3]; | ||
crc = (crc >> 2) ^ tab[0][crc & 3]; | ||
crc = (crc >> 2) ^ tab[0][crc & 3]; | ||
} | ||
# elif CRC_LE_BITS == 4 | ||
while (len--) { | ||
crc ^= *p++; | ||
crc = (crc >> 4) ^ tab[0][crc & 15]; | ||
crc = (crc >> 4) ^ tab[0][crc & 15]; | ||
} | ||
# elif CRC_LE_BITS == 8 | ||
/* aka Sarwate algorithm */ | ||
while (len--) { | ||
crc ^= *p++; | ||
crc = (crc >> 8) ^ tab[0][crc & 255]; | ||
} | ||
# else | ||
crc = (__force u32) __cpu_to_le32(crc); | ||
crc = crc32_body(crc, p, len, tab); | ||
crc = __le32_to_cpu((__force __le32)crc); | ||
#endif | ||
while (len--) | ||
crc = (crc >> 8) ^ crc32table_le[(crc & 255) ^ *p++]; | ||
return crc; | ||
} | ||
EXPORT_SYMBOL(crc32_le_base); | ||
|
||
#if CRC_LE_BITS == 1 | ||
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE); | ||
} | ||
u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE); | ||
} | ||
#else | ||
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_le_generic(crc, p, len, crc32table_le, CRC32_POLY_LE); | ||
} | ||
u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE); | ||
while (len--) | ||
crc = (crc >> 8) ^ crc32ctable_le[(crc & 255) ^ *p++]; | ||
return crc; | ||
} | ||
#endif | ||
EXPORT_SYMBOL(crc32_le_base); | ||
EXPORT_SYMBOL(crc32c_le_base); | ||
|
||
/* | ||
|
@@ -277,64 +126,10 @@ u32 __attribute_const__ __crc32c_le_shift(u32 crc, size_t len) | |
EXPORT_SYMBOL(crc32_le_shift); | ||
EXPORT_SYMBOL(__crc32c_le_shift); | ||
|
||
/** | ||
* crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32 | ||
* @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for | ||
* other uses, or the previous crc32 value if computing incrementally. | ||
* @p: pointer to buffer over which CRC32 is run | ||
* @len: length of buffer @p | ||
* @tab: big-endian Ethernet table | ||
* @polynomial: CRC32 BE polynomial | ||
*/ | ||
static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p, | ||
size_t len, const u32 (*tab)[256], | ||
u32 polynomial) | ||
{ | ||
#if CRC_BE_BITS == 1 | ||
int i; | ||
while (len--) { | ||
crc ^= *p++ << 24; | ||
for (i = 0; i < 8; i++) | ||
crc = | ||
(crc << 1) ^ ((crc & 0x80000000) ? polynomial : | ||
0); | ||
} | ||
# elif CRC_BE_BITS == 2 | ||
while (len--) { | ||
crc ^= *p++ << 24; | ||
crc = (crc << 2) ^ tab[0][crc >> 30]; | ||
crc = (crc << 2) ^ tab[0][crc >> 30]; | ||
crc = (crc << 2) ^ tab[0][crc >> 30]; | ||
crc = (crc << 2) ^ tab[0][crc >> 30]; | ||
} | ||
# elif CRC_BE_BITS == 4 | ||
while (len--) { | ||
crc ^= *p++ << 24; | ||
crc = (crc << 4) ^ tab[0][crc >> 28]; | ||
crc = (crc << 4) ^ tab[0][crc >> 28]; | ||
} | ||
# elif CRC_BE_BITS == 8 | ||
while (len--) { | ||
crc ^= *p++ << 24; | ||
crc = (crc << 8) ^ tab[0][crc >> 24]; | ||
} | ||
# else | ||
crc = (__force u32) __cpu_to_be32(crc); | ||
crc = crc32_body(crc, p, len, tab); | ||
crc = __be32_to_cpu((__force __be32)crc); | ||
# endif | ||
return crc; | ||
} | ||
|
||
#if CRC_BE_BITS == 1 | ||
u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_be_generic(crc, p, len, NULL, CRC32_POLY_BE); | ||
} | ||
#else | ||
u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len) | ||
{ | ||
return crc32_be_generic(crc, p, len, crc32table_be, CRC32_POLY_BE); | ||
while (len--) | ||
crc = (crc << 8) ^ crc32table_be[(crc >> 24) ^ *p++]; | ||
return crc; | ||
} | ||
#endif | ||
EXPORT_SYMBOL(crc32_be_base); |
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.