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