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