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