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