Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
crc32.c
Go to the documentation of this file.
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 <[email protected]>
7  * Nicer crc32 functions/docs submitted by [email protected]. 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 <[email protected]>
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 <[email protected]>");
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 
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
202 
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
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);
1021 
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);
1075 
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",
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 */