crc32: add slice-by-8 algorithm to existing code
[linux-block.git] / lib / crc32.c
CommitLineData
1da177e4
LT
1/*
2 * Oct 15, 2000 Matt Domsch <Matt_Domsch@dell.com>
3 * Nicer crc32 functions/docs submitted by linux@horizon.com. Thanks!
4 * Code was from the public domain, copyright abandoned. Code was
5 * subsequently included in the kernel, thus was re-licensed under the
6 * GNU GPL v2.
7 *
8 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
9 * Same crc32 function was used in 5 other places in the kernel.
10 * I made one version, and deleted the others.
11 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
12 * Some xor at the end with ~0. The generic crc32() function takes
13 * seed as an argument, and doesn't xor at the end. Then individual
14 * users can do whatever they need.
15 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
16 * fs/jffs2 uses seed 0, doesn't xor with ~0.
17 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
18 *
19 * This source code is licensed under the GNU General Public License,
20 * Version 2. See the file COPYING for more details.
21 */
22
fbedceb1
BP
23/* see: Documentation/crc32.txt for a description of algorithms */
24
1da177e4 25#include <linux/crc32.h>
1da177e4 26#include <linux/module.h>
1da177e4 27#include <linux/types.h>
1da177e4 28#include "crc32defs.h"
60e58d5c 29
9a1dbf6a 30#if CRC_LE_BITS > 8
ce4320dd 31# define tole(x) ((__force u32) __constant_cpu_to_le32(x))
1da177e4 32#else
4f2a9463
JT
33# define tole(x) (x)
34#endif
35
9a1dbf6a 36#if CRC_BE_BITS > 8
ce4320dd 37# define tobe(x) ((__force u32) __constant_cpu_to_be32(x))
4f2a9463
JT
38#else
39# define tobe(x) (x)
1da177e4 40#endif
60e58d5c 41
1da177e4
LT
42#include "crc32table.h"
43
44MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
45MODULE_DESCRIPTION("Ethernet CRC32 calculations");
46MODULE_LICENSE("GPL");
47
9a1dbf6a 48#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
ddcaccbc 49
324eb0f1 50/* implements slicing-by-4 or slicing-by-8 algorithm */
ddcaccbc 51static inline u32
836e2af9 52crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
ddcaccbc 53{
0d2daf5c 54# ifdef __LITTLE_ENDIAN
5742332d 55# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
324eb0f1
BP
56# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
57 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
58# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
59 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
ddcaccbc 60# else
5742332d 61# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
324eb0f1
BP
62# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
63 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
64# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
65 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
ddcaccbc 66# endif
4f2a9463 67 const u32 *b;
ddcaccbc 68 size_t rem_len;
5742332d 69 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
324eb0f1
BP
70 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
71 u32 q;
ddcaccbc
JT
72
73 /* Align it */
4f2a9463 74 if (unlikely((long)buf & 3 && len)) {
ddcaccbc 75 do {
4f2a9463
JT
76 DO_CRC(*buf++);
77 } while ((--len) && ((long)buf)&3);
ddcaccbc 78 }
324eb0f1
BP
79
80# if CRC_LE_BITS == 32
ddcaccbc 81 rem_len = len & 3;
ddcaccbc 82 len = len >> 2;
324eb0f1
BP
83# else
84 rem_len = len & 7;
85 len = len >> 3;
86# endif
87
4f2a9463 88 b = (const u32 *)buf;
ddcaccbc 89 for (--b; len; --len) {
324eb0f1
BP
90 q = crc ^ *++b; /* use pre increment for speed */
91# if CRC_LE_BITS == 32
92 crc = DO_CRC4;
93# else
94 crc = DO_CRC8;
95 q = *++b;
96 crc ^= DO_CRC4;
97# endif
ddcaccbc
JT
98 }
99 len = rem_len;
100 /* And the last few bytes */
101 if (len) {
102 u8 *p = (u8 *)(b + 1) - 1;
103 do {
104 DO_CRC(*++p); /* use pre increment for speed */
105 } while (--len);
106 }
107 return crc;
4f2a9463 108#undef DO_CRC
836e2af9 109#undef DO_CRC4
324eb0f1 110#undef DO_CRC8
ddcaccbc
JT
111}
112#endif
60e58d5c 113
2f72100c
RD
114/**
115 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
116 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
117 * other uses, or the previous crc32 value if computing incrementally.
118 * @p: pointer to buffer over which CRC is run
119 * @len: length of buffer @p
120 */
e8c44319 121u32 __pure crc32_le(u32 crc, unsigned char const *p, size_t len)
1da177e4 122{
60e58d5c 123#if CRC_LE_BITS == 1
1da177e4
LT
124 int i;
125 while (len--) {
126 crc ^= *p++;
127 for (i = 0; i < 8; i++)
128 crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
129 }
60e58d5c 130# elif CRC_LE_BITS == 2
1da177e4
LT
131 while (len--) {
132 crc ^= *p++;
60e58d5c
BP
133 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
134 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
135 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
136 crc = (crc >> 2) ^ crc32table_le[0][crc & 3];
1da177e4 137 }
60e58d5c 138# elif CRC_LE_BITS == 4
1da177e4
LT
139 while (len--) {
140 crc ^= *p++;
60e58d5c
BP
141 crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
142 crc = (crc >> 4) ^ crc32table_le[0][crc & 15];
1da177e4 143 }
60e58d5c 144# elif CRC_LE_BITS == 8
9a1dbf6a
BP
145 /* aka Sarwate algorithm */
146 while (len--) {
147 crc ^= *p++;
148 crc = (crc >> 8) ^ crc32table_le[0][crc & 255];
149 }
150# else
60e58d5c
BP
151 const u32 (*tab)[] = crc32table_le;
152
ce4320dd 153 crc = (__force u32) __cpu_to_le32(crc);
60e58d5c 154 crc = crc32_body(crc, p, len, tab);
ce4320dd 155 crc = __le32_to_cpu((__force __le32)crc);
60e58d5c 156#endif
1da177e4 157 return crc;
1da177e4 158}
60e58d5c 159EXPORT_SYMBOL(crc32_le);
1da177e4 160
2f72100c
RD
161/**
162 * crc32_be() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
163 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
164 * other uses, or the previous crc32 value if computing incrementally.
165 * @p: pointer to buffer over which CRC is run
166 * @len: length of buffer @p
167 */
e8c44319 168u32 __pure crc32_be(u32 crc, unsigned char const *p, size_t len)
1da177e4 169{
60e58d5c 170#if CRC_BE_BITS == 1
1da177e4
LT
171 int i;
172 while (len--) {
173 crc ^= *p++ << 24;
174 for (i = 0; i < 8; i++)
175 crc =
176 (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE :
177 0);
178 }
60e58d5c 179# elif CRC_BE_BITS == 2
1da177e4
LT
180 while (len--) {
181 crc ^= *p++ << 24;
60e58d5c
BP
182 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
183 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
184 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
185 crc = (crc << 2) ^ crc32table_be[0][crc >> 30];
1da177e4 186 }
60e58d5c 187# elif CRC_BE_BITS == 4
1da177e4
LT
188 while (len--) {
189 crc ^= *p++ << 24;
60e58d5c
BP
190 crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
191 crc = (crc << 4) ^ crc32table_be[0][crc >> 28];
1da177e4 192 }
60e58d5c 193# elif CRC_BE_BITS == 8
9a1dbf6a
BP
194 while (len--) {
195 crc ^= *p++ << 24;
196 crc = (crc << 8) ^ crc32table_be[0][crc >> 24];
197 }
198# else
60e58d5c
BP
199 const u32 (*tab)[] = crc32table_be;
200
ce4320dd 201 crc = (__force u32) __cpu_to_be32(crc);
60e58d5c 202 crc = crc32_body(crc, p, len, tab);
ce4320dd 203 crc = __be32_to_cpu((__force __be32)crc);
1da177e4 204# endif
60e58d5c 205 return crc;
1da177e4 206}
1da177e4 207EXPORT_SYMBOL(crc32_be);
1da177e4 208
3863ef31 209#ifdef CONFIG_CRC32_SELFTEST
1da177e4 210
3863ef31
BP
211/* 4096 random bytes */
212static u8 __attribute__((__aligned__(8))) test_buf[] =
1da177e4 213{
3863ef31
BP
214 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
215 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
216 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
217 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
218 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
219 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
220 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
221 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
222 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
223 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
224 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
225 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
226 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
227 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
228 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
229 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
230 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
231 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
232 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
233 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
234 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
235 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
236 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
237 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
238 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
239 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
240 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
241 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
242 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
243 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
244 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
245 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
246 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
247 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
248 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
249 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
250 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
251 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
252 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
253 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
254 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
255 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
256 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
257 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
258 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
259 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
260 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
261 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
262 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
263 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
264 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
265 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
266 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
267 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
268 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
269 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
270 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
271 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
272 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
273 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
274 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
275 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
276 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
277 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
278 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
279 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
280 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
281 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
282 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
283 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
284 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
285 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
286 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
287 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
288 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
289 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
290 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
291 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
292 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
293 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
294 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
295 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
296 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
297 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
298 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
299 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
300 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
301 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
302 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
303 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
304 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
305 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
306 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
307 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
308 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
309 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
310 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
311 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
312 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
313 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
314 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
315 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
316 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
317 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
318 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
319 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
320 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
321 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
322 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
323 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
324 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
325 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
326 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
327 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
328 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
329 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
330 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
331 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
332 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
333 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
334 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
335 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
336 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
337 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
338 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
339 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
340 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
341 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
342 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
343 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
344 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
345 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
346 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
347 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
348 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
349 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
350 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
351 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
352 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
353 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
354 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
355 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
356 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
357 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
358 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
359 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
360 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
361 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
362 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
363 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
364 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
365 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
366 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
367 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
368 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
369 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
370 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
371 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
372 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
373 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
374 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
375 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
376 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
377 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
378 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
379 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
380 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
381 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
382 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
383 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
384 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
385 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
386 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
387 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
388 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
389 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
390 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
391 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
392 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
393 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
394 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
395 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
396 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
397 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
398 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
399 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
400 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
401 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
402 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
403 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
404 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
405 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
406 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
407 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
408 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
409 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
410 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
411 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
412 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
413 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
414 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
415 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
416 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
417 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
418 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
419 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
420 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
421 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
422 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
423 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
424 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
425 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
426 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
427 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
428 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
429 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
430 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
431 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
432 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
433 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
434 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
435 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
436 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
437 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
438 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
439 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
440 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
441 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
442 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
443 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
444 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
445 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
446 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
447 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
448 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
449 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
450 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
451 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
452 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
453 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
454 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
455 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
456 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
457 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
458 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
459 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
460 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
461 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
462 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
463 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
464 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
465 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
466 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
467 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
468 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
469 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
470 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
471 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
472 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
473 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
474 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
475 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
476 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
477 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
478 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
479 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
480 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
481 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
482 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
483 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
484 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
485 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
486 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
487 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
488 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
489 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
490 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
491 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
492 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
493 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
494 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
495 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
496 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
497 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
498 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
499 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
500 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
501 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
502 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
503 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
504 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
505 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
506 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
507 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
508 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
509 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
510 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
511 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
512 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
513 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
514 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
515 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
516 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
517 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
518 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
519 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
520 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
521 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
522 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
523 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
524 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
525 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
526 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
527 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
528 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
529 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
530 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
531 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
532 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
533 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
534 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
535 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
536 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
537 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
538 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
539 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
540 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
541 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
542 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
543 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
544 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
545 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
546 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
547 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
548 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
549 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
550 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
551 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
552 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
553 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
554 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
555 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
556 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
557 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
558 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
559 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
560 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
561 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
562 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
563 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
564 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
565 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
566 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
567 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
568 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
569 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
570 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
571 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
572 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
573 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
574 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
575 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
576 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
577 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
578 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
579 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
580 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
581 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
582 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
583 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
584 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
585 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
586 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
587 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
588 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
589 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
590 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
591 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
592 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
593 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
594 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
595 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
596 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
597 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
598 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
599 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
600 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
601 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
602 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
603 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
604 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
605 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
606 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
607 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
608 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
609 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
610 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
611 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
612 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
613 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
614 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
615 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
616 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
617 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
618 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
619 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
620 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
621 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
622 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
623 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
624 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
625 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
626 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
627 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
628 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
629 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
630 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
631 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
632 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
633 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
634 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
635 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
636 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
637 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
638 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
639 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
640 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
641 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
642 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
643 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
644 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
645 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
646 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
647 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
648 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
649 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
650 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
651 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
652 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
653 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
654 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
655 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
656 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
657 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
658 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
659 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
660 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
661 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
662 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
663 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
664 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
665 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
666 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
667 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
668 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
669 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
670 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
671 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
672 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
673 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
674 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
675 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
676 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
677 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
678 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
679 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
680 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
681 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
682 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
683 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
684 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
685 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
686 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
687 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
688 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
689 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
690 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
691 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
692 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
693 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
694 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
695 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
696 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
697 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
698 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
699 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
700 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
701 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
702 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
703 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
704 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
705 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
706 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
707 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
708 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
709 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
710 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
711 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
712 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
713 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
714 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
715 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
716 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
717 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
718 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
719 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
720 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
721 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
722 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
723 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
724 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
725 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
726};
727
728/* 100 test cases */
729static struct crc_test {
730 u32 crc; /* random starting crc */
731 u32 start; /* random 6 bit offset in buf */
732 u32 length; /* random 11 bit length of test */
733 u32 crc_le; /* expected crc32_le result */
734 u32 crc_be; /* expected crc32_be result */
735} test[] =
1da177e4 736{
3863ef31
BP
737 {0x674bf11d, 0x00000038, 0x00000542, 0x0af6d466, 0xd8b6e4c1},
738 {0x35c672c6, 0x0000003a, 0x000001aa, 0xc6d3dfba, 0x28aaf3ad},
739 {0x496da28e, 0x00000039, 0x000005af, 0xd933660f, 0x5d57e81f},
740 {0x09a9b90e, 0x00000027, 0x000001f8, 0xb45fe007, 0xf45fca9a},
741 {0xdc97e5a9, 0x00000025, 0x000003b6, 0xf81a3562, 0xe0126ba2},
742 {0x47c58900, 0x0000000a, 0x000000b9, 0x8e58eccf, 0xf3afc793},
743 {0x292561e8, 0x0000000c, 0x00000403, 0xa2ba8aaf, 0x0b797aed},
744 {0x415037f6, 0x00000003, 0x00000676, 0xa17d52e8, 0x7f0fdf35},
745 {0x3466e707, 0x00000026, 0x00000042, 0x258319be, 0x75c484a2},
746 {0xafd1281b, 0x00000023, 0x000002ee, 0x4428eaf8, 0x06c7ad10},
747 {0xd3857b18, 0x00000028, 0x000004a2, 0x5c430821, 0xb062b7cb},
748 {0x1d825a8f, 0x0000002b, 0x0000050b, 0xd2c45f0c, 0xd68634e0},
749 {0x5033e3bc, 0x0000000b, 0x00000078, 0xa3ea4113, 0xac6d31fb},
750 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0xfbfc50b1, 0x3cfe50ed},
751 {0xc9a0fe14, 0x00000009, 0x00000473, 0x5fb61894, 0x87070591},
752 {0x88a034b1, 0x0000001c, 0x000005ad, 0xc1b16053, 0x46f95c67},
753 {0xf0f72239, 0x00000020, 0x0000026d, 0xa6fa58f3, 0xf8c2c1dd},
754 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0x7740185a, 0x308b979a},
755 {0xce589c95, 0x0000002b, 0x00000641, 0xd055e987, 0x40aae25b},
756 {0x78edc885, 0x00000035, 0x000005be, 0xa39cb14b, 0x035b0d1f},
757 {0x9d40a377, 0x0000003b, 0x00000038, 0x1f47ccd2, 0x197fbc9d},
758 {0x703d0e01, 0x0000003c, 0x000006f1, 0x88735e7c, 0xfed57c5a},
759 {0x776bf505, 0x0000000f, 0x000005b2, 0x5cc4fc01, 0xf32efb97},
760 {0x4a3e7854, 0x00000027, 0x000004b8, 0x8d923c82, 0x0cbfb4a2},
761 {0x209172dd, 0x0000003b, 0x00000356, 0xb89e9c2b, 0xd7868138},
762 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0xe51601a9, 0x5b2a1032},
763 {0xfc62f297, 0x00000000, 0x00000079, 0x71a8e1a2, 0x5d88685f},
764 {0x64280b8b, 0x00000016, 0x000007ab, 0x0fa7a30c, 0xda3a455f},
765 {0x97dd724b, 0x00000033, 0x000007ad, 0x5788b2f4, 0xd7326d32},
766 {0x61394b52, 0x00000035, 0x00000571, 0xc66525f1, 0xcabe7fef},
767 {0x29b4faff, 0x00000024, 0x0000006e, 0xca13751e, 0x993648e0},
768 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x436c43f7, 0x429f7a59},
769 {0x86ae934b, 0x00000035, 0x00000104, 0x0760ec93, 0x9cf7d0f4},
770 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x6516a3ec, 0x19321f9c},
771 {0x3287a80a, 0x00000026, 0x00000496, 0x0b257eb1, 0x754ebd51},
772 {0xa4db423e, 0x00000023, 0x0000045d, 0x9b3a66dc, 0x873e9f11},
773 {0x7a1078df, 0x00000015, 0x0000014a, 0x8c2484c5, 0x6a628659},
774 {0x6048bd5b, 0x00000006, 0x0000006a, 0x897e3559, 0xac9961af},
775 {0xd8f9ea20, 0x0000003d, 0x00000277, 0x60eb905b, 0xed2aaf99},
776 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x869965dc, 0x6c1f833b},
777 {0x2dfb005d, 0x00000016, 0x00000345, 0x6a3b117e, 0xf05e8521},
778 {0x5a214ade, 0x00000020, 0x000005b6, 0x467f70be, 0xcb22ccd3},
779 {0xf0ab9cca, 0x00000032, 0x00000515, 0xed223df3, 0x7f3ef01d},
780 {0x91b444f9, 0x0000002e, 0x000007f8, 0x84e9a983, 0x5676756f},
781 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xba638c4c, 0x3f42047b},
782 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x6288653b, 0x3a3ebea0},
783 {0x0470180c, 0x00000034, 0x000001f0, 0x9d5b80d6, 0x3de08195},
784 {0xffaa3a3f, 0x00000036, 0x00000299, 0xf3a82ab8, 0x53e0c13d},
785 {0x6406cfeb, 0x00000023, 0x00000600, 0xa920b8e8, 0xe4e2acf4},
786 {0xb24aaa38, 0x0000003e, 0x000004a1, 0x657cc328, 0x5077b2c3},
787 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x3a17ee7e, 0x9dcb3643},
788 {0x3db85970, 0x00000006, 0x000002b6, 0x95268b59, 0xb9812c10},
789 {0x857830c5, 0x00000003, 0x00000590, 0x4ef439d5, 0xf042161d},
790 {0xe1fcd978, 0x0000003e, 0x000007d8, 0xae8d8699, 0xce0a1ef5},
791 {0xb982a768, 0x00000016, 0x000006e0, 0x62fad3df, 0x5f8a067b},
792 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xf0f5da53, 0x26e39eee},
793 {0x2456719b, 0x00000025, 0x00000503, 0x4296ac64, 0xd50e4c14},
794 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x057fdf2e, 0x2a31391a},
795 {0xcba828e3, 0x00000039, 0x000002ce, 0xe3f22351, 0x8f00877b},
796 {0x13d25952, 0x0000000a, 0x0000072d, 0x76d4b4cc, 0x5eb67ec3},
797 {0x0342be3f, 0x00000015, 0x00000599, 0xec75d9f1, 0x9d4d2826},
798 {0xeaa344e0, 0x00000014, 0x000004d8, 0x72a4c981, 0x2064ea06},
799 {0xbbb52021, 0x0000003b, 0x00000272, 0x04af99fc, 0xaf042d35},
800 {0xb66384dc, 0x0000001d, 0x000007fc, 0xd7629116, 0x782bd801},
801 {0x616c01b6, 0x00000022, 0x000002c8, 0x5b1dab30, 0x783ce7d2},
802 {0xce2bdaad, 0x00000016, 0x0000062a, 0x932535c8, 0x3f02926d},
803 {0x00fe84d7, 0x00000005, 0x00000205, 0x850e50aa, 0x753d649c},
804 {0xbebdcb4c, 0x00000006, 0x0000055d, 0xbeaa37a2, 0x2d8c9eba},
805 {0xd8b1a02a, 0x00000010, 0x00000387, 0x5017d2fc, 0x503541a5},
806 {0x3b96cad2, 0x00000036, 0x00000347, 0x1d2372ae, 0x926cd90b},
807 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x9e9fdb22, 0x144a9178},
808 {0x1aad454e, 0x00000025, 0x000002b2, 0xc3f6315c, 0x5c7a35b3},
809 {0xa4fec9a6, 0x00000000, 0x000006d6, 0x90be5080, 0xa4107605},
810 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0x4e504c3b, 0x284ccaf1},
811 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7822e3f9, 0x0cc912a9},
812 {0x23fddc96, 0x00000003, 0x00000627, 0x8a385125, 0x07767e78},
813 {0xd82ba25c, 0x00000016, 0x0000063e, 0x98e4148a, 0x283330c9},
814 {0x786f2032, 0x0000002d, 0x0000060f, 0xf201600a, 0xf561bfcd},
815 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x95e51961, 0xfd80dcab},
816 {0x1a6e0a39, 0x00000008, 0x00000672, 0x8af6c2a5, 0x78dd84cb},
817 {0x56000ab8, 0x0000000e, 0x000000e5, 0x36bacb8f, 0x22ee1f77},
818 {0x4717fe0c, 0x00000000, 0x000006ec, 0x8439f342, 0x5c8e03da},
819 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x46fff083, 0x177d1b39},
820 {0xc25dd6c6, 0x00000024, 0x000006c0, 0x5ceb8eb4, 0x892b0d16},
821 {0xe9b11300, 0x00000023, 0x00000683, 0x07a5d59a, 0x6c6a3208},
822 {0x95cd285e, 0x00000001, 0x00000047, 0x7b3a4368, 0x0202c07e},
823 {0xd9245a25, 0x0000001e, 0x000003a6, 0xd33c1841, 0x1936c0d5},
824 {0x103279db, 0x00000006, 0x0000039b, 0xca09b8a0, 0x77d62892},
825 {0x1cba3172, 0x00000027, 0x000001c8, 0xcb377194, 0xebe682db},
826 {0x8f613739, 0x0000000c, 0x000001df, 0xb4b0bc87, 0x7710bd43},
827 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0x70559245, 0xda7894ac},
828 {0xaabe5b93, 0x0000003d, 0x00000715, 0xcdbf42fa, 0x0c3b99e7},
829 {0xf15dd038, 0x00000006, 0x000006db, 0x6e104aea, 0x8d5967f2},
830 {0x584dd49c, 0x00000020, 0x000007bc, 0x36b6cfd6, 0xad4e23b2},
831 {0x5d8c9506, 0x00000020, 0x00000470, 0x4c62378e, 0x31d92640},
832 {0xb80d17b0, 0x00000032, 0x00000346, 0x22a5bb88, 0x9a7ec89f},
833 {0xdaf0592e, 0x00000023, 0x000007b0, 0x3cab3f99, 0x9b1fdd99},
834 {0x4793cc85, 0x0000000d, 0x00000706, 0xe82e04f6, 0xed3db6b7},
835 {0x82ebf64e, 0x00000009, 0x000007c3, 0x69d590a9, 0x9efa8499},
836 {0xb18a0319, 0x00000026, 0x000007db, 0x1cf98dcc, 0x8fa9ad6a},
837};
838
839#include <linux/time.h>
840
841static int __init crc32_init(void)
1da177e4 842{
3863ef31
BP
843 int i;
844 int errors = 0;
845 int bytes = 0;
846 struct timespec start, stop;
847 u64 nsec;
848 unsigned long flags;
1da177e4 849
3863ef31
BP
850 /* keep static to prevent cache warming code from
851 * getting eliminated by the compiler */
852 static u32 crc;
1da177e4 853
3863ef31
BP
854 /* pre-warm the cache */
855 for (i = 0; i < 100; i++) {
856 bytes += 2*test[i].length;
1da177e4 857
3863ef31
BP
858 crc ^= crc32_le(test[i].crc, test_buf +
859 test[i].start, test[i].length);
860
861 crc ^= crc32_be(test[i].crc, test_buf +
862 test[i].start, test[i].length);
1da177e4
LT
863 }
864
3863ef31
BP
865 /* reduce OS noise */
866 local_irq_save(flags);
867 local_irq_disable();
868
869 getnstimeofday(&start);
870 for (i = 0; i < 100; i++) {
871 if (test[i].crc_le != crc32_le(test[i].crc, test_buf +
872 test[i].start, test[i].length))
873 errors++;
874
875 if (test[i].crc_be != crc32_be(test[i].crc, test_buf +
876 test[i].start, test[i].length))
877 errors++;
1da177e4 878 }
3863ef31 879 getnstimeofday(&stop);
1da177e4 880
3863ef31
BP
881 local_irq_restore(flags);
882 local_irq_enable();
1da177e4 883
3863ef31
BP
884 nsec = stop.tv_nsec - start.tv_nsec +
885 1000000000 * (stop.tv_sec - start.tv_sec);
1da177e4 886
3863ef31
BP
887 pr_info("crc32: CRC_LE_BITS = %d, CRC_BE BITS = %d\n",
888 CRC_LE_BITS, CRC_BE_BITS);
889
890 if (errors)
891 pr_warn("crc32: %d self tests failed\n", errors);
892 else {
893 pr_info("crc32: self tests passed, processed %d bytes in %lld nsec\n",
894 bytes, nsec);
1da177e4 895 }
3863ef31 896
1da177e4
LT
897 return 0;
898}
899
3863ef31
BP
900static void __exit crc32_exit(void)
901{
902}
903
904module_init(crc32_init);
905module_exit(crc32_exit);
906#endif /* CONFIG_CRC32_SELFTEST */