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

Archive Download this file



interactive