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