LCOV - code coverage report
Current view: top level - lib - crc32.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 52 0.0 %
Date: 2023-08-24 13:40:31 Functions: 0 8 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
       3             :  * cleaned up code to current version of sparse and added the slicing-by-8
       4             :  * algorithm to the closely similar existing slicing-by-4 algorithm.
       5             :  *
       6             :  * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
       7             :  * Nicer crc32 functions/docs submitted by linux@horizon.com.  Thanks!
       8             :  * Code was from the public domain, copyright abandoned.  Code was
       9             :  * subsequently included in the kernel, thus was re-licensed under the
      10             :  * GNU GPL v2.
      11             :  *
      12             :  * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
      13             :  * Same crc32 function was used in 5 other places in the kernel.
      14             :  * I made one version, and deleted the others.
      15             :  * There are various incantations of crc32().  Some use a seed of 0 or ~0.
      16             :  * Some xor at the end with ~0.  The generic crc32() function takes
      17             :  * seed as an argument, and doesn't xor at the end.  Then individual
      18             :  * users can do whatever they need.
      19             :  *   drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
      20             :  *   fs/jffs2 uses seed 0, doesn't xor with ~0.
      21             :  *   fs/partitions/efi.c uses seed ~0, xor's with ~0.
      22             :  *
      23             :  * This source code is licensed under the GNU General Public License,
      24             :  * Version 2.  See the file COPYING for more details.
      25             :  */
      26             : 
      27             : /* see: Documentation/staging/crc32.rst for a description of algorithms */
      28             : 
      29             : #include <linux/crc32.h>
      30             : #include <linux/crc32poly.h>
      31             : #include <linux/module.h>
      32             : #include <linux/types.h>
      33             : #include <linux/sched.h>
      34             : #include "crc32defs.h"
      35             : 
      36             : #if CRC_LE_BITS > 8
      37             : # define tole(x) ((__force u32) cpu_to_le32(x))
      38             : #else
      39             : # define tole(x) (x)
      40             : #endif
      41             : 
      42             : #if CRC_BE_BITS > 8
      43             : # define tobe(x) ((__force u32) cpu_to_be32(x))
      44             : #else
      45             : # define tobe(x) (x)
      46             : #endif
      47             : 
      48             : #include "crc32table.h"
      49             : 
      50             : MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
      51             : MODULE_DESCRIPTION("Various CRC32 calculations");
      52             : MODULE_LICENSE("GPL");
      53             : 
      54             : #if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
      55             : 
      56             : /* implements slicing-by-4 or slicing-by-8 algorithm */
      57             : static inline u32 __pure
      58           0 : crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
      59             : {
      60             : # ifdef __LITTLE_ENDIAN
      61             : #  define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
      62             : #  define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
      63             :                    t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
      64             : #  define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
      65             :                    t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
      66             : # else
      67             : #  define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
      68             : #  define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
      69             :                    t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
      70             : #  define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
      71             :                    t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
      72             : # endif
      73             :         const u32 *b;
      74             :         size_t    rem_len;
      75             : # ifdef CONFIG_X86
      76             :         size_t i;
      77             : # endif
      78           0 :         const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
      79             : # if CRC_LE_BITS != 32
      80           0 :         const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
      81             : # endif
      82             :         u32 q;
      83             : 
      84             :         /* Align it */
      85           0 :         if (unlikely((long)buf & 3 && len)) {
      86             :                 do {
      87           0 :                         DO_CRC(*buf++);
      88           0 :                 } while ((--len) && ((long)buf)&3);
      89             :         }
      90             : 
      91             : # if CRC_LE_BITS == 32
      92             :         rem_len = len & 3;
      93             :         len = len >> 2;
      94             : # else
      95           0 :         rem_len = len & 7;
      96           0 :         len = len >> 3;
      97             : # endif
      98             : 
      99           0 :         b = (const u32 *)buf;
     100             : # ifdef CONFIG_X86
     101             :         --b;
     102             :         for (i = 0; i < len; i++) {
     103             : # else
     104           0 :         for (--b; len; --len) {
     105             : # endif
     106           0 :                 q = crc ^ *++b; /* use pre increment for speed */
     107             : # if CRC_LE_BITS == 32
     108             :                 crc = DO_CRC4;
     109             : # else
     110           0 :                 crc = DO_CRC8;
     111           0 :                 q = *++b;
     112           0 :                 crc ^= DO_CRC4;
     113             : # endif
     114             :         }
     115           0 :         len = rem_len;
     116             :         /* And the last few bytes */
     117           0 :         if (len) {
     118           0 :                 u8 *p = (u8 *)(b + 1) - 1;
     119             : # ifdef CONFIG_X86
     120             :                 for (i = 0; i < len; i++)
     121             :                         DO_CRC(*++p); /* use pre increment for speed */
     122             : # else
     123             :                 do {
     124           0 :                         DO_CRC(*++p); /* use pre increment for speed */
     125           0 :                 } while (--len);
     126             : # endif
     127             :         }
     128           0 :         return crc;
     129             : #undef DO_CRC
     130             : #undef DO_CRC4
     131             : #undef DO_CRC8
     132             : }
     133             : #endif
     134             : 
     135             : 
     136             : /**
     137             :  * crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II
     138             :  *                      CRC32/CRC32C
     139             :  * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for other
     140             :  *       uses, or the previous crc32/crc32c value if computing incrementally.
     141             :  * @p: pointer to buffer over which CRC32/CRC32C is run
     142             :  * @len: length of buffer @p
     143             :  * @tab: little-endian Ethernet table
     144             :  * @polynomial: CRC32/CRC32c LE polynomial
     145             :  */
     146             : static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
     147             :                                           size_t len, const u32 (*tab)[256],
     148             :                                           u32 polynomial)
     149             : {
     150             : #if CRC_LE_BITS == 1
     151             :         int i;
     152             :         while (len--) {
     153             :                 crc ^= *p++;
     154             :                 for (i = 0; i < 8; i++)
     155             :                         crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
     156             :         }
     157             : # elif CRC_LE_BITS == 2
     158             :         while (len--) {
     159             :                 crc ^= *p++;
     160             :                 crc = (crc >> 2) ^ tab[0][crc & 3];
     161             :                 crc = (crc >> 2) ^ tab[0][crc & 3];
     162             :                 crc = (crc >> 2) ^ tab[0][crc & 3];
     163             :                 crc = (crc >> 2) ^ tab[0][crc & 3];
     164             :         }
     165             : # elif CRC_LE_BITS == 4
     166             :         while (len--) {
     167             :                 crc ^= *p++;
     168             :                 crc = (crc >> 4) ^ tab[0][crc & 15];
     169             :                 crc = (crc >> 4) ^ tab[0][crc & 15];
     170             :         }
     171             : # elif CRC_LE_BITS == 8
     172             :         /* aka Sarwate algorithm */
     173             :         while (len--) {
     174             :                 crc ^= *p++;
     175             :                 crc = (crc >> 8) ^ tab[0][crc & 255];
     176             :         }
     177             : # else
     178           0 :         crc = (__force u32) __cpu_to_le32(crc);
     179           0 :         crc = crc32_body(crc, p, len, tab);
     180           0 :         crc = __le32_to_cpu((__force __le32)crc);
     181             : #endif
     182             :         return crc;
     183             : }
     184             : 
     185             : #if CRC_LE_BITS == 1
     186             : u32 __pure __weak crc32_le(u32 crc, unsigned char const *p, size_t len)
     187             : {
     188             :         return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE);
     189             : }
     190             : u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
     191             : {
     192             :         return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
     193             : }
     194             : #else
     195           0 : u32 __pure __weak crc32_le(u32 crc, unsigned char const *p, size_t len)
     196             : {
     197           0 :         return crc32_le_generic(crc, p, len, crc32table_le, CRC32_POLY_LE);
     198             : }
     199           0 : u32 __pure __weak __crc32c_le(u32 crc, unsigned char const *p, size_t len)
     200             : {
     201           0 :         return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE);
     202             : }
     203             : #endif
     204             : EXPORT_SYMBOL(crc32_le);
     205             : EXPORT_SYMBOL(__crc32c_le);
     206             : 
     207             : u32 __pure crc32_le_base(u32, unsigned char const *, size_t) __alias(crc32_le);
     208             : u32 __pure __crc32c_le_base(u32, unsigned char const *, size_t) __alias(__crc32c_le);
     209             : u32 __pure crc32_be_base(u32, unsigned char const *, size_t) __alias(crc32_be);
     210             : 
     211             : /*
     212             :  * This multiplies the polynomials x and y modulo the given modulus.
     213             :  * This follows the "little-endian" CRC convention that the lsbit
     214             :  * represents the highest power of x, and the msbit represents x^0.
     215             :  */
     216             : static u32 __attribute_const__ gf2_multiply(u32 x, u32 y, u32 modulus)
     217             : {
     218           0 :         u32 product = x & 1 ? y : 0;
     219             :         int i;
     220             : 
     221           0 :         for (i = 0; i < 31; i++) {
     222           0 :                 product = (product >> 1) ^ (product & 1 ? modulus : 0);
     223           0 :                 x >>= 1;
     224           0 :                 product ^= x & 1 ? y : 0;
     225             :         }
     226             : 
     227             :         return product;
     228             : }
     229             : 
     230             : /**
     231             :  * crc32_generic_shift - Append @len 0 bytes to crc, in logarithmic time
     232             :  * @crc: The original little-endian CRC (i.e. lsbit is x^31 coefficient)
     233             :  * @len: The number of bytes. @crc is multiplied by x^(8*@len)
     234             :  * @polynomial: The modulus used to reduce the result to 32 bits.
     235             :  *
     236             :  * It's possible to parallelize CRC computations by computing a CRC
     237             :  * over separate ranges of a buffer, then summing them.
     238             :  * This shifts the given CRC by 8*len bits (i.e. produces the same effect
     239             :  * as appending len bytes of zero to the data), in time proportional
     240             :  * to log(len).
     241             :  */
     242           0 : static u32 __attribute_const__ crc32_generic_shift(u32 crc, size_t len,
     243             :                                                    u32 polynomial)
     244             : {
     245           0 :         u32 power = polynomial; /* CRC of x^32 */
     246             :         int i;
     247             : 
     248             :         /* Shift up to 32 bits in the simple linear way */
     249           0 :         for (i = 0; i < 8 * (int)(len & 3); i++)
     250           0 :                 crc = (crc >> 1) ^ (crc & 1 ? polynomial : 0);
     251             : 
     252           0 :         len >>= 2;
     253           0 :         if (!len)
     254             :                 return crc;
     255             : 
     256             :         for (;;) {
     257             :                 /* "power" is x^(2^i), modulo the polynomial */
     258           0 :                 if (len & 1)
     259             :                         crc = gf2_multiply(crc, power, polynomial);
     260             : 
     261           0 :                 len >>= 1;
     262           0 :                 if (!len)
     263             :                         break;
     264             : 
     265             :                 /* Square power, advancing to x^(2^(i+1)) */
     266             :                 power = gf2_multiply(power, power, polynomial);
     267             :         }
     268             : 
     269             :         return crc;
     270             : }
     271             : 
     272           0 : u32 __attribute_const__ crc32_le_shift(u32 crc, size_t len)
     273             : {
     274           0 :         return crc32_generic_shift(crc, len, CRC32_POLY_LE);
     275             : }
     276             : 
     277           0 : u32 __attribute_const__ __crc32c_le_shift(u32 crc, size_t len)
     278             : {
     279           0 :         return crc32_generic_shift(crc, len, CRC32C_POLY_LE);
     280             : }
     281             : EXPORT_SYMBOL(crc32_le_shift);
     282             : EXPORT_SYMBOL(__crc32c_le_shift);
     283             : 
     284             : /**
     285             :  * crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
     286             :  * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
     287             :  *      other uses, or the previous crc32 value if computing incrementally.
     288             :  * @p: pointer to buffer over which CRC32 is run
     289             :  * @len: length of buffer @p
     290             :  * @tab: big-endian Ethernet table
     291             :  * @polynomial: CRC32 BE polynomial
     292             :  */
     293           0 : static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
     294             :                                           size_t len, const u32 (*tab)[256],
     295             :                                           u32 polynomial)
     296             : {
     297             : #if CRC_BE_BITS == 1
     298             :         int i;
     299             :         while (len--) {
     300             :                 crc ^= *p++ << 24;
     301             :                 for (i = 0; i < 8; i++)
     302             :                         crc =
     303             :                             (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
     304             :                                           0);
     305             :         }
     306             : # elif CRC_BE_BITS == 2
     307             :         while (len--) {
     308             :                 crc ^= *p++ << 24;
     309             :                 crc = (crc << 2) ^ tab[0][crc >> 30];
     310             :                 crc = (crc << 2) ^ tab[0][crc >> 30];
     311             :                 crc = (crc << 2) ^ tab[0][crc >> 30];
     312             :                 crc = (crc << 2) ^ tab[0][crc >> 30];
     313             :         }
     314             : # elif CRC_BE_BITS == 4
     315             :         while (len--) {
     316             :                 crc ^= *p++ << 24;
     317             :                 crc = (crc << 4) ^ tab[0][crc >> 28];
     318             :                 crc = (crc << 4) ^ tab[0][crc >> 28];
     319             :         }
     320             : # elif CRC_BE_BITS == 8
     321             :         while (len--) {
     322             :                 crc ^= *p++ << 24;
     323             :                 crc = (crc << 8) ^ tab[0][crc >> 24];
     324             :         }
     325             : # else
     326           0 :         crc = (__force u32) __cpu_to_be32(crc);
     327           0 :         crc = crc32_body(crc, p, len, tab);
     328           0 :         crc = __be32_to_cpu((__force __be32)crc);
     329             : # endif
     330           0 :         return crc;
     331             : }
     332             : 
     333             : #if CRC_BE_BITS == 1
     334             : u32 __pure __weak crc32_be(u32 crc, unsigned char const *p, size_t len)
     335             : {
     336             :         return crc32_be_generic(crc, p, len, NULL, CRC32_POLY_BE);
     337             : }
     338             : #else
     339           0 : u32 __pure __weak crc32_be(u32 crc, unsigned char const *p, size_t len)
     340             : {
     341           0 :         return crc32_be_generic(crc, p, len, crc32table_be, CRC32_POLY_BE);
     342             : }
     343             : #endif
     344             : EXPORT_SYMBOL(crc32_be);

Generated by: LCOV version 1.14