linux/lib/crc32.c
<<
>>
Prefs
   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/crc32.txt for a description of algorithms */
  28
  29#include <linux/crc32.h>
  30#include <linux/module.h>
  31#include <linux/types.h>
  32#include "crc32defs.h"
  33
  34#if CRC_LE_BITS > 8
  35# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
  36#else
  37# define tole(x) (x)
  38#endif
  39
  40#if CRC_BE_BITS > 8
  41# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
  42#else
  43# define tobe(x) (x)
  44#endif
  45
  46#include "crc32table.h"
  47
  48MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
  49MODULE_DESCRIPTION("Various CRC32 calculations");
  50MODULE_LICENSE("GPL");
  51
  52#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
  53
  54/* implements slicing-by-4 or slicing-by-8 algorithm */
  55static inline u32
  56crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
  57{
  58# ifdef __LITTLE_ENDIAN
  59#  define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
  60#  define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
  61                   t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
  62#  define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
  63                   t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
  64# else
  65#  define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
  66#  define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
  67                   t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
  68#  define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
  69                   t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
  70# endif
  71        const u32 *b;
  72        size_t    rem_len;
  73# ifdef CONFIG_X86
  74        size_t i;
  75# endif
  76        const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
  77# if CRC_LE_BITS != 32
  78        const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
  79# endif
  80        u32 q;
  81
  82        /* Align it */
  83        if (unlikely((long)buf & 3 && len)) {
  84                do {
  85                        DO_CRC(*buf++);
  86                } while ((--len) && ((long)buf)&3);
  87        }
  88
  89# if CRC_LE_BITS == 32
  90        rem_len = len & 3;
  91        len = len >> 2;
  92# else
  93        rem_len = len & 7;
  94        len = len >> 3;
  95# endif
  96
  97        b = (const u32 *)buf;
  98# ifdef CONFIG_X86
  99        --b;
 100        for (i = 0; i < len; i++) {
 101# else
 102        for (--b; len; --len) {
 103# endif
 104                q = crc ^ *++b; /* use pre increment for speed */
 105# if CRC_LE_BITS == 32
 106                crc = DO_CRC4;
 107# else
 108                crc = DO_CRC8;
 109                q = *++b;
 110                crc ^= DO_CRC4;
 111# endif
 112        }
 113        len = rem_len;
 114        /* And the last few bytes */
 115        if (len) {
 116                u8 *p = (u8 *)(b + 1) - 1;
 117# ifdef CONFIG_X86
 118                for (i = 0; i < len; i++)
 119                        DO_CRC(*++p); /* use pre increment for speed */
 120# else
 121                do {
 122                        DO_CRC(*++p); /* use pre increment for speed */
 123                } while (--len);
 124# endif
 125        }
 126        return crc;
 127#undef DO_CRC
 128#undef DO_CRC4
 129#undef DO_CRC8
 130}
 131#endif
 132
 133/**
 134 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
 135 * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
 136 *      other uses, or the previous crc32 value if computing incrementally.
 137 * @p: pointer to buffer over which CRC is run
 138 * @len: length of buffer @p
 139 */
 140static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
 141                                          size_t len, const u32 (*tab)[256],
 142                                          u32 polynomial)
 143{
 144#if CRC_LE_BITS == 1
 145        int i;
 146        while (len--) {
 147                crc ^= *p++;
 148                for (i = 0; i < 8; i++)
 149                        crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
 150        }
 151# elif CRC_LE_BITS == 2
 152        while (len--) {
 153                crc ^= *p++;
 154                crc = (crc >> 2) ^ tab[0][crc & 3];
 155                crc = (crc >> 2) ^ tab[0][crc & 3];
 156                crc = (crc >> 2) ^ tab[0][crc & 3];
 157                crc = (crc >> 2) ^ tab[0][crc & 3];
 158        }
 159# elif CRC_LE_BITS == 4
 160        while (len--) {
 161                crc ^= *p++;
 162                crc = (crc >> 4) ^ tab[0][crc & 15];
 163                crc = (crc >> 4) ^ tab[0][crc & 15];
 164        }
 165# elif CRC_LE_BITS == 8
 166        /* aka Sarwate algorithm */
 167        while (len--) {
 168                crc ^= *p++;
 169                crc = (crc >> 8) ^ tab[0][crc & 255];
 170        }
 171# else
 172        crc = (__force u32) __cpu_to_le32(crc);
 173        crc = crc32_body(crc, p, len, tab);
 174        crc = __le32_to_cpu((__force __le32)crc);
 175#endif
 176        return crc;
 177}
 178
 179#if CRC_LE_BITS == 1
 180u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
 181{
 182        return crc32_le_generic(crc, p, len, NULL, CRCPOLY_LE);
 183}
 184u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
 185{
 186        return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
 187}
 188#else
 189u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
 190{
 191        return crc32_le_generic(crc, p, len,
 192                        (const u32 (*)[256])crc32table_le, CRCPOLY_LE);
 193}
 194u32 __pure __crc32c_le(u32 crc, unsigned char const *p, size_t len)
 195{
 196        return crc32_le_generic(crc, p, len,
 197                        (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
 198}
 199#endif
 200EXPORT_SYMBOL(crc32_le);
 201EXPORT_SYMBOL(__crc32c_le);
 202
 203/**
 204 * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
 205 * @crc: seed value for computation.  ~0 for Ethernet, sometimes 0 for
 206 *      other uses, or the previous crc32 value if computing incrementally.
 207 * @p: pointer to buffer over which CRC is run
 208 * @len: length of buffer @p
 209 */
 210static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
 211                                          size_t len, const u32 (*tab)[256],
 212                                          u32 polynomial)
 213{
 214#if CRC_BE_BITS == 1
 215        int i;
 216        while (len--) {
 217                crc ^= *p++ << 24;
 218                for (i = 0; i < 8; i++)
 219                        crc =
 220                            (crc << 1) ^ ((crc & 0x80000000) ? polynomial :
 221                                          0);
 222        }
 223# elif CRC_BE_BITS == 2
 224        while (len--) {
 225                crc ^= *p++ << 24;
 226                crc = (crc << 2) ^ tab[0][crc >> 30];
 227                crc = (crc << 2) ^ tab[0][crc >> 30];
 228                crc = (crc << 2) ^ tab[0][crc >> 30];
 229                crc = (crc << 2) ^ tab[0][crc >> 30];
 230        }
 231# elif CRC_BE_BITS == 4
 232        while (len--) {
 233                crc ^= *p++ << 24;
 234                crc = (crc << 4) ^ tab[0][crc >> 28];
 235                crc = (crc << 4) ^ tab[0][crc >> 28];
 236        }
 237# elif CRC_BE_BITS == 8
 238        while (len--) {
 239                crc ^= *p++ << 24;
 240                crc = (crc << 8) ^ tab[0][crc >> 24];
 241        }
 242# else
 243        crc = (__force u32) __cpu_to_be32(crc);
 244        crc = crc32_body(crc, p, len, tab);
 245        crc = __be32_to_cpu((__force __be32)crc);
 246# endif
 247        return crc;
 248}
 249
 250#if CRC_LE_BITS == 1
 251u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
 252{
 253        return crc32_be_generic(crc, p, len, NULL, CRCPOLY_BE);
 254}
 255#else
 256u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
 257{
 258        return crc32_be_generic(crc, p, len,
 259                        (const u32 (*)[256])crc32table_be, CRCPOLY_BE);
 260}
 261#endif
 262EXPORT_SYMBOL(crc32_be);
 263
 264#ifdef CONFIG_CRC32_SELFTEST
 265
 266/* 4096 random bytes */
 267static u8 __attribute__((__aligned__(8))) test_buf[] =
 268{
 269        0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
 270        0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
 271        0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
 272        0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
 273        0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
 274        0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
 275        0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
 276        0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
 277        0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
 278        0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
 279        0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
 280        0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
 281        0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
 282        0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
 283        0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
 284        0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
 285        0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
 286        0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
 287        0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
 288        0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
 289        0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
 290        0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
 291        0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
 292        0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
 293        0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
 294        0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
 295        0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
 296        0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
 297        0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
 298        0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
 299        0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
 300        0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
 301        0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
 302        0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
 303        0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
 304        0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
 305        0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
 306        0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
 307        0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
 308        0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
 309        0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
 310        0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
 311        0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
 312        0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
 313        0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
 314        0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
 315        0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
 316        0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
 317        0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
 318        0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
 319        0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
 320        0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
 321        0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
 322        0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
 323        0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
 324        0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
 325        0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
 326        0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
 327        0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
 328        0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
 329        0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
 330        0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
 331        0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
 332        0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
 333        0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
 334        0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
 335        0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
 336        0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
 337        0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
 338        0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
 339        0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
 340        0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
 341        0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
 342        0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
 343        0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
 344        0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
 345        0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
 346        0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
 347        0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
 348        0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
 349        0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
 350        0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
 351        0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
 352        0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
 353        0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
 354        0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
 355        0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
 356        0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
 357        0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
 358        0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
 359        0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
 360        0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
 361        0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
 362        0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
 363        0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
 364        0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
 365        0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
 366        0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
 367        0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
 368        0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
 369        0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
 370        0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
 371        0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
 372        0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
 373        0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
 374        0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
 375        0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
 376        0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
 377        0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
 378        0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
 379        0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
 380        0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
 381        0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
 382        0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
 383        0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
 384        0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
 385        0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
 386        0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
 387        0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
 388        0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
 389        0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
 390        0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
 391        0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
 392        0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
 393        0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
 394        0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
 395        0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
 396        0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
 397        0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
 398        0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
 399        0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
 400        0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
 401        0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
 402        0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
 403        0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
 404        0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
 405        0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
 406        0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
 407        0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
 408        0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
 409        0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
 410        0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
 411        0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
 412        0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
 413        0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
 414        0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
 415        0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
 416        0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
 417        0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
 418        0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
 419        0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
 420        0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
 421        0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
 422        0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
 423        0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
 424        0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
 425        0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
 426        0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
 427        0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
 428        0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
 429        0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
 430        0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
 431        0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
 432        0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
 433        0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
 434        0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
 435        0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
 436        0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
 437        0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
 438        0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
 439        0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
 440        0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
 441        0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
 442        0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
 443        0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
 444        0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
 445        0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
 446        0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
 447        0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
 448        0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
 449        0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
 450        0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
 451        0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
 452        0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
 453        0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
 454        0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
 455        0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
 456        0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
 457        0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
 458        0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
 459        0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
 460        0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
 461        0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
 462        0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
 463        0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
 464        0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
 465        0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
 466        0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
 467        0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
 468        0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
 469        0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
 470        0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
 471        0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
 472        0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
 473        0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
 474        0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
 475        0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
 476        0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
 477        0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
 478        0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
 479        0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
 480        0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
 481        0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
 482        0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
 483        0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
 484        0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
 485        0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
 486        0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
 487        0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
 488        0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
 489        0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
 490        0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
 491        0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
 492        0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
 493        0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
 494        0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
 495        0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
 496        0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
 497        0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
 498        0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
 499        0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
 500        0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
 501        0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
 502        0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
 503        0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
 504        0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
 505        0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
 506        0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
 507        0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
 508        0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
 509        0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
 510        0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
 511        0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
 512        0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
 513        0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
 514        0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
 515        0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
 516        0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
 517        0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
 518        0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
 519        0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
 520        0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
 521        0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
 522        0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
 523        0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
 524        0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
 525        0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
 526        0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
 527        0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
 528        0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
 529        0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
 530        0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
 531        0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
 532        0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
 533        0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
 534        0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
 535        0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
 536        0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
 537        0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
 538        0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
 539        0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
 540        0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
 541        0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
 542        0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
 543        0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
 544        0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
 545        0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
 546        0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
 547        0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
 548        0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
 549        0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
 550        0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
 551        0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
 552        0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
 553        0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
 554        0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
 555        0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
 556        0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
 557        0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
 558        0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
 559        0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
 560        0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
 561        0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
 562        0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
 563        0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
 564        0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
 565        0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
 566        0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
 567        0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
 568        0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
 569        0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
 570        0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
 571        0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
 572        0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
 573        0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
 574        0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
 575        0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
 576        0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
 577        0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
 578        0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
 579        0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
 580        0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
 581        0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
 582        0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
 583        0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
 584        0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
 585        0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
 586        0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
 587        0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
 588        0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
 589        0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
 590        0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
 591        0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
 592        0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
 593        0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
 594        0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
 595        0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
 596        0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
 597        0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
 598        0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
 599        0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
 600        0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
 601        0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
 602        0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
 603        0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
 604        0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
 605        0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
 606        0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
 607        0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
 608        0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
 609        0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
 610        0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
 611        0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
 612        0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
 613        0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
 614        0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
 615        0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
 616        0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
 617        0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
 618        0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
 619        0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
 620        0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
 621        0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
 622        0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
 623        0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
 624        0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
 625        0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
 626        0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
 627        0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
 628        0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
 629        0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
 630        0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
 631        0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
 632        0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
 633        0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
 634        0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
 635        0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
 636        0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
 637        0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
 638        0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
 639        0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
 640        0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
 641        0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
 642        0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
 643        0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
 644        0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
 645        0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
 646        0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
 647        0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
 648        0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
 649        0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
 650        0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
 651        0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
 652        0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
 653        0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
 654        0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
 655        0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
 656        0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
 657        0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
 658        0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
 659        0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
 660        0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
 661        0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
 662        0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
 663        0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
 664        0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
 665        0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
 666        0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
 667        0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
 668        0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
 669        0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
 670        0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
 671        0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
 672        0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
 673        0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
 674        0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
 675        0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
 676        0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
 677        0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
 678        0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
 679        0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
 680        0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
 681        0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
 682        0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
 683        0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
 684        0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
 685        0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
 686        0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
 687        0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
 688        0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
 689        0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
 690        0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
 691        0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
 692        0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
 693        0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
 694        0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
 695        0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
 696        0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
 697        0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
 698        0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
 699        0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
 700        0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
 701        0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
 702        0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
 703        0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
 704        0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
 705        0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
 706        0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
 707        0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
 708        0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
 709        0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
 710        0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
 711        0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
 712        0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
 713        0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
 714        0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
 715        0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
 716        0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
 717        0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
 718        0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
 719        0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
 720        0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
 721        0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
 722        0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
 723        0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
 724        0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
 725        0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
 726        0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
 727        0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
 728        0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
 729        0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
 730        0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
 731        0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
 732        0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
 733        0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
 734        0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
 735        0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
 736        0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
 737        0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
 738        0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
 739        0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
 740        0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
 741        0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
 742        0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
 743        0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
 744        0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
 745        0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
 746        0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
 747        0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
 748        0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
 749        0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
 750        0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
 751        0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
 752        0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
 753        0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
 754        0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
 755        0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
 756        0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
 757        0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
 758        0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
 759        0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
 760        0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
 761        0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
 762        0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
 763        0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
 764        0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
 765        0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
 766        0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
 767        0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
 768        0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
 769        0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
 770        0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
 771        0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
 772        0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
 773        0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
 774        0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
 775        0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
 776        0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
 777        0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
 778        0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
 779        0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
 780        0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
 781};
 782
 783/* 100 test cases */
 784static struct crc_test {
 785        u32 crc;        /* random starting crc */
 786        u32 start;      /* random 6 bit offset in buf */
 787        u32 length;     /* random 11 bit length of test */
 788        u32 crc_le;     /* expected crc32_le result */
 789        u32 crc_be;     /* expected crc32_be result */
 790        u32 crc32c_le;  /* expected crc32c_le result */
 791} test[] =
 792{
 793        {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1,
 794         0xf6e93d6c},
 795        {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad,
 796         0x0fe92aca},
 797        {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f,
 798         0x52e1ebb8},
 799        {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a,
 800         0x0798af9a},
 801        {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2,
 802         0x18eb3152},
 803        {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793,
 804         0xd00d08c7},
 805        {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed,
 806         0x8ba966bc},
 807        {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35,
 808         0x11d694a2},
 809        {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2,
 810         0x6ab3208d},
 811        {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10,
 812         0xba4603c5},
 813        {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb,
 814         0xe6071c6f},
 815        {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0,
 816         0x179ec30a},
 817        {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb,
 818         0x0903beb8},
 819        {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed,
 820         0x6a7cb4fa},
 821        {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591,
 822         0xdb535801},
 823        {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67,
 824         0x92bed597},
 825        {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd,
 826         0x192a3f1b},
 827        {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a,
 828         0xccbaec1a},
 829        {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b,
 830         0x7eabae4d},
 831        {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f,
 832         0x28c72982},
 833        {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d,
 834         0xc3cd4d18},
 835        {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a,
 836         0xbca8f0e7},
 837        {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97,
 838         0x713f60b3},
 839        {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2,
 840         0xebd08fd5},
 841        {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138,
 842         0x64406c59},
 843        {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032,
 844         0x7421890e},
 845        {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f,
 846         0xe9347603},
 847        {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f,
 848         0x1bef9060},
 849        {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32,
 850         0x34720072},
 851        {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef,
 852         0x48310f59},
 853        {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0,
 854         0x783a4213},
 855        {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59,
 856         0x9e8efd41},
 857        {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4,
 858         0xfc3d34a5},
 859        {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c,
 860         0x17a52ae2},
 861        {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51,
 862         0x886d935a},
 863        {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11,
 864         0xeaaeaeb2},
 865        {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659,
 866         0x8e900a4b},
 867        {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af,
 868         0xd74662b1},
 869        {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99,
 870         0xd26752ba},
 871        {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b,
 872         0x8b1fcd62},
 873        {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521,
 874         0xf54342fe},
 875        {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3,
 876         0x5b95b988},
 877        {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d,
 878         0x2e1176be},
 879        {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f,
 880         0x66120546},
 881        {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b,
 882         0xf256a5cc},
 883        {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0,
 884         0x4af1dd69},
 885        {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195,
 886         0x56f0a04a},
 887        {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d,
 888         0x74f6b6b2},
 889        {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4,
 890         0x085951fd},
 891        {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3,
 892         0xc65387eb},
 893        {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643,
 894         0x1ca9257b},
 895        {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10,
 896         0xfd196d76},
 897        {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d,
 898         0x5ef88339},
 899        {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5,
 900         0x2c3714d9},
 901        {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b,
 902         0x58576548},
 903        {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee,
 904         0xfd7c57de},
 905        {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14,
 906         0xd5fedd59},
 907        {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a,
 908         0x1cc3b17b},
 909        {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b,
 910         0x270eed73},
 911        {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3,
 912         0x91ecbb11},
 913        {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826,
 914         0x05ed8d0c},
 915        {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06,
 916         0x0b09ad5b},
 917        {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35,
 918         0xf8d511fb},
 919        {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801,
 920         0x5ad832cc},
 921        {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2,
 922         0x1214d196},
 923        {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d,
 924         0x5747218a},
 925        {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c,
 926         0xde8f14de},
 927        {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba,
 928         0x3563b7b9},
 929        {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5,
 930         0x071475d0},
 931        {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b,
 932         0x54c79d60},
 933        {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178,
 934         0x4c53eee6},
 935        {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3,
 936         0x10137a3c},
 937        {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605,
 938         0xaa9d6c73},
 939        {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1,
 940         0xb63d23e7},
 941        {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9,
 942         0x7f53e9cf},
 943        {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78,
 944         0x13c1cd83},
 945        {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9,
 946         0x49ff5867},
 947        {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd,
 948         0x8467f211},
 949        {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab,
 950         0x3f9683b2},
 951        {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb,
 952         0x76a3f874},
 953        {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77,
 954         0x863b702f},
 955        {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da,
 956         0xdc6c58ff},
 957        {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39,
 958         0x0622cc95},
 959        {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16,
 960         0xe85605cd},
 961        {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208,
 962         0x31da5f06},
 963        {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e,
 964         0xa1f2e784},
 965        {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5,
 966         0xb07cc616},
 967        {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892,
 968         0xbf943b6c},
 969        {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db,
 970         0x2c01af1c},
 971        {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43,
 972         0x0fe5f56d},
 973        {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac,
 974         0xf8943b2d},
 975        {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7,
 976         0xe4d89272},
 977        {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2,
 978         0x7c2f6bbb},
 979        {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2,
 980         0xabbf388b},
 981        {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640,
 982         0x1dca1f4e},
 983        {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f,
 984         0x5c170e23},
 985        {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99,
 986         0xc0e9d672},
 987        {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7,
 988         0xc18bdc86},
 989        {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499,
 990         0xa874fcdd},
 991        {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a,
 992         0x9dc0bb48},
 993};
 994
 995#include <linux/time.h>
 996
 997static int __init crc32c_test(void)
 998{
 999        int i;
1000        int errors = 0;
1001        int bytes = 0;
1002        struct timespec start, stop;
1003        u64 nsec;
1004        unsigned long flags;
1005
1006        /* keep static to prevent cache warming code from
1007         * getting eliminated by the compiler */
1008        static u32 crc;
1009
1010        /* pre-warm the cache */
1011        for (i = 0; i < 100; i++) {
1012                bytes += 2*test[i].length;
1013
1014                crc ^= __crc32c_le(test[i].crc, test_buf +
1015                    test[i].start, test[i].length);
1016        }
1017
1018        /* reduce OS noise */
1019        local_irq_save(flags);
1020        local_irq_disable();
1021
1022        getnstimeofday(&start);
1023        for (i = 0; i < 100; i++) {
1024                if (test[i].crc32c_le != __crc32c_le(test[i].crc, test_buf +
1025                    test[i].start, test[i].length))
1026                        errors++;
1027        }
1028        getnstimeofday(&stop);
1029
1030        local_irq_restore(flags);
1031        local_irq_enable();
1032
1033        nsec = stop.tv_nsec - start.tv_nsec +
1034                1000000000 * (stop.tv_sec - start.tv_sec);
1035
1036        pr_info("crc32c: CRC_LE_BITS = %d\n", CRC_LE_BITS);
1037
1038        if (errors)
1039                pr_warn("crc32c: %d self tests failed\n", errors);
1040        else {
1041                pr_info("crc32c: self tests passed, processed %d bytes in %lld nsec\n",
1042                        bytes, nsec);
1043        }
1044
1045        return 0;
1046}
1047
1048static int __init crc32_test(void)
1049{
1050        int i;
1051        int errors = 0;
1052        int bytes = 0;
1053        struct timespec start, stop;
1054        u64 nsec;
1055        unsigned long flags;
1056
1057        /* keep static to prevent cache warming code from
1058         * getting eliminated by the compiler */
1059        static u32 crc;
1060
1061        /* pre-warm the cache */
1062        for (i = 0; i < 100; i++) {
1063                bytes += 2*test[i].length;
1064
1065                crc ^= crc32_le(test[i].crc, test_buf +
1066                    test[i].start, test[i].length);
1067
1068                crc ^= crc32_be(test[i].crc, test_buf +
1069                    test[i].start, test[i].length);
1070        }
1071
1072        /* reduce OS noise */
1073        local_irq_save(flags);
1074        local_irq_disable();
1075
1076        getnstimeofday(&start);
1077        for (i = 0; i < 100; i++) {
1078                if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
1079                    test[i].start, test[i].length))
1080                        errors++;
1081
1082                if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
1083                    test[i].start, test[i].length))
1084                        errors++;
1085        }
1086        getnstimeofday(&stop);
1087
1088        local_irq_restore(flags);
1089        local_irq_enable();
1090
1091        nsec = stop.tv_nsec - start.tv_nsec +
1092                1000000000 * (stop.tv_sec - start.tv_sec);
1093
1094        pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
1095                 CRC_LE_BITS, CRC_BE_BITS);
1096
1097        if (errors)
1098                pr_warn("crc32: %d self tests failed\n", errors);
1099        else {
1100                pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
1101                        bytes, nsec);
1102        }
1103
1104        return 0;
1105}
1106
1107static int __init crc32test_init(void)
1108{
1109        crc32_test();
1110        crc32c_test();
1111        return 0;
1112}
1113
1114static void __exit crc32_exit(void)
1115{
1116}
1117
1118module_init(crc32test_init);
1119module_exit(crc32_exit);
1120#endif /* CONFIG_CRC32_SELFTEST */
1121