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