]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - libfrog/crc32.c
xfs_repair: fix 'bno' shadow vars in scan.c
[thirdparty/xfsprogs-dev.git] / libfrog / crc32.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Aug 8, 2011 Bob Pearson with help from Joakim Tjernlund and George Spelvin
4 * cleaned up code to current version of sparse and added the slicing-by-8
5 * algorithm to the closely similar existing slicing-by-4 algorithm.
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 * Oct 12, 2000 Matt Domsch <Matt_Domsch@dell.com>
12 * Same crc32 function was used in 5 other places in the kernel.
13 * I made one version, and deleted the others.
14 * There are various incantations of crc32(). Some use a seed of 0 or ~0.
15 * Some xor at the end with ~0. The generic crc32() function takes
16 * seed as an argument, and doesn't xor at the end. Then individual
17 * users can do whatever they need.
18 * drivers/net/smc9194.c uses seed ~0, doesn't xor with ~0.
19 * fs/jffs2 uses seed 0, doesn't xor with ~0.
20 * fs/partitions/efi.c uses seed ~0, xor's with ~0.
21 */
22
23 /* see: Documentation/crc32.txt for a description of algorithms */
24
25 /*
26 * lifted from the 3.8-rc2 kernel source for xfsprogs. Killed CONFIG_X86
27 * specific bits for just the generic algorithm. Also removed the big endian
28 * version of the algorithm as XFS only uses the little endian CRC version to
29 * match the hardware acceleration available on Intel CPUs.
30 */
31
32 #include <inttypes.h>
33 #include <asm/types.h>
34 #include <sys/time.h>
35 #include "platform_defs.h"
36 /* For endian conversion routines */
37 #include "xfs_arch.h"
38 #include "crc32defs.h"
39 #include "crc32c.h"
40
41 /* types specifc to this file */
42 typedef __u8 u8;
43 typedef __u16 u16;
44 typedef __u32 u32;
45 typedef __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 #include "crc32table.h"
55
56 #if CRC_LE_BITS > 8
57
58 /* implements slicing-by-4 or slicing-by-8 algorithm */
59 static inline u32
60 crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
61 {
62 #if __BYTE_ORDER == __LITTLE_ENDIAN
63 # define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
64 # define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
65 t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
66 # define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
67 t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
68 # elif __BYTE_ORDER == __BIG_ENDIAN
69 # define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
70 # define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
71 t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
72 # define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
73 t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
74 # else
75 # error What endian are you?
76 # endif
77 const u32 *b;
78 size_t rem_len;
79 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
80 # if CRC_LE_BITS != 32
81 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
82 # endif
83 u32 q;
84
85 /* Align it */
86 if (((long)buf & 3) && len) {
87 do {
88 DO_CRC(*buf++);
89 } while ((--len) && ((long)buf)&3);
90 }
91
92 # if CRC_LE_BITS == 32
93 rem_len = len & 3;
94 len = len >> 2;
95 # else
96 rem_len = len & 7;
97 len = len >> 3;
98 # endif
99
100 b = (const u32 *)buf;
101 for (--b; len; --len) {
102 q = crc ^ *++b; /* use pre increment for speed */
103 # if CRC_LE_BITS == 32
104 crc = DO_CRC4;
105 # else
106 crc = DO_CRC8;
107 q = *++b;
108 crc ^= DO_CRC4;
109 # endif
110 }
111 len = rem_len;
112 /* And the last few bytes */
113 if (len) {
114 u8 *p = (u8 *)(b + 1) - 1;
115 do {
116 DO_CRC(*++p); /* use pre increment for speed */
117 } while (--len);
118 }
119 return crc;
120 #undef DO_CRC
121 #undef DO_CRC4
122 #undef DO_CRC8
123 }
124 #endif
125
126 /**
127 * crc32_le() - Calculate bitwise little-endian Ethernet AUTODIN II CRC32
128 * @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
129 * other uses, or the previous crc32 value if computing incrementally.
130 * @p: pointer to buffer over which CRC is run
131 * @len: length of buffer @p
132 */
133 static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
134 size_t len, const u32 (*tab)[256],
135 u32 polynomial)
136 {
137 #if CRC_LE_BITS == 1
138 int i;
139 while (len--) {
140 crc ^= *p++;
141 for (i = 0; i < 8; i++)
142 crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
143 }
144 # elif CRC_LE_BITS == 2
145 while (len--) {
146 crc ^= *p++;
147 crc = (crc >> 2) ^ tab[0][crc & 3];
148 crc = (crc >> 2) ^ tab[0][crc & 3];
149 crc = (crc >> 2) ^ tab[0][crc & 3];
150 crc = (crc >> 2) ^ tab[0][crc & 3];
151 }
152 # elif CRC_LE_BITS == 4
153 while (len--) {
154 crc ^= *p++;
155 crc = (crc >> 4) ^ tab[0][crc & 15];
156 crc = (crc >> 4) ^ tab[0][crc & 15];
157 }
158 # elif CRC_LE_BITS == 8
159 /* aka Sarwate algorithm */
160 while (len--) {
161 crc ^= *p++;
162 crc = (crc >> 8) ^ tab[0][crc & 255];
163 }
164 # else
165 crc = (__force u32) cpu_to_le32(crc);
166 crc = crc32_body(crc, p, len, tab);
167 crc = le32_to_cpu((__force __le32)crc);
168 #endif
169 return crc;
170 }
171
172 #if CRC_LE_BITS == 1
173 u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len)
174 {
175 return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
176 }
177 #else
178 u32 __pure crc32c_le(u32 crc, unsigned char const *p, size_t len)
179 {
180 return crc32_le_generic(crc, p, len,
181 (const u32 (*)[256])crc32ctable_le, CRC32C_POLY_LE);
182 }
183 #endif
184
185
186 #ifdef CRC32_SELFTEST
187
188 /* 4096 random bytes */
189 static u8 __attribute__((__aligned__(8))) test_buf[] =
190 {
191 0x5b, 0x85, 0x21, 0xcb, 0x09, 0x68, 0x7d, 0x30,
192 0xc7, 0x69, 0xd7, 0x30, 0x92, 0xde, 0x59, 0xe4,
193 0xc9, 0x6e, 0x8b, 0xdb, 0x98, 0x6b, 0xaa, 0x60,
194 0xa8, 0xb5, 0xbc, 0x6c, 0xa9, 0xb1, 0x5b, 0x2c,
195 0xea, 0xb4, 0x92, 0x6a, 0x3f, 0x79, 0x91, 0xe4,
196 0xe9, 0x70, 0x51, 0x8c, 0x7f, 0x95, 0x6f, 0x1a,
197 0x56, 0xa1, 0x5c, 0x27, 0x03, 0x67, 0x9f, 0x3a,
198 0xe2, 0x31, 0x11, 0x29, 0x6b, 0x98, 0xfc, 0xc4,
199 0x53, 0x24, 0xc5, 0x8b, 0xce, 0x47, 0xb2, 0xb9,
200 0x32, 0xcb, 0xc1, 0xd0, 0x03, 0x57, 0x4e, 0xd4,
201 0xe9, 0x3c, 0xa1, 0x63, 0xcf, 0x12, 0x0e, 0xca,
202 0xe1, 0x13, 0xd1, 0x93, 0xa6, 0x88, 0x5c, 0x61,
203 0x5b, 0xbb, 0xf0, 0x19, 0x46, 0xb4, 0xcf, 0x9e,
204 0xb6, 0x6b, 0x4c, 0x3a, 0xcf, 0x60, 0xf9, 0x7a,
205 0x8d, 0x07, 0x63, 0xdb, 0x40, 0xe9, 0x0b, 0x6f,
206 0xad, 0x97, 0xf1, 0xed, 0xd0, 0x1e, 0x26, 0xfd,
207 0xbf, 0xb7, 0xc8, 0x04, 0x94, 0xf8, 0x8b, 0x8c,
208 0xf1, 0xab, 0x7a, 0xd4, 0xdd, 0xf3, 0xe8, 0x88,
209 0xc3, 0xed, 0x17, 0x8a, 0x9b, 0x40, 0x0d, 0x53,
210 0x62, 0x12, 0x03, 0x5f, 0x1b, 0x35, 0x32, 0x1f,
211 0xb4, 0x7b, 0x93, 0x78, 0x0d, 0xdb, 0xce, 0xa4,
212 0xc0, 0x47, 0xd5, 0xbf, 0x68, 0xe8, 0x5d, 0x74,
213 0x8f, 0x8e, 0x75, 0x1c, 0xb2, 0x4f, 0x9a, 0x60,
214 0xd1, 0xbe, 0x10, 0xf4, 0x5c, 0xa1, 0x53, 0x09,
215 0xa5, 0xe0, 0x09, 0x54, 0x85, 0x5c, 0xdc, 0x07,
216 0xe7, 0x21, 0x69, 0x7b, 0x8a, 0xfd, 0x90, 0xf1,
217 0x22, 0xd0, 0xb4, 0x36, 0x28, 0xe6, 0xb8, 0x0f,
218 0x39, 0xde, 0xc8, 0xf3, 0x86, 0x60, 0x34, 0xd2,
219 0x5e, 0xdf, 0xfd, 0xcf, 0x0f, 0xa9, 0x65, 0xf0,
220 0xd5, 0x4d, 0x96, 0x40, 0xe3, 0xdf, 0x3f, 0x95,
221 0x5a, 0x39, 0x19, 0x93, 0xf4, 0x75, 0xce, 0x22,
222 0x00, 0x1c, 0x93, 0xe2, 0x03, 0x66, 0xf4, 0x93,
223 0x73, 0x86, 0x81, 0x8e, 0x29, 0x44, 0x48, 0x86,
224 0x61, 0x7c, 0x48, 0xa3, 0x43, 0xd2, 0x9c, 0x8d,
225 0xd4, 0x95, 0xdd, 0xe1, 0x22, 0x89, 0x3a, 0x40,
226 0x4c, 0x1b, 0x8a, 0x04, 0xa8, 0x09, 0x69, 0x8b,
227 0xea, 0xc6, 0x55, 0x8e, 0x57, 0xe6, 0x64, 0x35,
228 0xf0, 0xc7, 0x16, 0x9f, 0x5d, 0x5e, 0x86, 0x40,
229 0x46, 0xbb, 0xe5, 0x45, 0x88, 0xfe, 0xc9, 0x63,
230 0x15, 0xfb, 0xf5, 0xbd, 0x71, 0x61, 0xeb, 0x7b,
231 0x78, 0x70, 0x07, 0x31, 0x03, 0x9f, 0xb2, 0xc8,
232 0xa7, 0xab, 0x47, 0xfd, 0xdf, 0xa0, 0x78, 0x72,
233 0xa4, 0x2a, 0xe4, 0xb6, 0xba, 0xc0, 0x1e, 0x86,
234 0x71, 0xe6, 0x3d, 0x18, 0x37, 0x70, 0xe6, 0xff,
235 0xe0, 0xbc, 0x0b, 0x22, 0xa0, 0x1f, 0xd3, 0xed,
236 0xa2, 0x55, 0x39, 0xab, 0xa8, 0x13, 0x73, 0x7c,
237 0x3f, 0xb2, 0xd6, 0x19, 0xac, 0xff, 0x99, 0xed,
238 0xe8, 0xe6, 0xa6, 0x22, 0xe3, 0x9c, 0xf1, 0x30,
239 0xdc, 0x01, 0x0a, 0x56, 0xfa, 0xe4, 0xc9, 0x99,
240 0xdd, 0xa8, 0xd8, 0xda, 0x35, 0x51, 0x73, 0xb4,
241 0x40, 0x86, 0x85, 0xdb, 0x5c, 0xd5, 0x85, 0x80,
242 0x14, 0x9c, 0xfd, 0x98, 0xa9, 0x82, 0xc5, 0x37,
243 0xff, 0x32, 0x5d, 0xd0, 0x0b, 0xfa, 0xdc, 0x04,
244 0x5e, 0x09, 0xd2, 0xca, 0x17, 0x4b, 0x1a, 0x8e,
245 0x15, 0xe1, 0xcc, 0x4e, 0x52, 0x88, 0x35, 0xbd,
246 0x48, 0xfe, 0x15, 0xa0, 0x91, 0xfd, 0x7e, 0x6c,
247 0x0e, 0x5d, 0x79, 0x1b, 0x81, 0x79, 0xd2, 0x09,
248 0x34, 0x70, 0x3d, 0x81, 0xec, 0xf6, 0x24, 0xbb,
249 0xfb, 0xf1, 0x7b, 0xdf, 0x54, 0xea, 0x80, 0x9b,
250 0xc7, 0x99, 0x9e, 0xbd, 0x16, 0x78, 0x12, 0x53,
251 0x5e, 0x01, 0xa7, 0x4e, 0xbd, 0x67, 0xe1, 0x9b,
252 0x4c, 0x0e, 0x61, 0x45, 0x97, 0xd2, 0xf0, 0x0f,
253 0xfe, 0x15, 0x08, 0xb7, 0x11, 0x4c, 0xe7, 0xff,
254 0x81, 0x53, 0xff, 0x91, 0x25, 0x38, 0x7e, 0x40,
255 0x94, 0xe5, 0xe0, 0xad, 0xe6, 0xd9, 0x79, 0xb6,
256 0x92, 0xc9, 0xfc, 0xde, 0xc3, 0x1a, 0x23, 0xbb,
257 0xdd, 0xc8, 0x51, 0x0c, 0x3a, 0x72, 0xfa, 0x73,
258 0x6f, 0xb7, 0xee, 0x61, 0x39, 0x03, 0x01, 0x3f,
259 0x7f, 0x94, 0x2e, 0x2e, 0xba, 0x3a, 0xbb, 0xb4,
260 0xfa, 0x6a, 0x17, 0xfe, 0xea, 0xef, 0x5e, 0x66,
261 0x97, 0x3f, 0x32, 0x3d, 0xd7, 0x3e, 0xb1, 0xf1,
262 0x6c, 0x14, 0x4c, 0xfd, 0x37, 0xd3, 0x38, 0x80,
263 0xfb, 0xde, 0xa6, 0x24, 0x1e, 0xc8, 0xca, 0x7f,
264 0x3a, 0x93, 0xd8, 0x8b, 0x18, 0x13, 0xb2, 0xe5,
265 0xe4, 0x93, 0x05, 0x53, 0x4f, 0x84, 0x66, 0xa7,
266 0x58, 0x5c, 0x7b, 0x86, 0x52, 0x6d, 0x0d, 0xce,
267 0xa4, 0x30, 0x7d, 0xb6, 0x18, 0x9f, 0xeb, 0xff,
268 0x22, 0xbb, 0x72, 0x29, 0xb9, 0x44, 0x0b, 0x48,
269 0x1e, 0x84, 0x71, 0x81, 0xe3, 0x6d, 0x73, 0x26,
270 0x92, 0xb4, 0x4d, 0x2a, 0x29, 0xb8, 0x1f, 0x72,
271 0xed, 0xd0, 0xe1, 0x64, 0x77, 0xea, 0x8e, 0x88,
272 0x0f, 0xef, 0x3f, 0xb1, 0x3b, 0xad, 0xf9, 0xc9,
273 0x8b, 0xd0, 0xac, 0xc6, 0xcc, 0xa9, 0x40, 0xcc,
274 0x76, 0xf6, 0x3b, 0x53, 0xb5, 0x88, 0xcb, 0xc8,
275 0x37, 0xf1, 0xa2, 0xba, 0x23, 0x15, 0x99, 0x09,
276 0xcc, 0xe7, 0x7a, 0x3b, 0x37, 0xf7, 0x58, 0xc8,
277 0x46, 0x8c, 0x2b, 0x2f, 0x4e, 0x0e, 0xa6, 0x5c,
278 0xea, 0x85, 0x55, 0xba, 0x02, 0x0e, 0x0e, 0x48,
279 0xbc, 0xe1, 0xb1, 0x01, 0x35, 0x79, 0x13, 0x3d,
280 0x1b, 0xc0, 0x53, 0x68, 0x11, 0xe7, 0x95, 0x0f,
281 0x9d, 0x3f, 0x4c, 0x47, 0x7b, 0x4d, 0x1c, 0xae,
282 0x50, 0x9b, 0xcb, 0xdd, 0x05, 0x8d, 0x9a, 0x97,
283 0xfd, 0x8c, 0xef, 0x0c, 0x1d, 0x67, 0x73, 0xa8,
284 0x28, 0x36, 0xd5, 0xb6, 0x92, 0x33, 0x40, 0x75,
285 0x0b, 0x51, 0xc3, 0x64, 0xba, 0x1d, 0xc2, 0xcc,
286 0xee, 0x7d, 0x54, 0x0f, 0x27, 0x69, 0xa7, 0x27,
287 0x63, 0x30, 0x29, 0xd9, 0xc8, 0x84, 0xd8, 0xdf,
288 0x9f, 0x68, 0x8d, 0x04, 0xca, 0xa6, 0xc5, 0xc7,
289 0x7a, 0x5c, 0xc8, 0xd1, 0xcb, 0x4a, 0xec, 0xd0,
290 0xd8, 0x20, 0x69, 0xc5, 0x17, 0xcd, 0x78, 0xc8,
291 0x75, 0x23, 0x30, 0x69, 0xc9, 0xd4, 0xea, 0x5c,
292 0x4f, 0x6b, 0x86, 0x3f, 0x8b, 0xfe, 0xee, 0x44,
293 0xc9, 0x7c, 0xb7, 0xdd, 0x3e, 0xe5, 0xec, 0x54,
294 0x03, 0x3e, 0xaa, 0x82, 0xc6, 0xdf, 0xb2, 0x38,
295 0x0e, 0x5d, 0xb3, 0x88, 0xd9, 0xd3, 0x69, 0x5f,
296 0x8f, 0x70, 0x8a, 0x7e, 0x11, 0xd9, 0x1e, 0x7b,
297 0x38, 0xf1, 0x42, 0x1a, 0xc0, 0x35, 0xf5, 0xc7,
298 0x36, 0x85, 0xf5, 0xf7, 0xb8, 0x7e, 0xc7, 0xef,
299 0x18, 0xf1, 0x63, 0xd6, 0x7a, 0xc6, 0xc9, 0x0e,
300 0x4d, 0x69, 0x4f, 0x84, 0xef, 0x26, 0x41, 0x0c,
301 0xec, 0xc7, 0xe0, 0x7e, 0x3c, 0x67, 0x01, 0x4c,
302 0x62, 0x1a, 0x20, 0x6f, 0xee, 0x47, 0x4d, 0xc0,
303 0x99, 0x13, 0x8d, 0x91, 0x4a, 0x26, 0xd4, 0x37,
304 0x28, 0x90, 0x58, 0x75, 0x66, 0x2b, 0x0a, 0xdf,
305 0xda, 0xee, 0x92, 0x25, 0x90, 0x62, 0x39, 0x9e,
306 0x44, 0x98, 0xad, 0xc1, 0x88, 0xed, 0xe4, 0xb4,
307 0xaf, 0xf5, 0x8c, 0x9b, 0x48, 0x4d, 0x56, 0x60,
308 0x97, 0x0f, 0x61, 0x59, 0x9e, 0xa6, 0x27, 0xfe,
309 0xc1, 0x91, 0x15, 0x38, 0xb8, 0x0f, 0xae, 0x61,
310 0x7d, 0x26, 0x13, 0x5a, 0x73, 0xff, 0x1c, 0xa3,
311 0x61, 0x04, 0x58, 0x48, 0x55, 0x44, 0x11, 0xfe,
312 0x15, 0xca, 0xc3, 0xbd, 0xca, 0xc5, 0xb4, 0x40,
313 0x5d, 0x1b, 0x7f, 0x39, 0xb5, 0x9c, 0x35, 0xec,
314 0x61, 0x15, 0x32, 0x32, 0xb8, 0x4e, 0x40, 0x9f,
315 0x17, 0x1f, 0x0a, 0x4d, 0xa9, 0x91, 0xef, 0xb7,
316 0xb0, 0xeb, 0xc2, 0x83, 0x9a, 0x6c, 0xd2, 0x79,
317 0x43, 0x78, 0x5e, 0x2f, 0xe5, 0xdd, 0x1a, 0x3c,
318 0x45, 0xab, 0x29, 0x40, 0x3a, 0x37, 0x5b, 0x6f,
319 0xd7, 0xfc, 0x48, 0x64, 0x3c, 0x49, 0xfb, 0x21,
320 0xbe, 0xc3, 0xff, 0x07, 0xfb, 0x17, 0xe9, 0xc9,
321 0x0c, 0x4c, 0x5c, 0x15, 0x9e, 0x8e, 0x22, 0x30,
322 0x0a, 0xde, 0x48, 0x7f, 0xdb, 0x0d, 0xd1, 0x2b,
323 0x87, 0x38, 0x9e, 0xcc, 0x5a, 0x01, 0x16, 0xee,
324 0x75, 0x49, 0x0d, 0x30, 0x01, 0x34, 0x6a, 0xb6,
325 0x9a, 0x5a, 0x2a, 0xec, 0xbb, 0x48, 0xac, 0xd3,
326 0x77, 0x83, 0xd8, 0x08, 0x86, 0x4f, 0x48, 0x09,
327 0x29, 0x41, 0x79, 0xa1, 0x03, 0x12, 0xc4, 0xcd,
328 0x90, 0x55, 0x47, 0x66, 0x74, 0x9a, 0xcc, 0x4f,
329 0x35, 0x8c, 0xd6, 0x98, 0xef, 0xeb, 0x45, 0xb9,
330 0x9a, 0x26, 0x2f, 0x39, 0xa5, 0x70, 0x6d, 0xfc,
331 0xb4, 0x51, 0xee, 0xf4, 0x9c, 0xe7, 0x38, 0x59,
332 0xad, 0xf4, 0xbc, 0x46, 0xff, 0x46, 0x8e, 0x60,
333 0x9c, 0xa3, 0x60, 0x1d, 0xf8, 0x26, 0x72, 0xf5,
334 0x72, 0x9d, 0x68, 0x80, 0x04, 0xf6, 0x0b, 0xa1,
335 0x0a, 0xd5, 0xa7, 0x82, 0x3a, 0x3e, 0x47, 0xa8,
336 0x5a, 0xde, 0x59, 0x4f, 0x7b, 0x07, 0xb3, 0xe9,
337 0x24, 0x19, 0x3d, 0x34, 0x05, 0xec, 0xf1, 0xab,
338 0x6e, 0x64, 0x8f, 0xd3, 0xe6, 0x41, 0x86, 0x80,
339 0x70, 0xe3, 0x8d, 0x60, 0x9c, 0x34, 0x25, 0x01,
340 0x07, 0x4d, 0x19, 0x41, 0x4e, 0x3d, 0x5c, 0x7e,
341 0xa8, 0xf5, 0xcc, 0xd5, 0x7b, 0xe2, 0x7d, 0x3d,
342 0x49, 0x86, 0x7d, 0x07, 0xb7, 0x10, 0xe3, 0x35,
343 0xb8, 0x84, 0x6d, 0x76, 0xab, 0x17, 0xc6, 0x38,
344 0xb4, 0xd3, 0x28, 0x57, 0xad, 0xd3, 0x88, 0x5a,
345 0xda, 0xea, 0xc8, 0x94, 0xcc, 0x37, 0x19, 0xac,
346 0x9c, 0x9f, 0x4b, 0x00, 0x15, 0xc0, 0xc8, 0xca,
347 0x1f, 0x15, 0xaa, 0xe0, 0xdb, 0xf9, 0x2f, 0x57,
348 0x1b, 0x24, 0xc7, 0x6f, 0x76, 0x29, 0xfb, 0xed,
349 0x25, 0x0d, 0xc0, 0xfe, 0xbd, 0x5a, 0xbf, 0x20,
350 0x08, 0x51, 0x05, 0xec, 0x71, 0xa3, 0xbf, 0xef,
351 0x5e, 0x99, 0x75, 0xdb, 0x3c, 0x5f, 0x9a, 0x8c,
352 0xbb, 0x19, 0x5c, 0x0e, 0x93, 0x19, 0xf8, 0x6a,
353 0xbc, 0xf2, 0x12, 0x54, 0x2f, 0xcb, 0x28, 0x64,
354 0x88, 0xb3, 0x92, 0x0d, 0x96, 0xd1, 0xa6, 0xe4,
355 0x1f, 0xf1, 0x4d, 0xa4, 0xab, 0x1c, 0xee, 0x54,
356 0xf2, 0xad, 0x29, 0x6d, 0x32, 0x37, 0xb2, 0x16,
357 0x77, 0x5c, 0xdc, 0x2e, 0x54, 0xec, 0x75, 0x26,
358 0xc6, 0x36, 0xd9, 0x17, 0x2c, 0xf1, 0x7a, 0xdc,
359 0x4b, 0xf1, 0xe2, 0xd9, 0x95, 0xba, 0xac, 0x87,
360 0xc1, 0xf3, 0x8e, 0x58, 0x08, 0xd8, 0x87, 0x60,
361 0xc9, 0xee, 0x6a, 0xde, 0xa4, 0xd2, 0xfc, 0x0d,
362 0xe5, 0x36, 0xc4, 0x5c, 0x52, 0xb3, 0x07, 0x54,
363 0x65, 0x24, 0xc1, 0xb1, 0xd1, 0xb1, 0x53, 0x13,
364 0x31, 0x79, 0x7f, 0x05, 0x76, 0xeb, 0x37, 0x59,
365 0x15, 0x2b, 0xd1, 0x3f, 0xac, 0x08, 0x97, 0xeb,
366 0x91, 0x98, 0xdf, 0x6c, 0x09, 0x0d, 0x04, 0x9f,
367 0xdc, 0x3b, 0x0e, 0x60, 0x68, 0x47, 0x23, 0x15,
368 0x16, 0xc6, 0x0b, 0x35, 0xf8, 0x77, 0xa2, 0x78,
369 0x50, 0xd4, 0x64, 0x22, 0x33, 0xff, 0xfb, 0x93,
370 0x71, 0x46, 0x50, 0x39, 0x1b, 0x9c, 0xea, 0x4e,
371 0x8d, 0x0c, 0x37, 0xe5, 0x5c, 0x51, 0x3a, 0x31,
372 0xb2, 0x85, 0x84, 0x3f, 0x41, 0xee, 0xa2, 0xc1,
373 0xc6, 0x13, 0x3b, 0x54, 0x28, 0xd2, 0x18, 0x37,
374 0xcc, 0x46, 0x9f, 0x6a, 0x91, 0x3d, 0x5a, 0x15,
375 0x3c, 0x89, 0xa3, 0x61, 0x06, 0x7d, 0x2e, 0x78,
376 0xbe, 0x7d, 0x40, 0xba, 0x2f, 0x95, 0xb1, 0x2f,
377 0x87, 0x3b, 0x8a, 0xbe, 0x6a, 0xf4, 0xc2, 0x31,
378 0x74, 0xee, 0x91, 0xe0, 0x23, 0xaa, 0x5d, 0x7f,
379 0xdd, 0xf0, 0x44, 0x8c, 0x0b, 0x59, 0x2b, 0xfc,
380 0x48, 0x3a, 0xdf, 0x07, 0x05, 0x38, 0x6c, 0xc9,
381 0xeb, 0x18, 0x24, 0x68, 0x8d, 0x58, 0x98, 0xd3,
382 0x31, 0xa3, 0xe4, 0x70, 0x59, 0xb1, 0x21, 0xbe,
383 0x7e, 0x65, 0x7d, 0xb8, 0x04, 0xab, 0xf6, 0xe4,
384 0xd7, 0xda, 0xec, 0x09, 0x8f, 0xda, 0x6d, 0x24,
385 0x07, 0xcc, 0x29, 0x17, 0x05, 0x78, 0x1a, 0xc1,
386 0xb1, 0xce, 0xfc, 0xaa, 0x2d, 0xe7, 0xcc, 0x85,
387 0x84, 0x84, 0x03, 0x2a, 0x0c, 0x3f, 0xa9, 0xf8,
388 0xfd, 0x84, 0x53, 0x59, 0x5c, 0xf0, 0xd4, 0x09,
389 0xf0, 0xd2, 0x6c, 0x32, 0x03, 0xb0, 0xa0, 0x8c,
390 0x52, 0xeb, 0x23, 0x91, 0x88, 0x43, 0x13, 0x46,
391 0xf6, 0x1e, 0xb4, 0x1b, 0xf5, 0x8e, 0x3a, 0xb5,
392 0x3d, 0x00, 0xf6, 0xe5, 0x08, 0x3d, 0x5f, 0x39,
393 0xd3, 0x21, 0x69, 0xbc, 0x03, 0x22, 0x3a, 0xd2,
394 0x5c, 0x84, 0xf8, 0x15, 0xc4, 0x80, 0x0b, 0xbc,
395 0x29, 0x3c, 0xf3, 0x95, 0x98, 0xcd, 0x8f, 0x35,
396 0xbc, 0xa5, 0x3e, 0xfc, 0xd4, 0x13, 0x9e, 0xde,
397 0x4f, 0xce, 0x71, 0x9d, 0x09, 0xad, 0xf2, 0x80,
398 0x6b, 0x65, 0x7f, 0x03, 0x00, 0x14, 0x7c, 0x15,
399 0x85, 0x40, 0x6d, 0x70, 0xea, 0xdc, 0xb3, 0x63,
400 0x35, 0x4f, 0x4d, 0xe0, 0xd9, 0xd5, 0x3c, 0x58,
401 0x56, 0x23, 0x80, 0xe2, 0x36, 0xdd, 0x75, 0x1d,
402 0x94, 0x11, 0x41, 0x8e, 0xe0, 0x81, 0x8e, 0xcf,
403 0xe0, 0xe5, 0xf6, 0xde, 0xd1, 0xe7, 0x04, 0x12,
404 0x79, 0x92, 0x2b, 0x71, 0x2a, 0x79, 0x8b, 0x7c,
405 0x44, 0x79, 0x16, 0x30, 0x4e, 0xf4, 0xf6, 0x9b,
406 0xb7, 0x40, 0xa3, 0x5a, 0xa7, 0x69, 0x3e, 0xc1,
407 0x3a, 0x04, 0xd0, 0x88, 0xa0, 0x3b, 0xdd, 0xc6,
408 0x9e, 0x7e, 0x1e, 0x1e, 0x8f, 0x44, 0xf7, 0x73,
409 0x67, 0x1e, 0x1a, 0x78, 0xfa, 0x62, 0xf4, 0xa9,
410 0xa8, 0xc6, 0x5b, 0xb8, 0xfa, 0x06, 0x7d, 0x5e,
411 0x38, 0x1c, 0x9a, 0x39, 0xe9, 0x39, 0x98, 0x22,
412 0x0b, 0xa7, 0xac, 0x0b, 0xf3, 0xbc, 0xf1, 0xeb,
413 0x8c, 0x81, 0xe3, 0x48, 0x8a, 0xed, 0x42, 0xc2,
414 0x38, 0xcf, 0x3e, 0xda, 0xd2, 0x89, 0x8d, 0x9c,
415 0x53, 0xb5, 0x2f, 0x41, 0x01, 0x26, 0x84, 0x9c,
416 0xa3, 0x56, 0xf6, 0x49, 0xc7, 0xd4, 0x9f, 0x93,
417 0x1b, 0x96, 0x49, 0x5e, 0xad, 0xb3, 0x84, 0x1f,
418 0x3c, 0xa4, 0xe0, 0x9b, 0xd1, 0x90, 0xbc, 0x38,
419 0x6c, 0xdd, 0x95, 0x4d, 0x9d, 0xb1, 0x71, 0x57,
420 0x2d, 0x34, 0xe8, 0xb8, 0x42, 0xc7, 0x99, 0x03,
421 0xc7, 0x07, 0x30, 0x65, 0x91, 0x55, 0xd5, 0x90,
422 0x70, 0x97, 0x37, 0x68, 0xd4, 0x11, 0xf9, 0xe8,
423 0xce, 0xec, 0xdc, 0x34, 0xd5, 0xd3, 0xb7, 0xc4,
424 0xb8, 0x97, 0x05, 0x92, 0xad, 0xf8, 0xe2, 0x36,
425 0x64, 0x41, 0xc9, 0xc5, 0x41, 0x77, 0x52, 0xd7,
426 0x2c, 0xa5, 0x24, 0x2f, 0xd9, 0x34, 0x0b, 0x47,
427 0x35, 0xa7, 0x28, 0x8b, 0xc5, 0xcd, 0xe9, 0x46,
428 0xac, 0x39, 0x94, 0x3c, 0x10, 0xc6, 0x29, 0x73,
429 0x0e, 0x0e, 0x5d, 0xe0, 0x71, 0x03, 0x8a, 0x72,
430 0x0e, 0x26, 0xb0, 0x7d, 0x84, 0xed, 0x95, 0x23,
431 0x49, 0x5a, 0x45, 0x83, 0x45, 0x60, 0x11, 0x4a,
432 0x46, 0x31, 0xd4, 0xd8, 0x16, 0x54, 0x98, 0x58,
433 0xed, 0x6d, 0xcc, 0x5d, 0xd6, 0x50, 0x61, 0x9f,
434 0x9d, 0xc5, 0x3e, 0x9d, 0x32, 0x47, 0xde, 0x96,
435 0xe1, 0x5d, 0xd8, 0xf8, 0xb4, 0x69, 0x6f, 0xb9,
436 0x15, 0x90, 0x57, 0x7a, 0xf6, 0xad, 0xb0, 0x5b,
437 0xf5, 0xa6, 0x36, 0x94, 0xfd, 0x84, 0xce, 0x1c,
438 0x0f, 0x4b, 0xd0, 0xc2, 0x5b, 0x6b, 0x56, 0xef,
439 0x73, 0x93, 0x0b, 0xc3, 0xee, 0xd9, 0xcf, 0xd3,
440 0xa4, 0x22, 0x58, 0xcd, 0x50, 0x6e, 0x65, 0xf4,
441 0xe9, 0xb7, 0x71, 0xaf, 0x4b, 0xb3, 0xb6, 0x2f,
442 0x0f, 0x0e, 0x3b, 0xc9, 0x85, 0x14, 0xf5, 0x17,
443 0xe8, 0x7a, 0x3a, 0xbf, 0x5f, 0x5e, 0xf8, 0x18,
444 0x48, 0xa6, 0x72, 0xab, 0x06, 0x95, 0xe9, 0xc8,
445 0xa7, 0xf4, 0x32, 0x44, 0x04, 0x0c, 0x84, 0x98,
446 0x73, 0xe3, 0x89, 0x8d, 0x5f, 0x7e, 0x4a, 0x42,
447 0x8f, 0xc5, 0x28, 0xb1, 0x82, 0xef, 0x1c, 0x97,
448 0x31, 0x3b, 0x4d, 0xe0, 0x0e, 0x10, 0x10, 0x97,
449 0x93, 0x49, 0x78, 0x2f, 0x0d, 0x86, 0x8b, 0xa1,
450 0x53, 0xa9, 0x81, 0x20, 0x79, 0xe7, 0x07, 0x77,
451 0xb6, 0xac, 0x5e, 0xd2, 0x05, 0xcd, 0xe9, 0xdb,
452 0x8a, 0x94, 0x82, 0x8a, 0x23, 0xb9, 0x3d, 0x1c,
453 0xa9, 0x7d, 0x72, 0x4a, 0xed, 0x33, 0xa3, 0xdb,
454 0x21, 0xa7, 0x86, 0x33, 0x45, 0xa5, 0xaa, 0x56,
455 0x45, 0xb5, 0x83, 0x29, 0x40, 0x47, 0x79, 0x04,
456 0x6e, 0xb9, 0x95, 0xd0, 0x81, 0x77, 0x2d, 0x48,
457 0x1e, 0xfe, 0xc3, 0xc2, 0x1e, 0xe5, 0xf2, 0xbe,
458 0xfd, 0x3b, 0x94, 0x9f, 0xc4, 0xc4, 0x26, 0x9d,
459 0xe4, 0x66, 0x1e, 0x19, 0xee, 0x6c, 0x79, 0x97,
460 0x11, 0x31, 0x4b, 0x0d, 0x01, 0xcb, 0xde, 0xa8,
461 0xf6, 0x6d, 0x7c, 0x39, 0x46, 0x4e, 0x7e, 0x3f,
462 0x94, 0x17, 0xdf, 0xa1, 0x7d, 0xd9, 0x1c, 0x8e,
463 0xbc, 0x7d, 0x33, 0x7d, 0xe3, 0x12, 0x40, 0xca,
464 0xab, 0x37, 0x11, 0x46, 0xd4, 0xae, 0xef, 0x44,
465 0xa2, 0xb3, 0x6a, 0x66, 0x0e, 0x0c, 0x90, 0x7f,
466 0xdf, 0x5c, 0x66, 0x5f, 0xf2, 0x94, 0x9f, 0xa6,
467 0x73, 0x4f, 0xeb, 0x0d, 0xad, 0xbf, 0xc0, 0x63,
468 0x5c, 0xdc, 0x46, 0x51, 0xe8, 0x8e, 0x90, 0x19,
469 0xa8, 0xa4, 0x3c, 0x91, 0x79, 0xfa, 0x7e, 0x58,
470 0x85, 0x13, 0x55, 0xc5, 0x19, 0x82, 0x37, 0x1b,
471 0x0a, 0x02, 0x1f, 0x99, 0x6b, 0x18, 0xf1, 0x28,
472 0x08, 0xa2, 0x73, 0xb8, 0x0f, 0x2e, 0xcd, 0xbf,
473 0xf3, 0x86, 0x7f, 0xea, 0xef, 0xd0, 0xbb, 0xa6,
474 0x21, 0xdf, 0x49, 0x73, 0x51, 0xcc, 0x36, 0xd3,
475 0x3e, 0xa0, 0xf8, 0x44, 0xdf, 0xd3, 0xa6, 0xbe,
476 0x8a, 0xd4, 0x57, 0xdd, 0x72, 0x94, 0x61, 0x0f,
477 0x82, 0xd1, 0x07, 0xb8, 0x7c, 0x18, 0x83, 0xdf,
478 0x3a, 0xe5, 0x50, 0x6a, 0x82, 0x20, 0xac, 0xa9,
479 0xa8, 0xff, 0xd9, 0xf3, 0x77, 0x33, 0x5a, 0x9e,
480 0x7f, 0x6d, 0xfe, 0x5d, 0x33, 0x41, 0x42, 0xe7,
481 0x6c, 0x19, 0xe0, 0x44, 0x8a, 0x15, 0xf6, 0x70,
482 0x98, 0xb7, 0x68, 0x4d, 0xfa, 0x97, 0x39, 0xb0,
483 0x8e, 0xe8, 0x84, 0x8b, 0x75, 0x30, 0xb7, 0x7d,
484 0x92, 0x69, 0x20, 0x9c, 0x81, 0xfb, 0x4b, 0xf4,
485 0x01, 0x50, 0xeb, 0xce, 0x0c, 0x1c, 0x6c, 0xb5,
486 0x4a, 0xd7, 0x27, 0x0c, 0xce, 0xbb, 0xe5, 0x85,
487 0xf0, 0xb6, 0xee, 0xd5, 0x70, 0xdd, 0x3b, 0xfc,
488 0xd4, 0x99, 0xf1, 0x33, 0xdd, 0x8b, 0xc4, 0x2f,
489 0xae, 0xab, 0x74, 0x96, 0x32, 0xc7, 0x4c, 0x56,
490 0x3c, 0x89, 0x0f, 0x96, 0x0b, 0x42, 0xc0, 0xcb,
491 0xee, 0x0f, 0x0b, 0x8c, 0xfb, 0x7e, 0x47, 0x7b,
492 0x64, 0x48, 0xfd, 0xb2, 0x00, 0x80, 0x89, 0xa5,
493 0x13, 0x55, 0x62, 0xfc, 0x8f, 0xe2, 0x42, 0x03,
494 0xb7, 0x4e, 0x2a, 0x79, 0xb4, 0x82, 0xea, 0x23,
495 0x49, 0xda, 0xaf, 0x52, 0x63, 0x1e, 0x60, 0x03,
496 0x89, 0x06, 0x44, 0x46, 0x08, 0xc3, 0xc4, 0x87,
497 0x70, 0x2e, 0xda, 0x94, 0xad, 0x6b, 0xe0, 0xe4,
498 0xd1, 0x8a, 0x06, 0xc2, 0xa8, 0xc0, 0xa7, 0x43,
499 0x3c, 0x47, 0x52, 0x0e, 0xc3, 0x77, 0x81, 0x11,
500 0x67, 0x0e, 0xa0, 0x70, 0x04, 0x47, 0x29, 0x40,
501 0x86, 0x0d, 0x34, 0x56, 0xa7, 0xc9, 0x35, 0x59,
502 0x68, 0xdc, 0x93, 0x81, 0x70, 0xee, 0x86, 0xd9,
503 0x80, 0x06, 0x40, 0x4f, 0x1a, 0x0d, 0x40, 0x30,
504 0x0b, 0xcb, 0x96, 0x47, 0xc1, 0xb7, 0x52, 0xfd,
505 0x56, 0xe0, 0x72, 0x4b, 0xfb, 0xbd, 0x92, 0x45,
506 0x61, 0x71, 0xc2, 0x33, 0x11, 0xbf, 0x52, 0x83,
507 0x79, 0x26, 0xe0, 0x49, 0x6b, 0xb7, 0x05, 0x8b,
508 0xe8, 0x0e, 0x87, 0x31, 0xd7, 0x9d, 0x8a, 0xf5,
509 0xc0, 0x5f, 0x2e, 0x58, 0x4a, 0xdb, 0x11, 0xb3,
510 0x6c, 0x30, 0x2a, 0x46, 0x19, 0xe3, 0x27, 0x84,
511 0x1f, 0x63, 0x6e, 0xf6, 0x57, 0xc7, 0xc9, 0xd8,
512 0x5e, 0xba, 0xb3, 0x87, 0xd5, 0x83, 0x26, 0x34,
513 0x21, 0x9e, 0x65, 0xde, 0x42, 0xd3, 0xbe, 0x7b,
514 0xbc, 0x91, 0x71, 0x44, 0x4d, 0x99, 0x3b, 0x31,
515 0xe5, 0x3f, 0x11, 0x4e, 0x7f, 0x13, 0x51, 0x3b,
516 0xae, 0x79, 0xc9, 0xd3, 0x81, 0x8e, 0x25, 0x40,
517 0x10, 0xfc, 0x07, 0x1e, 0xf9, 0x7b, 0x9a, 0x4b,
518 0x6c, 0xe3, 0xb3, 0xad, 0x1a, 0x0a, 0xdd, 0x9e,
519 0x59, 0x0c, 0xa2, 0xcd, 0xae, 0x48, 0x4a, 0x38,
520 0x5b, 0x47, 0x41, 0x94, 0x65, 0x6b, 0xbb, 0xeb,
521 0x5b, 0xe3, 0xaf, 0x07, 0x5b, 0xd4, 0x4a, 0xa2,
522 0xc9, 0x5d, 0x2f, 0x64, 0x03, 0xd7, 0x3a, 0x2c,
523 0x6e, 0xce, 0x76, 0x95, 0xb4, 0xb3, 0xc0, 0xf1,
524 0xe2, 0x45, 0x73, 0x7a, 0x5c, 0xab, 0xc1, 0xfc,
525 0x02, 0x8d, 0x81, 0x29, 0xb3, 0xac, 0x07, 0xec,
526 0x40, 0x7d, 0x45, 0xd9, 0x7a, 0x59, 0xee, 0x34,
527 0xf0, 0xe9, 0xd5, 0x7b, 0x96, 0xb1, 0x3d, 0x95,
528 0xcc, 0x86, 0xb5, 0xb6, 0x04, 0x2d, 0xb5, 0x92,
529 0x7e, 0x76, 0xf4, 0x06, 0xa9, 0xa3, 0x12, 0x0f,
530 0xb1, 0xaf, 0x26, 0xba, 0x7c, 0xfc, 0x7e, 0x1c,
531 0xbc, 0x2c, 0x49, 0x97, 0x53, 0x60, 0x13, 0x0b,
532 0xa6, 0x61, 0x83, 0x89, 0x42, 0xd4, 0x17, 0x0c,
533 0x6c, 0x26, 0x52, 0xc3, 0xb3, 0xd4, 0x67, 0xf5,
534 0xe3, 0x04, 0xb7, 0xf4, 0xcb, 0x80, 0xb8, 0xcb,
535 0x77, 0x56, 0x3e, 0xaa, 0x57, 0x54, 0xee, 0xb4,
536 0x2c, 0x67, 0xcf, 0xf2, 0xdc, 0xbe, 0x55, 0xf9,
537 0x43, 0x1f, 0x6e, 0x22, 0x97, 0x67, 0x7f, 0xc4,
538 0xef, 0xb1, 0x26, 0x31, 0x1e, 0x27, 0xdf, 0x41,
539 0x80, 0x47, 0x6c, 0xe2, 0xfa, 0xa9, 0x8c, 0x2a,
540 0xf6, 0xf2, 0xab, 0xf0, 0x15, 0xda, 0x6c, 0xc8,
541 0xfe, 0xb5, 0x23, 0xde, 0xa9, 0x05, 0x3f, 0x06,
542 0x54, 0x4c, 0xcd, 0xe1, 0xab, 0xfc, 0x0e, 0x62,
543 0x33, 0x31, 0x73, 0x2c, 0x76, 0xcb, 0xb4, 0x47,
544 0x1e, 0x20, 0xad, 0xd8, 0xf2, 0x31, 0xdd, 0xc4,
545 0x8b, 0x0c, 0x77, 0xbe, 0xe1, 0x8b, 0x26, 0x00,
546 0x02, 0x58, 0xd6, 0x8d, 0xef, 0xad, 0x74, 0x67,
547 0xab, 0x3f, 0xef, 0xcb, 0x6f, 0xb0, 0xcc, 0x81,
548 0x44, 0x4c, 0xaf, 0xe9, 0x49, 0x4f, 0xdb, 0xa0,
549 0x25, 0xa4, 0xf0, 0x89, 0xf1, 0xbe, 0xd8, 0x10,
550 0xff, 0xb1, 0x3b, 0x4b, 0xfa, 0x98, 0xf5, 0x79,
551 0x6d, 0x1e, 0x69, 0x4d, 0x57, 0xb1, 0xc8, 0x19,
552 0x1b, 0xbd, 0x1e, 0x8c, 0x84, 0xb7, 0x7b, 0xe8,
553 0xd2, 0x2d, 0x09, 0x41, 0x41, 0x37, 0x3d, 0xb1,
554 0x6f, 0x26, 0x5d, 0x71, 0x16, 0x3d, 0xb7, 0x83,
555 0x27, 0x2c, 0xa7, 0xb6, 0x50, 0xbd, 0x91, 0x86,
556 0xab, 0x24, 0xa1, 0x38, 0xfd, 0xea, 0x71, 0x55,
557 0x7e, 0x9a, 0x07, 0x77, 0x4b, 0xfa, 0x61, 0x66,
558 0x20, 0x1e, 0x28, 0x95, 0x18, 0x1b, 0xa4, 0xa0,
559 0xfd, 0xc0, 0x89, 0x72, 0x43, 0xd9, 0x3b, 0x49,
560 0x5a, 0x3f, 0x9d, 0xbf, 0xdb, 0xb4, 0x46, 0xea,
561 0x42, 0x01, 0x77, 0x23, 0x68, 0x95, 0xb6, 0x24,
562 0xb3, 0xa8, 0x6c, 0x28, 0x3b, 0x11, 0x40, 0x7e,
563 0x18, 0x65, 0x6d, 0xd8, 0x24, 0x42, 0x7d, 0x88,
564 0xc0, 0x52, 0xd9, 0x05, 0xe4, 0x95, 0x90, 0x87,
565 0x8c, 0xf4, 0xd0, 0x6b, 0xb9, 0x83, 0x99, 0x34,
566 0x6d, 0xfe, 0x54, 0x40, 0x94, 0x52, 0x21, 0x4f,
567 0x14, 0x25, 0xc5, 0xd6, 0x5e, 0x95, 0xdc, 0x0a,
568 0x2b, 0x89, 0x20, 0x11, 0x84, 0x48, 0xd6, 0x3a,
569 0xcd, 0x5c, 0x24, 0xad, 0x62, 0xe3, 0xb1, 0x93,
570 0x25, 0x8d, 0xcd, 0x7e, 0xfc, 0x27, 0xa3, 0x37,
571 0xfd, 0x84, 0xfc, 0x1b, 0xb2, 0xf1, 0x27, 0x38,
572 0x5a, 0xb7, 0xfc, 0xf2, 0xfa, 0x95, 0x66, 0xd4,
573 0xfb, 0xba, 0xa7, 0xd7, 0xa3, 0x72, 0x69, 0x48,
574 0x48, 0x8c, 0xeb, 0x28, 0x89, 0xfe, 0x33, 0x65,
575 0x5a, 0x36, 0x01, 0x7e, 0x06, 0x79, 0x0a, 0x09,
576 0x3b, 0x74, 0x11, 0x9a, 0x6e, 0xbf, 0xd4, 0x9e,
577 0x58, 0x90, 0x49, 0x4f, 0x4d, 0x08, 0xd4, 0xe5,
578 0x4a, 0x09, 0x21, 0xef, 0x8b, 0xb8, 0x74, 0x3b,
579 0x91, 0xdd, 0x36, 0x85, 0x60, 0x2d, 0xfa, 0xd4,
580 0x45, 0x7b, 0x45, 0x53, 0xf5, 0x47, 0x87, 0x7e,
581 0xa6, 0x37, 0xc8, 0x78, 0x7a, 0x68, 0x9d, 0x8d,
582 0x65, 0x2c, 0x0e, 0x91, 0x5c, 0xa2, 0x60, 0xf0,
583 0x8e, 0x3f, 0xe9, 0x1a, 0xcd, 0xaa, 0xe7, 0xd5,
584 0x77, 0x18, 0xaf, 0xc9, 0xbc, 0x18, 0xea, 0x48,
585 0x1b, 0xfb, 0x22, 0x48, 0x70, 0x16, 0x29, 0x9e,
586 0x5b, 0xc1, 0x2c, 0x66, 0x23, 0xbc, 0xf0, 0x1f,
587 0xef, 0xaf, 0xe4, 0xd6, 0x04, 0x19, 0x82, 0x7a,
588 0x0b, 0xba, 0x4b, 0x46, 0xb1, 0x6a, 0x85, 0x5d,
589 0xb4, 0x73, 0xd6, 0x21, 0xa1, 0x71, 0x60, 0x14,
590 0xee, 0x0a, 0x77, 0xc4, 0x66, 0x2e, 0xf9, 0x69,
591 0x30, 0xaf, 0x41, 0x0b, 0xc8, 0x83, 0x3c, 0x53,
592 0x99, 0x19, 0x27, 0x46, 0xf7, 0x41, 0x6e, 0x56,
593 0xdc, 0x94, 0x28, 0x67, 0x4e, 0xb7, 0x25, 0x48,
594 0x8a, 0xc2, 0xe0, 0x60, 0x96, 0xcc, 0x18, 0xf4,
595 0x84, 0xdd, 0xa7, 0x5e, 0x3e, 0x05, 0x0b, 0x26,
596 0x26, 0xb2, 0x5c, 0x1f, 0x57, 0x1a, 0x04, 0x7e,
597 0x6a, 0xe3, 0x2f, 0xb4, 0x35, 0xb6, 0x38, 0x40,
598 0x40, 0xcd, 0x6f, 0x87, 0x2e, 0xef, 0xa3, 0xd7,
599 0xa9, 0xc2, 0xe8, 0x0d, 0x27, 0xdf, 0x44, 0x62,
600 0x99, 0xa0, 0xfc, 0xcf, 0x81, 0x78, 0xcb, 0xfe,
601 0xe5, 0xa0, 0x03, 0x4e, 0x6c, 0xd7, 0xf4, 0xaf,
602 0x7a, 0xbb, 0x61, 0x82, 0xfe, 0x71, 0x89, 0xb2,
603 0x22, 0x7c, 0x8e, 0x83, 0x04, 0xce, 0xf6, 0x5d,
604 0x84, 0x8f, 0x95, 0x6a, 0x7f, 0xad, 0xfd, 0x32,
605 0x9c, 0x5e, 0xe4, 0x9c, 0x89, 0x60, 0x54, 0xaa,
606 0x96, 0x72, 0xd2, 0xd7, 0x36, 0x85, 0xa9, 0x45,
607 0xd2, 0x2a, 0xa1, 0x81, 0x49, 0x6f, 0x7e, 0x04,
608 0xfa, 0xe2, 0xfe, 0x90, 0x26, 0x77, 0x5a, 0x33,
609 0xb8, 0x04, 0x9a, 0x7a, 0xe6, 0x4c, 0x4f, 0xad,
610 0x72, 0x96, 0x08, 0x28, 0x58, 0x13, 0xf8, 0xc4,
611 0x1c, 0xf0, 0xc3, 0x45, 0x95, 0x49, 0x20, 0x8c,
612 0x9f, 0x39, 0x70, 0xe1, 0x77, 0xfe, 0xd5, 0x4b,
613 0xaf, 0x86, 0xda, 0xef, 0x22, 0x06, 0x83, 0x36,
614 0x29, 0x12, 0x11, 0x40, 0xbc, 0x3b, 0x86, 0xaa,
615 0xaa, 0x65, 0x60, 0xc3, 0x80, 0xca, 0xed, 0xa9,
616 0xf3, 0xb0, 0x79, 0x96, 0xa2, 0x55, 0x27, 0x28,
617 0x55, 0x73, 0x26, 0xa5, 0x50, 0xea, 0x92, 0x4b,
618 0x3c, 0x5c, 0x82, 0x33, 0xf0, 0x01, 0x3f, 0x03,
619 0xc1, 0x08, 0x05, 0xbf, 0x98, 0xf4, 0x9b, 0x6d,
620 0xa5, 0xa8, 0xb4, 0x82, 0x0c, 0x06, 0xfa, 0xff,
621 0x2d, 0x08, 0xf3, 0x05, 0x4f, 0x57, 0x2a, 0x39,
622 0xd4, 0x83, 0x0d, 0x75, 0x51, 0xd8, 0x5b, 0x1b,
623 0xd3, 0x51, 0x5a, 0x32, 0x2a, 0x9b, 0x32, 0xb2,
624 0xf2, 0xa4, 0x96, 0x12, 0xf2, 0xae, 0x40, 0x34,
625 0x67, 0xa8, 0xf5, 0x44, 0xd5, 0x35, 0x53, 0xfe,
626 0xa3, 0x60, 0x96, 0x63, 0x0f, 0x1f, 0x6e, 0xb0,
627 0x5a, 0x42, 0xa6, 0xfc, 0x51, 0x0b, 0x60, 0x27,
628 0xbc, 0x06, 0x71, 0xed, 0x65, 0x5b, 0x23, 0x86,
629 0x4a, 0x07, 0x3b, 0x22, 0x07, 0x46, 0xe6, 0x90,
630 0x3e, 0xf3, 0x25, 0x50, 0x1b, 0x4c, 0x7f, 0x03,
631 0x08, 0xa8, 0x36, 0x6b, 0x87, 0xe5, 0xe3, 0xdb,
632 0x9a, 0x38, 0x83, 0xff, 0x9f, 0x1a, 0x9f, 0x57,
633 0xa4, 0x2a, 0xf6, 0x37, 0xbc, 0x1a, 0xff, 0xc9,
634 0x1e, 0x35, 0x0c, 0xc3, 0x7c, 0xa3, 0xb2, 0xe5,
635 0xd2, 0xc6, 0xb4, 0x57, 0x47, 0xe4, 0x32, 0x16,
636 0x6d, 0xa9, 0xae, 0x64, 0xe6, 0x2d, 0x8d, 0xc5,
637 0x8d, 0x50, 0x8e, 0xe8, 0x1a, 0x22, 0x34, 0x2a,
638 0xd9, 0xeb, 0x51, 0x90, 0x4a, 0xb1, 0x41, 0x7d,
639 0x64, 0xf9, 0xb9, 0x0d, 0xf6, 0x23, 0x33, 0xb0,
640 0x33, 0xf4, 0xf7, 0x3f, 0x27, 0x84, 0xc6, 0x0f,
641 0x54, 0xa5, 0xc0, 0x2e, 0xec, 0x0b, 0x3a, 0x48,
642 0x6e, 0x80, 0x35, 0x81, 0x43, 0x9b, 0x90, 0xb1,
643 0xd0, 0x2b, 0xea, 0x21, 0xdc, 0xda, 0x5b, 0x09,
644 0xf4, 0xcc, 0x10, 0xb4, 0xc7, 0xfe, 0x79, 0x51,
645 0xc3, 0xc5, 0xac, 0x88, 0x74, 0x84, 0x0b, 0x4b,
646 0xca, 0x79, 0x16, 0x29, 0xfb, 0x69, 0x54, 0xdf,
647 0x41, 0x7e, 0xe9, 0xc7, 0x8e, 0xea, 0xa5, 0xfe,
648 0xfc, 0x76, 0x0e, 0x90, 0xc4, 0x92, 0x38, 0xad,
649 0x7b, 0x48, 0xe6, 0x6e, 0xf7, 0x21, 0xfd, 0x4e,
650 0x93, 0x0a, 0x7b, 0x41, 0x83, 0x68, 0xfb, 0x57,
651 0x51, 0x76, 0x34, 0xa9, 0x6c, 0x00, 0xaa, 0x4f,
652 0x66, 0x65, 0x98, 0x4a, 0x4f, 0xa3, 0xa0, 0xef,
653 0x69, 0x3f, 0xe3, 0x1c, 0x92, 0x8c, 0xfd, 0xd8,
654 0xe8, 0xde, 0x7c, 0x7f, 0x3e, 0x84, 0x8e, 0x69,
655 0x3c, 0xf1, 0xf2, 0x05, 0x46, 0xdc, 0x2f, 0x9d,
656 0x5e, 0x6e, 0x4c, 0xfb, 0xb5, 0x99, 0x2a, 0x59,
657 0x63, 0xc1, 0x34, 0xbc, 0x57, 0xc0, 0x0d, 0xb9,
658 0x61, 0x25, 0xf3, 0x33, 0x23, 0x51, 0xb6, 0x0d,
659 0x07, 0xa6, 0xab, 0x94, 0x4a, 0xb7, 0x2a, 0xea,
660 0xee, 0xac, 0xa3, 0xc3, 0x04, 0x8b, 0x0e, 0x56,
661 0xfe, 0x44, 0xa7, 0x39, 0xe2, 0xed, 0xed, 0xb4,
662 0x22, 0x2b, 0xac, 0x12, 0x32, 0x28, 0x91, 0xd8,
663 0xa5, 0xab, 0xff, 0x5f, 0xe0, 0x4b, 0xda, 0x78,
664 0x17, 0xda, 0xf1, 0x01, 0x5b, 0xcd, 0xe2, 0x5f,
665 0x50, 0x45, 0x73, 0x2b, 0xe4, 0x76, 0x77, 0xf4,
666 0x64, 0x1d, 0x43, 0xfb, 0x84, 0x7a, 0xea, 0x91,
667 0xae, 0xf9, 0x9e, 0xb7, 0xb4, 0xb0, 0x91, 0x5f,
668 0x16, 0x35, 0x9a, 0x11, 0xb8, 0xc7, 0xc1, 0x8c,
669 0xc6, 0x10, 0x8d, 0x2f, 0x63, 0x4a, 0xa7, 0x57,
670 0x3a, 0x51, 0xd6, 0x32, 0x2d, 0x64, 0x72, 0xd4,
671 0x66, 0xdc, 0x10, 0xa6, 0x67, 0xd6, 0x04, 0x23,
672 0x9d, 0x0a, 0x11, 0x77, 0xdd, 0x37, 0x94, 0x17,
673 0x3c, 0xbf, 0x8b, 0x65, 0xb0, 0x2e, 0x5e, 0x66,
674 0x47, 0x64, 0xac, 0xdd, 0xf0, 0x84, 0xfd, 0x39,
675 0xfa, 0x15, 0x5d, 0xef, 0xae, 0xca, 0xc1, 0x36,
676 0xa7, 0x5c, 0xbf, 0xc7, 0x08, 0xc2, 0x66, 0x00,
677 0x74, 0x74, 0x4e, 0x27, 0x3f, 0x55, 0x8a, 0xb7,
678 0x38, 0x66, 0x83, 0x6d, 0xcf, 0x99, 0x9e, 0x60,
679 0x8f, 0xdd, 0x2e, 0x62, 0x22, 0x0e, 0xef, 0x0c,
680 0x98, 0xa7, 0x85, 0x74, 0x3b, 0x9d, 0xec, 0x9e,
681 0xa9, 0x19, 0x72, 0xa5, 0x7f, 0x2c, 0x39, 0xb7,
682 0x7d, 0xb7, 0xf1, 0x12, 0x65, 0x27, 0x4b, 0x5a,
683 0xde, 0x17, 0xfe, 0xad, 0x44, 0xf3, 0x20, 0x4d,
684 0xfd, 0xe4, 0x1f, 0xb5, 0x81, 0xb0, 0x36, 0x37,
685 0x08, 0x6f, 0xc3, 0x0c, 0xe9, 0x85, 0x98, 0x82,
686 0xa9, 0x62, 0x0c, 0xc4, 0x97, 0xc0, 0x50, 0xc8,
687 0xa7, 0x3c, 0x50, 0x9f, 0x43, 0xb9, 0xcd, 0x5e,
688 0x4d, 0xfa, 0x1c, 0x4b, 0x0b, 0xa9, 0x98, 0x85,
689 0x38, 0x92, 0xac, 0x8d, 0xe4, 0xad, 0x9b, 0x98,
690 0xab, 0xd9, 0x38, 0xac, 0x62, 0x52, 0xa3, 0x22,
691 0x63, 0x0f, 0xbf, 0x95, 0x48, 0xdf, 0x69, 0xe7,
692 0x8b, 0x33, 0xd5, 0xb2, 0xbd, 0x05, 0x49, 0x49,
693 0x9d, 0x57, 0x73, 0x19, 0x33, 0xae, 0xfa, 0x33,
694 0xf1, 0x19, 0xa8, 0x80, 0xce, 0x04, 0x9f, 0xbc,
695 0x1d, 0x65, 0x82, 0x1b, 0xe5, 0x3a, 0x51, 0xc8,
696 0x1c, 0x21, 0xe3, 0x5d, 0xf3, 0x7d, 0x9b, 0x2f,
697 0x2c, 0x1d, 0x4a, 0x7f, 0x9b, 0x68, 0x35, 0xa3,
698 0xb2, 0x50, 0xf7, 0x62, 0x79, 0xcd, 0xf4, 0x98,
699 0x4f, 0xe5, 0x63, 0x7c, 0x3e, 0x45, 0x31, 0x8c,
700 0x16, 0xa0, 0x12, 0xc8, 0x58, 0xce, 0x39, 0xa6,
701 0xbc, 0x54, 0xdb, 0xc5, 0xe0, 0xd5, 0xba, 0xbc,
702 0xb9, 0x04, 0xf4, 0x8d, 0xe8, 0x2f, 0x15, 0x9d,
703 };
704
705 /* 100 test cases */
706 static struct crc_test {
707 u32 crc; /* random starting crc */
708 u32 start; /* random 6 bit offset in buf */
709 u32 length; /* random 11 bit length of test */
710 u32 crc32c_le; /* expected crc32c_le result */
711 } test[] =
712 {
713 {0x674bf11d, 0x00000038, 0x00000542, 0xf6e93d6c},
714 {0x35c672c6, 0x0000003a, 0x000001aa, 0x0fe92aca},
715 {0x496da28e, 0x00000039, 0x000005af, 0x52e1ebb8},
716 {0x09a9b90e, 0x00000027, 0x000001f8, 0x0798af9a},
717 {0xdc97e5a9, 0x00000025, 0x000003b6, 0x18eb3152},
718 {0x47c58900, 0x0000000a, 0x000000b9, 0xd00d08c7},
719 {0x292561e8, 0x0000000c, 0x00000403, 0x8ba966bc},
720 {0x415037f6, 0x00000003, 0x00000676, 0x11d694a2},
721 {0x3466e707, 0x00000026, 0x00000042, 0x6ab3208d},
722 {0xafd1281b, 0x00000023, 0x000002ee, 0xba4603c5},
723 {0xd3857b18, 0x00000028, 0x000004a2, 0xe6071c6f},
724 {0x1d825a8f, 0x0000002b, 0x0000050b, 0x179ec30a},
725 {0x5033e3bc, 0x0000000b, 0x00000078, 0x0903beb8},
726 {0x94f1fb5e, 0x0000000f, 0x000003a2, 0x6a7cb4fa},
727 {0xc9a0fe14, 0x00000009, 0x00000473, 0xdb535801},
728 {0x88a034b1, 0x0000001c, 0x000005ad, 0x92bed597},
729 {0xf0f72239, 0x00000020, 0x0000026d, 0x192a3f1b},
730 {0xcc20a5e3, 0x0000003b, 0x0000067a, 0xccbaec1a},
731 {0xce589c95, 0x0000002b, 0x00000641, 0x7eabae4d},
732 {0x78edc885, 0x00000035, 0x000005be, 0x28c72982},
733 {0x9d40a377, 0x0000003b, 0x00000038, 0xc3cd4d18},
734 {0x703d0e01, 0x0000003c, 0x000006f1, 0xbca8f0e7},
735 {0x776bf505, 0x0000000f, 0x000005b2, 0x713f60b3},
736 {0x4a3e7854, 0x00000027, 0x000004b8, 0xebd08fd5},
737 {0x209172dd, 0x0000003b, 0x00000356, 0x64406c59},
738 {0x3ba4cc5b, 0x0000002f, 0x00000203, 0x7421890e},
739 {0xfc62f297, 0x00000000, 0x00000079, 0xe9347603},
740 {0x64280b8b, 0x00000016, 0x000007ab, 0x1bef9060},
741 {0x97dd724b, 0x00000033, 0x000007ad, 0x34720072},
742 {0x61394b52, 0x00000035, 0x00000571, 0x48310f59},
743 {0x29b4faff, 0x00000024, 0x0000006e, 0x783a4213},
744 {0x29bfb1dc, 0x0000000b, 0x00000244, 0x9e8efd41},
745 {0x86ae934b, 0x00000035, 0x00000104, 0xfc3d34a5},
746 {0xc4c1024e, 0x0000002e, 0x000006b1, 0x17a52ae2},
747 {0x3287a80a, 0x00000026, 0x00000496, 0x886d935a},
748 {0xa4db423e, 0x00000023, 0x0000045d, 0xeaaeaeb2},
749 {0x7a1078df, 0x00000015, 0x0000014a, 0x8e900a4b},
750 {0x6048bd5b, 0x00000006, 0x0000006a, 0xd74662b1},
751 {0xd8f9ea20, 0x0000003d, 0x00000277, 0xd26752ba},
752 {0xea5ec3b4, 0x0000002a, 0x000004fe, 0x8b1fcd62},
753 {0x2dfb005d, 0x00000016, 0x00000345, 0xf54342fe},
754 {0x5a214ade, 0x00000020, 0x000005b6, 0x5b95b988},
755 {0xf0ab9cca, 0x00000032, 0x00000515, 0x2e1176be},
756 {0x91b444f9, 0x0000002e, 0x000007f8, 0x66120546},
757 {0x1b5d2ddb, 0x0000002e, 0x0000012c, 0xf256a5cc},
758 {0xd824d1bb, 0x0000003a, 0x000007b5, 0x4af1dd69},
759 {0x0470180c, 0x00000034, 0x000001f0, 0x56f0a04a},
760 {0xffaa3a3f, 0x00000036, 0x00000299, 0x74f6b6b2},
761 {0x6406cfeb, 0x00000023, 0x00000600, 0x085951fd},
762 {0xb24aaa38, 0x0000003e, 0x000004a1, 0xc65387eb},
763 {0x58b2ab7c, 0x00000039, 0x000002b4, 0x1ca9257b},
764 {0x3db85970, 0x00000006, 0x000002b6, 0xfd196d76},
765 {0x857830c5, 0x00000003, 0x00000590, 0x5ef88339},
766 {0xe1fcd978, 0x0000003e, 0x000007d8, 0x2c3714d9},
767 {0xb982a768, 0x00000016, 0x000006e0, 0x58576548},
768 {0x1d581ce8, 0x0000001e, 0x0000058b, 0xfd7c57de},
769 {0x2456719b, 0x00000025, 0x00000503, 0xd5fedd59},
770 {0xfae6d8f2, 0x00000000, 0x0000055d, 0x1cc3b17b},
771 {0xcba828e3, 0x00000039, 0x000002ce, 0x270eed73},
772 {0x13d25952, 0x0000000a, 0x0000072d, 0x91ecbb11},
773 {0x0342be3f, 0x00000015, 0x00000599, 0x05ed8d0c},
774 {0xeaa344e0, 0x00000014, 0x000004d8, 0x0b09ad5b},
775 {0xbbb52021, 0x0000003b, 0x00000272, 0xf8d511fb},
776 {0xb66384dc, 0x0000001d, 0x000007fc, 0x5ad832cc},
777 {0x616c01b6, 0x00000022, 0x000002c8, 0x1214d196},
778 {0xce2bdaad, 0x00000016, 0x0000062a, 0x5747218a},
779 {0x00fe84d7, 0x00000005, 0x00000205, 0xde8f14de},
780 {0xbebdcb4c, 0x00000006, 0x0000055d, 0x3563b7b9},
781 {0xd8b1a02a, 0x00000010, 0x00000387, 0x071475d0},
782 {0x3b96cad2, 0x00000036, 0x00000347, 0x54c79d60},
783 {0xc94c1ed7, 0x00000005, 0x0000038b, 0x4c53eee6},
784 {0x1aad454e, 0x00000025, 0x000002b2, 0x10137a3c},
785 {0xa4fec9a6, 0x00000000, 0x000006d6, 0xaa9d6c73},
786 {0x1bbe71e2, 0x0000001f, 0x000002fd, 0xb63d23e7},
787 {0x4201c7e4, 0x00000002, 0x000002b7, 0x7f53e9cf},
788 {0x23fddc96, 0x00000003, 0x00000627, 0x13c1cd83},
789 {0xd82ba25c, 0x00000016, 0x0000063e, 0x49ff5867},
790 {0x786f2032, 0x0000002d, 0x0000060f, 0x8467f211},
791 {0xfebe4e1f, 0x0000002a, 0x000004f2, 0x3f9683b2},
792 {0x1a6e0a39, 0x00000008, 0x00000672, 0x76a3f874},
793 {0x56000ab8, 0x0000000e, 0x000000e5, 0x863b702f},
794 {0x4717fe0c, 0x00000000, 0x000006ec, 0xdc6c58ff},
795 {0xd5d5d68e, 0x0000003c, 0x000003a3, 0x0622cc95},
796 {0xc25dd6c6, 0x00000024, 0x000006c0, 0xe85605cd},
797 {0xe9b11300, 0x00000023, 0x00000683, 0x31da5f06},
798 {0x95cd285e, 0x00000001, 0x00000047, 0xa1f2e784},
799 {0xd9245a25, 0x0000001e, 0x000003a6, 0xb07cc616},
800 {0x103279db, 0x00000006, 0x0000039b, 0xbf943b6c},
801 {0x1cba3172, 0x00000027, 0x000001c8, 0x2c01af1c},
802 {0x8f613739, 0x0000000c, 0x000001df, 0x0fe5f56d},
803 {0x1c6aa90d, 0x0000001b, 0x0000053c, 0xf8943b2d},
804 {0xaabe5b93, 0x0000003d, 0x00000715, 0xe4d89272},
805 {0xf15dd038, 0x00000006, 0x000006db, 0x7c2f6bbb},
806 {0x584dd49c, 0x00000020, 0x000007bc, 0xabbf388b},
807 {0x5d8c9506, 0x00000020, 0x00000470, 0x1dca1f4e},
808 {0xb80d17b0, 0x00000032, 0x00000346, 0x5c170e23},
809 {0xdaf0592e, 0x00000023, 0x000007b0, 0xc0e9d672},
810 {0x4793cc85, 0x0000000d, 0x00000706, 0xc18bdc86},
811 {0x82ebf64e, 0x00000009, 0x000007c3, 0xa874fcdd},
812 {0xb18a0319, 0x00000026, 0x000007db, 0x9dc0bb48},
813 };
814
815 static int crc32c_test(void)
816 {
817 int i;
818 int errors = 0;
819 int bytes = 0;
820 struct timeval start, stop;
821 uint64_t usec;
822
823 /* keep static to prevent cache warming code from
824 * getting eliminated by the compiler */
825 static u32 crc;
826
827 /* pre-warm the cache */
828 for (i = 0; i < 100; i++) {
829 bytes += 2*test[i].length;
830
831 crc ^= crc32c_le(test[i].crc, test_buf +
832 test[i].start, test[i].length);
833 }
834
835 gettimeofday(&start, NULL);
836 for (i = 0; i < 100; i++) {
837 if (test[i].crc32c_le != crc32c_le(test[i].crc, test_buf +
838 test[i].start, test[i].length))
839 errors++;
840 }
841 gettimeofday(&stop, NULL);
842
843 usec = stop.tv_usec - start.tv_usec +
844 1000000 * (stop.tv_sec - start.tv_sec);
845
846 if (errors)
847 printf("crc32c: %d self tests failed\n", errors);
848 else {
849 printf("crc32c: tests passed, %d bytes in %" PRIu64 " usec\n",
850 bytes, usec);
851 }
852
853 return errors;
854 }
855
856 /*
857 * make sure we always return 0 for a successful test run, and non-zero for a
858 * failed run. The build infrastructure is looking for this information to
859 * determine whether to allow the build to proceed.
860 */
861 int main(int argc, char **argv)
862 {
863 int errors;
864
865 printf("CRC_LE_BITS = %d\n", CRC_LE_BITS);
866
867 errors = crc32c_test();
868
869 return errors != 0;
870 }
871 #endif /* CRC32_SELFTEST */