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