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