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