1 /*
2  * Copyright (C) 2011 Andrea Mazzoleni
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include "portable.h"
19 
20 #include "support.h"
21 #include "util.h"
22 #include "raid/cpu.h"
23 #include "raid/memory.h"
24 
25 /****************************************************************************/
26 /* memory */
27 
malloc_nofail_align(size_t size,void ** freeptr)28 void* malloc_nofail_align(size_t size, void** freeptr)
29 {
30 	void* ptr;
31 
32 	ptr = raid_malloc(size, freeptr);
33 
34 	if (!ptr) {
35 		/* LCOV_EXCL_START */
36 		malloc_fail(size);
37 		exit(EXIT_FAILURE);
38 		/* LCOV_EXCL_STOP */
39 	}
40 
41 	return ptr;
42 }
43 
malloc_nofail_direct(size_t size,void ** freeptr)44 void* malloc_nofail_direct(size_t size, void** freeptr)
45 {
46 	void* ptr;
47 
48 	ptr = raid_malloc_align(size, direct_size(), freeptr);
49 
50 	if (!ptr) {
51 		/* LCOV_EXCL_START */
52 		malloc_fail(size);
53 		exit(EXIT_FAILURE);
54 		/* LCOV_EXCL_STOP */
55 	}
56 
57 	return ptr;
58 }
59 
malloc_nofail_vector_align(int nd,int n,size_t size,void ** freeptr)60 void** malloc_nofail_vector_align(int nd, int n, size_t size, void** freeptr)
61 {
62 	void* ptr;
63 
64 	ptr = raid_malloc_vector(nd, n, size, freeptr);
65 
66 	if (!ptr) {
67 		/* LCOV_EXCL_START */
68 		malloc_fail(n * size);
69 		exit(EXIT_FAILURE);
70 		/* LCOV_EXCL_STOP */
71 	}
72 
73 	return ptr;
74 }
75 
malloc_nofail_vector_direct(int nd,int n,size_t size,void ** freeptr)76 void** malloc_nofail_vector_direct(int nd, int n, size_t size, void** freeptr)
77 {
78 	void* ptr;
79 
80 	ptr = raid_malloc_vector_align(nd, n, size, direct_size(), 0, freeptr);
81 
82 	if (!ptr) {
83 		/* LCOV_EXCL_START */
84 		malloc_fail(n * size);
85 		exit(EXIT_FAILURE);
86 		/* LCOV_EXCL_STOP */
87 	}
88 
89 	return ptr;
90 }
91 
malloc_nofail_test(size_t size)92 void* malloc_nofail_test(size_t size)
93 {
94 	void* ptr;
95 
96 	ptr = malloc_nofail(size);
97 
98 	mtest_vector(1, size, &ptr);
99 
100 	return ptr;
101 }
102 
103 /**
104  * Fast memory test.
105  *
106  * It's similar at raid_mtest_vector() but faster because
107  * we have a lot of buffers to verify.
108  */
fast_mtest_vector(int n,size_t size,void ** vv)109 static int fast_mtest_vector(int n, size_t size, void** vv)
110 {
111 	int i, j;
112 
113 	/* test with all the bits */
114 	for (i = 0; i < 8; ++i) {
115 		unsigned char value = 1 << i;
116 
117 		/* fill first */
118 		memset(vv[0], value, size);
119 
120 		/* copy to the next */
121 		for (j = 1; j < n; ++j)
122 			memcpy(vv[j], vv[j - 1], size);
123 
124 		/* compare with the previous */
125 		for (j = 1; j <= n; ++j)
126 			if (memcmp(vv[j % n], vv[j - 1], size) != 0)
127 				return -1;
128 	}
129 
130 	return 0;
131 }
132 
mtest_vector(int n,size_t size,void ** vv)133 void mtest_vector(int n, size_t size, void** vv)
134 {
135 	if (fast_mtest_vector(n, size, vv) != 0) {
136 		/* LCOV_EXCL_START */
137 		log_fatal("DANGER! Your RAM memory is broken! DO NOT PROCEED UNTIL FIXED!\n");
138 		log_fatal("Try running a memory test like http://www.memtest86.com/\n");
139 		exit(EXIT_FAILURE);
140 		/* LCOV_EXCL_STOP */
141 	}
142 }
143 
144 /****************************************************************************/
145 /* crc */
146 
147 uint32_t CRC32C_0[256] = {
148 	0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4,
149 	0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
150 	0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b,
151 	0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
152 	0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b,
153 	0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
154 	0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54,
155 	0x5d1d08bf, 0xaf768bbc, 0xbc267848, 0x4e4dfb4b,
156 	0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
157 	0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35,
158 	0xaa64d611, 0x580f5512, 0x4b5fa6e6, 0xb93425e5,
159 	0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
160 	0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45,
161 	0xf779deae, 0x05125dad, 0x1642ae59, 0xe4292d5a,
162 	0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a,
163 	0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595,
164 	0x417b1dbc, 0xb3109ebf, 0xa0406d4b, 0x522bee48,
165 	0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957,
166 	0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687,
167 	0x0c38d26c, 0xfe53516f, 0xed03a29b, 0x1f682198,
168 	0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
169 	0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38,
170 	0xdbfc821c, 0x2997011f, 0x3ac7f2eb, 0xc8ac71e8,
171 	0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
172 	0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096,
173 	0xa65c047d, 0x5437877e, 0x4767748a, 0xb50cf789,
174 	0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859,
175 	0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46,
176 	0x7198540d, 0x83f3d70e, 0x90a324fa, 0x62c8a7f9,
177 	0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6,
178 	0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36,
179 	0x3cdb9bdd, 0xceb018de, 0xdde0eb2a, 0x2f8b6829,
180 	0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
181 	0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93,
182 	0x082f63b7, 0xfa44e0b4, 0xe9141340, 0x1b7f9043,
183 	0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
184 	0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3,
185 	0x55326b08, 0xa759e80b, 0xb4091bff, 0x466298fc,
186 	0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
187 	0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033,
188 	0xa24bb5a6, 0x502036a5, 0x4370c551, 0xb11b4652,
189 	0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d,
190 	0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d,
191 	0xef087a76, 0x1d63f975, 0x0e330a81, 0xfc588982,
192 	0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d,
193 	0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622,
194 	0x38cc2a06, 0xcaa7a905, 0xd9f75af1, 0x2b9cd9f2,
195 	0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
196 	0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530,
197 	0x0417b1db, 0xf67c32d8, 0xe52cc12c, 0x1747422f,
198 	0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
199 	0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0,
200 	0xd3d3e1ab, 0x21b862a8, 0x32e8915c, 0xc083125f,
201 	0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,
202 	0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90,
203 	0x9e902e7b, 0x6cfbad78, 0x7fab5e8c, 0x8dc0dd8f,
204 	0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee,
205 	0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1,
206 	0x69e9f0d5, 0x9b8273d6, 0x88d28022, 0x7ab90321,
207 	0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e,
208 	0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81,
209 	0x34f4f86a, 0xc69f7b69, 0xd5cf889d, 0x27a40b9e,
210 	0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
211 	0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351
212 };
213 
214 uint32_t CRC32C_1[256] = {
215 	0x00000000, 0x13a29877, 0x274530ee, 0x34e7a899,
216 	0x4e8a61dc, 0x5d28f9ab, 0x69cf5132, 0x7a6dc945,
217 	0x9d14c3b8, 0x8eb65bcf, 0xba51f356, 0xa9f36b21,
218 	0xd39ea264, 0xc03c3a13, 0xf4db928a, 0xe7790afd,
219 	0x3fc5f181, 0x2c6769f6, 0x1880c16f, 0x0b225918,
220 	0x714f905d, 0x62ed082a, 0x560aa0b3, 0x45a838c4,
221 	0xa2d13239, 0xb173aa4e, 0x859402d7, 0x96369aa0,
222 	0xec5b53e5, 0xfff9cb92, 0xcb1e630b, 0xd8bcfb7c,
223 	0x7f8be302, 0x6c297b75, 0x58ced3ec, 0x4b6c4b9b,
224 	0x310182de, 0x22a31aa9, 0x1644b230, 0x05e62a47,
225 	0xe29f20ba, 0xf13db8cd, 0xc5da1054, 0xd6788823,
226 	0xac154166, 0xbfb7d911, 0x8b507188, 0x98f2e9ff,
227 	0x404e1283, 0x53ec8af4, 0x670b226d, 0x74a9ba1a,
228 	0x0ec4735f, 0x1d66eb28, 0x298143b1, 0x3a23dbc6,
229 	0xdd5ad13b, 0xcef8494c, 0xfa1fe1d5, 0xe9bd79a2,
230 	0x93d0b0e7, 0x80722890, 0xb4958009, 0xa737187e,
231 	0xff17c604, 0xecb55e73, 0xd852f6ea, 0xcbf06e9d,
232 	0xb19da7d8, 0xa23f3faf, 0x96d89736, 0x857a0f41,
233 	0x620305bc, 0x71a19dcb, 0x45463552, 0x56e4ad25,
234 	0x2c896460, 0x3f2bfc17, 0x0bcc548e, 0x186eccf9,
235 	0xc0d23785, 0xd370aff2, 0xe797076b, 0xf4359f1c,
236 	0x8e585659, 0x9dface2e, 0xa91d66b7, 0xbabffec0,
237 	0x5dc6f43d, 0x4e646c4a, 0x7a83c4d3, 0x69215ca4,
238 	0x134c95e1, 0x00ee0d96, 0x3409a50f, 0x27ab3d78,
239 	0x809c2506, 0x933ebd71, 0xa7d915e8, 0xb47b8d9f,
240 	0xce1644da, 0xddb4dcad, 0xe9537434, 0xfaf1ec43,
241 	0x1d88e6be, 0x0e2a7ec9, 0x3acdd650, 0x296f4e27,
242 	0x53028762, 0x40a01f15, 0x7447b78c, 0x67e52ffb,
243 	0xbf59d487, 0xacfb4cf0, 0x981ce469, 0x8bbe7c1e,
244 	0xf1d3b55b, 0xe2712d2c, 0xd69685b5, 0xc5341dc2,
245 	0x224d173f, 0x31ef8f48, 0x050827d1, 0x16aabfa6,
246 	0x6cc776e3, 0x7f65ee94, 0x4b82460d, 0x5820de7a,
247 	0xfbc3faf9, 0xe861628e, 0xdc86ca17, 0xcf245260,
248 	0xb5499b25, 0xa6eb0352, 0x920cabcb, 0x81ae33bc,
249 	0x66d73941, 0x7575a136, 0x419209af, 0x523091d8,
250 	0x285d589d, 0x3bffc0ea, 0x0f186873, 0x1cbaf004,
251 	0xc4060b78, 0xd7a4930f, 0xe3433b96, 0xf0e1a3e1,
252 	0x8a8c6aa4, 0x992ef2d3, 0xadc95a4a, 0xbe6bc23d,
253 	0x5912c8c0, 0x4ab050b7, 0x7e57f82e, 0x6df56059,
254 	0x1798a91c, 0x043a316b, 0x30dd99f2, 0x237f0185,
255 	0x844819fb, 0x97ea818c, 0xa30d2915, 0xb0afb162,
256 	0xcac27827, 0xd960e050, 0xed8748c9, 0xfe25d0be,
257 	0x195cda43, 0x0afe4234, 0x3e19eaad, 0x2dbb72da,
258 	0x57d6bb9f, 0x447423e8, 0x70938b71, 0x63311306,
259 	0xbb8de87a, 0xa82f700d, 0x9cc8d894, 0x8f6a40e3,
260 	0xf50789a6, 0xe6a511d1, 0xd242b948, 0xc1e0213f,
261 	0x26992bc2, 0x353bb3b5, 0x01dc1b2c, 0x127e835b,
262 	0x68134a1e, 0x7bb1d269, 0x4f567af0, 0x5cf4e287,
263 	0x04d43cfd, 0x1776a48a, 0x23910c13, 0x30339464,
264 	0x4a5e5d21, 0x59fcc556, 0x6d1b6dcf, 0x7eb9f5b8,
265 	0x99c0ff45, 0x8a626732, 0xbe85cfab, 0xad2757dc,
266 	0xd74a9e99, 0xc4e806ee, 0xf00fae77, 0xe3ad3600,
267 	0x3b11cd7c, 0x28b3550b, 0x1c54fd92, 0x0ff665e5,
268 	0x759baca0, 0x663934d7, 0x52de9c4e, 0x417c0439,
269 	0xa6050ec4, 0xb5a796b3, 0x81403e2a, 0x92e2a65d,
270 	0xe88f6f18, 0xfb2df76f, 0xcfca5ff6, 0xdc68c781,
271 	0x7b5fdfff, 0x68fd4788, 0x5c1aef11, 0x4fb87766,
272 	0x35d5be23, 0x26772654, 0x12908ecd, 0x013216ba,
273 	0xe64b1c47, 0xf5e98430, 0xc10e2ca9, 0xd2acb4de,
274 	0xa8c17d9b, 0xbb63e5ec, 0x8f844d75, 0x9c26d502,
275 	0x449a2e7e, 0x5738b609, 0x63df1e90, 0x707d86e7,
276 	0x0a104fa2, 0x19b2d7d5, 0x2d557f4c, 0x3ef7e73b,
277 	0xd98eedc6, 0xca2c75b1, 0xfecbdd28, 0xed69455f,
278 	0x97048c1a, 0x84a6146d, 0xb041bcf4, 0xa3e32483
279 };
280 
281 uint32_t CRC32C_2[256] = {
282 	0x00000000, 0xa541927e, 0x4f6f520d, 0xea2ec073,
283 	0x9edea41a, 0x3b9f3664, 0xd1b1f617, 0x74f06469,
284 	0x38513ec5, 0x9d10acbb, 0x773e6cc8, 0xd27ffeb6,
285 	0xa68f9adf, 0x03ce08a1, 0xe9e0c8d2, 0x4ca15aac,
286 	0x70a27d8a, 0xd5e3eff4, 0x3fcd2f87, 0x9a8cbdf9,
287 	0xee7cd990, 0x4b3d4bee, 0xa1138b9d, 0x045219e3,
288 	0x48f3434f, 0xedb2d131, 0x079c1142, 0xa2dd833c,
289 	0xd62de755, 0x736c752b, 0x9942b558, 0x3c032726,
290 	0xe144fb14, 0x4405696a, 0xae2ba919, 0x0b6a3b67,
291 	0x7f9a5f0e, 0xdadbcd70, 0x30f50d03, 0x95b49f7d,
292 	0xd915c5d1, 0x7c5457af, 0x967a97dc, 0x333b05a2,
293 	0x47cb61cb, 0xe28af3b5, 0x08a433c6, 0xade5a1b8,
294 	0x91e6869e, 0x34a714e0, 0xde89d493, 0x7bc846ed,
295 	0x0f382284, 0xaa79b0fa, 0x40577089, 0xe516e2f7,
296 	0xa9b7b85b, 0x0cf62a25, 0xe6d8ea56, 0x43997828,
297 	0x37691c41, 0x92288e3f, 0x78064e4c, 0xdd47dc32,
298 	0xc76580d9, 0x622412a7, 0x880ad2d4, 0x2d4b40aa,
299 	0x59bb24c3, 0xfcfab6bd, 0x16d476ce, 0xb395e4b0,
300 	0xff34be1c, 0x5a752c62, 0xb05bec11, 0x151a7e6f,
301 	0x61ea1a06, 0xc4ab8878, 0x2e85480b, 0x8bc4da75,
302 	0xb7c7fd53, 0x12866f2d, 0xf8a8af5e, 0x5de93d20,
303 	0x29195949, 0x8c58cb37, 0x66760b44, 0xc337993a,
304 	0x8f96c396, 0x2ad751e8, 0xc0f9919b, 0x65b803e5,
305 	0x1148678c, 0xb409f5f2, 0x5e273581, 0xfb66a7ff,
306 	0x26217bcd, 0x8360e9b3, 0x694e29c0, 0xcc0fbbbe,
307 	0xb8ffdfd7, 0x1dbe4da9, 0xf7908dda, 0x52d11fa4,
308 	0x1e704508, 0xbb31d776, 0x511f1705, 0xf45e857b,
309 	0x80aee112, 0x25ef736c, 0xcfc1b31f, 0x6a802161,
310 	0x56830647, 0xf3c29439, 0x19ec544a, 0xbcadc634,
311 	0xc85da25d, 0x6d1c3023, 0x8732f050, 0x2273622e,
312 	0x6ed23882, 0xcb93aafc, 0x21bd6a8f, 0x84fcf8f1,
313 	0xf00c9c98, 0x554d0ee6, 0xbf63ce95, 0x1a225ceb,
314 	0x8b277743, 0x2e66e53d, 0xc448254e, 0x6109b730,
315 	0x15f9d359, 0xb0b84127, 0x5a968154, 0xffd7132a,
316 	0xb3764986, 0x1637dbf8, 0xfc191b8b, 0x595889f5,
317 	0x2da8ed9c, 0x88e97fe2, 0x62c7bf91, 0xc7862def,
318 	0xfb850ac9, 0x5ec498b7, 0xb4ea58c4, 0x11abcaba,
319 	0x655baed3, 0xc01a3cad, 0x2a34fcde, 0x8f756ea0,
320 	0xc3d4340c, 0x6695a672, 0x8cbb6601, 0x29faf47f,
321 	0x5d0a9016, 0xf84b0268, 0x1265c21b, 0xb7245065,
322 	0x6a638c57, 0xcf221e29, 0x250cde5a, 0x804d4c24,
323 	0xf4bd284d, 0x51fcba33, 0xbbd27a40, 0x1e93e83e,
324 	0x5232b292, 0xf77320ec, 0x1d5de09f, 0xb81c72e1,
325 	0xccec1688, 0x69ad84f6, 0x83834485, 0x26c2d6fb,
326 	0x1ac1f1dd, 0xbf8063a3, 0x55aea3d0, 0xf0ef31ae,
327 	0x841f55c7, 0x215ec7b9, 0xcb7007ca, 0x6e3195b4,
328 	0x2290cf18, 0x87d15d66, 0x6dff9d15, 0xc8be0f6b,
329 	0xbc4e6b02, 0x190ff97c, 0xf321390f, 0x5660ab71,
330 	0x4c42f79a, 0xe90365e4, 0x032da597, 0xa66c37e9,
331 	0xd29c5380, 0x77ddc1fe, 0x9df3018d, 0x38b293f3,
332 	0x7413c95f, 0xd1525b21, 0x3b7c9b52, 0x9e3d092c,
333 	0xeacd6d45, 0x4f8cff3b, 0xa5a23f48, 0x00e3ad36,
334 	0x3ce08a10, 0x99a1186e, 0x738fd81d, 0xd6ce4a63,
335 	0xa23e2e0a, 0x077fbc74, 0xed517c07, 0x4810ee79,
336 	0x04b1b4d5, 0xa1f026ab, 0x4bdee6d8, 0xee9f74a6,
337 	0x9a6f10cf, 0x3f2e82b1, 0xd50042c2, 0x7041d0bc,
338 	0xad060c8e, 0x08479ef0, 0xe2695e83, 0x4728ccfd,
339 	0x33d8a894, 0x96993aea, 0x7cb7fa99, 0xd9f668e7,
340 	0x9557324b, 0x3016a035, 0xda386046, 0x7f79f238,
341 	0x0b899651, 0xaec8042f, 0x44e6c45c, 0xe1a75622,
342 	0xdda47104, 0x78e5e37a, 0x92cb2309, 0x378ab177,
343 	0x437ad51e, 0xe63b4760, 0x0c158713, 0xa954156d,
344 	0xe5f54fc1, 0x40b4ddbf, 0xaa9a1dcc, 0x0fdb8fb2,
345 	0x7b2bebdb, 0xde6a79a5, 0x3444b9d6, 0x91052ba8
346 };
347 
348 uint32_t CRC32C_3[256] = {
349 	0x00000000, 0xdd45aab8, 0xbf672381, 0x62228939,
350 	0x7b2231f3, 0xa6679b4b, 0xc4451272, 0x1900b8ca,
351 	0xf64463e6, 0x2b01c95e, 0x49234067, 0x9466eadf,
352 	0x8d665215, 0x5023f8ad, 0x32017194, 0xef44db2c,
353 	0xe964b13d, 0x34211b85, 0x560392bc, 0x8b463804,
354 	0x924680ce, 0x4f032a76, 0x2d21a34f, 0xf06409f7,
355 	0x1f20d2db, 0xc2657863, 0xa047f15a, 0x7d025be2,
356 	0x6402e328, 0xb9474990, 0xdb65c0a9, 0x06206a11,
357 	0xd725148b, 0x0a60be33, 0x6842370a, 0xb5079db2,
358 	0xac072578, 0x71428fc0, 0x136006f9, 0xce25ac41,
359 	0x2161776d, 0xfc24ddd5, 0x9e0654ec, 0x4343fe54,
360 	0x5a43469e, 0x8706ec26, 0xe524651f, 0x3861cfa7,
361 	0x3e41a5b6, 0xe3040f0e, 0x81268637, 0x5c632c8f,
362 	0x45639445, 0x98263efd, 0xfa04b7c4, 0x27411d7c,
363 	0xc805c650, 0x15406ce8, 0x7762e5d1, 0xaa274f69,
364 	0xb327f7a3, 0x6e625d1b, 0x0c40d422, 0xd1057e9a,
365 	0xaba65fe7, 0x76e3f55f, 0x14c17c66, 0xc984d6de,
366 	0xd0846e14, 0x0dc1c4ac, 0x6fe34d95, 0xb2a6e72d,
367 	0x5de23c01, 0x80a796b9, 0xe2851f80, 0x3fc0b538,
368 	0x26c00df2, 0xfb85a74a, 0x99a72e73, 0x44e284cb,
369 	0x42c2eeda, 0x9f874462, 0xfda5cd5b, 0x20e067e3,
370 	0x39e0df29, 0xe4a57591, 0x8687fca8, 0x5bc25610,
371 	0xb4868d3c, 0x69c32784, 0x0be1aebd, 0xd6a40405,
372 	0xcfa4bccf, 0x12e11677, 0x70c39f4e, 0xad8635f6,
373 	0x7c834b6c, 0xa1c6e1d4, 0xc3e468ed, 0x1ea1c255,
374 	0x07a17a9f, 0xdae4d027, 0xb8c6591e, 0x6583f3a6,
375 	0x8ac7288a, 0x57828232, 0x35a00b0b, 0xe8e5a1b3,
376 	0xf1e51979, 0x2ca0b3c1, 0x4e823af8, 0x93c79040,
377 	0x95e7fa51, 0x48a250e9, 0x2a80d9d0, 0xf7c57368,
378 	0xeec5cba2, 0x3380611a, 0x51a2e823, 0x8ce7429b,
379 	0x63a399b7, 0xbee6330f, 0xdcc4ba36, 0x0181108e,
380 	0x1881a844, 0xc5c402fc, 0xa7e68bc5, 0x7aa3217d,
381 	0x52a0c93f, 0x8fe56387, 0xedc7eabe, 0x30824006,
382 	0x2982f8cc, 0xf4c75274, 0x96e5db4d, 0x4ba071f5,
383 	0xa4e4aad9, 0x79a10061, 0x1b838958, 0xc6c623e0,
384 	0xdfc69b2a, 0x02833192, 0x60a1b8ab, 0xbde41213,
385 	0xbbc47802, 0x6681d2ba, 0x04a35b83, 0xd9e6f13b,
386 	0xc0e649f1, 0x1da3e349, 0x7f816a70, 0xa2c4c0c8,
387 	0x4d801be4, 0x90c5b15c, 0xf2e73865, 0x2fa292dd,
388 	0x36a22a17, 0xebe780af, 0x89c50996, 0x5480a32e,
389 	0x8585ddb4, 0x58c0770c, 0x3ae2fe35, 0xe7a7548d,
390 	0xfea7ec47, 0x23e246ff, 0x41c0cfc6, 0x9c85657e,
391 	0x73c1be52, 0xae8414ea, 0xcca69dd3, 0x11e3376b,
392 	0x08e38fa1, 0xd5a62519, 0xb784ac20, 0x6ac10698,
393 	0x6ce16c89, 0xb1a4c631, 0xd3864f08, 0x0ec3e5b0,
394 	0x17c35d7a, 0xca86f7c2, 0xa8a47efb, 0x75e1d443,
395 	0x9aa50f6f, 0x47e0a5d7, 0x25c22cee, 0xf8878656,
396 	0xe1873e9c, 0x3cc29424, 0x5ee01d1d, 0x83a5b7a5,
397 	0xf90696d8, 0x24433c60, 0x4661b559, 0x9b241fe1,
398 	0x8224a72b, 0x5f610d93, 0x3d4384aa, 0xe0062e12,
399 	0x0f42f53e, 0xd2075f86, 0xb025d6bf, 0x6d607c07,
400 	0x7460c4cd, 0xa9256e75, 0xcb07e74c, 0x16424df4,
401 	0x106227e5, 0xcd278d5d, 0xaf050464, 0x7240aedc,
402 	0x6b401616, 0xb605bcae, 0xd4273597, 0x09629f2f,
403 	0xe6264403, 0x3b63eebb, 0x59416782, 0x8404cd3a,
404 	0x9d0475f0, 0x4041df48, 0x22635671, 0xff26fcc9,
405 	0x2e238253, 0xf36628eb, 0x9144a1d2, 0x4c010b6a,
406 	0x5501b3a0, 0x88441918, 0xea669021, 0x37233a99,
407 	0xd867e1b5, 0x05224b0d, 0x6700c234, 0xba45688c,
408 	0xa345d046, 0x7e007afe, 0x1c22f3c7, 0xc167597f,
409 	0xc747336e, 0x1a0299d6, 0x782010ef, 0xa565ba57,
410 	0xbc65029d, 0x6120a825, 0x0302211c, 0xde478ba4,
411 	0x31035088, 0xec46fa30, 0x8e647309, 0x5321d9b1,
412 	0x4a21617b, 0x9764cbc3, 0xf54642fa, 0x2803e842
413 };
414 
415 #if HAVE_SSE42
416 int crc_x86;
417 #endif
418 
crc32c_gen(uint32_t crc,const unsigned char * ptr,unsigned size)419 uint32_t crc32c_gen(uint32_t crc, const unsigned char* ptr, unsigned size)
420 {
421 	crc ^= CRC_IV;
422 
423 	crc = crc32c_gen_plain(crc, ptr, size);
424 
425 	crc ^= CRC_IV;
426 
427 	return crc;
428 }
429 
430 #if HAVE_SSE42
crc32c_x86(uint32_t crc,const unsigned char * ptr,unsigned size)431 uint32_t crc32c_x86(uint32_t crc, const unsigned char* ptr, unsigned size)
432 {
433 	crc ^= CRC_IV;
434 
435 	crc = crc32c_x86_plain(crc, ptr, size);
436 
437 	crc ^= CRC_IV;
438 
439 	return crc;
440 }
441 #endif
442 
443 uint32_t (*crc32c)(uint32_t crc, const unsigned char* ptr, unsigned size);
444 
crc32c_init(void)445 void crc32c_init(void)
446 {
447 	crc32c = crc32c_gen;
448 #if HAVE_SSE42
449 	if (raid_cpu_has_crc32()) {
450 		crc_x86 = 1;
451 		crc32c = crc32c_x86;
452 	}
453 #endif
454 }
455 
456 /****************************************************************************/
457 /* byte operations */
458 
459 /*
460  * Rotate left.
461  * In x86/x64 they are optimized with a single assembler instruction.
462  */
util_rotl32(uint32_t x,int8_t r)463 static inline uint32_t util_rotl32(uint32_t x, int8_t r)
464 {
465 	return (x << r) | (x >> (32 - r));
466 }
467 
util_rotl64(uint64_t x,int8_t r)468 static inline uint64_t util_rotl64(uint64_t x, int8_t r)
469 {
470 	return (x << r) | (x >> (64 - r));
471 }
472 
473 /*
474  * Rotate right.
475  * In x86/x64 they are optimized with a single assembler instruction.
476  */
477 #if 0 /* unused */
478 static inline uint32_t util_rotr32(uint32_t x, int8_t r)
479 {
480 	return (x >> r) | (x << (32 - r));
481 }
482 #endif
util_rotr64(uint64_t x,int8_t r)483 static inline uint64_t util_rotr64(uint64_t x, int8_t r)
484 {
485 	return (x >> r) | (x << (64 - r));
486 }
487 
488 
489 /**
490  * Swap endianness.
491  * They are needed only if BigEndian.
492  */
493 #if defined(__GNUC__)
494 
495 #define util_swap32(x) __builtin_bswap32(x)
496 #define util_swap64(x) __builtin_bswap64(x)
497 
498 #elif HAVE_BYTESWAP_H
499 
500 #include <byteswap.h>
501 
502 #define util_swap32(x) bswap_32(x)
503 #define util_swap64(x) bswap_64(x)
504 
505 #else
util_swap32(uint32_t v)506 static inline uint32_t util_swap32(uint32_t v)
507 {
508 	return (util_rotl32(v, 8) & 0x00ff00ff)
509 	       | (util_rotl32(v, 24) & 0xff00ff00);
510 }
511 
util_swap64(uint64_t v)512 static inline uint64_t util_swap64(uint64_t v)
513 {
514 	return (util_rotl64(v, 8) & 0x000000ff000000ffULL)
515 	       | (util_rotl64(v, 24) & 0x0000ff000000ff00ULL)
516 	       | (util_rotl64(v, 40) & 0x00ff000000ff0000ULL)
517 	       | (util_rotl64(v, 56) & 0xff000000ff000000ULL);
518 }
519 #endif
520 
util_read8(const void * void_ptr)521 static inline uint8_t util_read8(const void* void_ptr)
522 {
523 	const uint8_t* ptr = void_ptr;
524 	return ptr[0];
525 }
526 
util_read16(const void * void_ptr)527 static inline uint16_t util_read16(const void* void_ptr)
528 {
529 	const uint8_t* ptr = void_ptr;
530 	return ptr[0] + (ptr[1] << 8);
531 }
532 
util_read32(const void * ptr)533 static inline uint32_t util_read32(const void* ptr)
534 {
535 	uint32_t v;
536 	memcpy(&v, ptr, sizeof(v));
537 #if WORDS_BIGENDIAN
538 	v = util_swap32(v);
539 #endif
540 	return v;
541 }
542 
util_read64(const void * ptr)543 static inline uint64_t util_read64(const void* ptr)
544 {
545 	uint64_t v;
546 	memcpy(&v, ptr, sizeof(v));
547 #if WORDS_BIGENDIAN
548 	v = util_swap64(v);
549 #endif
550 	return v;
551 }
552 
util_write32(void * ptr,uint32_t v)553 static inline void util_write32(void* ptr, uint32_t v)
554 {
555 #if WORDS_BIGENDIAN
556 	v = util_swap32(v);
557 #endif
558 	memcpy(ptr, &v, sizeof(v));
559 }
560 
util_write64(void * ptr,uint64_t v)561 static inline void util_write64(void* ptr, uint64_t v)
562 {
563 #if WORDS_BIGENDIAN
564 	v = util_swap64(v);
565 #endif
566 	memcpy(ptr, &v, sizeof(v));
567 }
568 
569 /****************************************************************************/
570 /* hash */
571 
572 #include "murmur3.c"
573 #include "spooky2.c"
574 #include "metro.c"
575 
memhash(unsigned kind,const unsigned char * seed,void * digest,const void * src,size_t size)576 void memhash(unsigned kind, const unsigned char* seed, void* digest, const void* src, size_t size)
577 {
578 	switch (kind) {
579 	case HASH_MURMUR3 :
580 		MurmurHash3_x86_128(src, size, seed, digest);
581 		break;
582 	case HASH_SPOOKY2 :
583 		SpookyHash128(src, size, seed, digest);
584 		break;
585 	case HASH_METRO :
586 		MetroHash128(src, size, seed, digest);
587 		break;
588 	default :
589 		/* LCOV_EXCL_START */
590 		log_fatal("Internal inconsistency in hash function %u\n", kind);
591 		exit(EXIT_FAILURE);
592 		break;
593 		/* LCOV_EXCL_STOP */
594 	}
595 }
596 
hash_config_name(unsigned kind)597 const char* hash_config_name(unsigned kind)
598 {
599 	switch (kind) {
600 	case HASH_UNDEFINED : return "undefined";
601 	case HASH_MURMUR3 : return "murmur3";
602 	case HASH_SPOOKY2 : return "spooky2";
603 	case HASH_METRO : return "metro";
604 	default :
605 		/* LCOV_EXCL_START */
606 		return "unknown";
607 		/* LCOV_EXCL_STOP */
608 	}
609 }
610 
memdiff(const unsigned char * data1,const unsigned char * data2,size_t size)611 unsigned memdiff(const unsigned char* data1, const unsigned char* data2, size_t size)
612 {
613 	size_t i;
614 	unsigned count;
615 
616 	count = 0;
617 	for (i = 0; i < size; ++i) {
618 		unsigned j;
619 		unsigned char diff = data1[i] ^ data2[i];
620 		for (j = 0; j < 8; ++j) {
621 			if ((diff & 1) != 0)
622 				++count;
623 			diff >>= 1;
624 		}
625 	}
626 
627 	return count;
628 }
629 
630 /****************************************************************************/
631 /* lock */
632 
633 #if HAVE_LOCKFILE
lock_lock(const char * file)634 int lock_lock(const char* file)
635 {
636 	int f;
637 
638 	f = open(file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
639 	if (f == -1) {
640 		/* LCOV_EXCL_START */
641 		return -1;
642 		/* LCOV_EXCL_STOP */
643 	}
644 
645 	/* exclusive lock, not blocking */
646 	if (flock(f, LOCK_EX | LOCK_NB) == -1) {
647 		/* LCOV_EXCL_START */
648 		close(f);
649 		return -1;
650 		/* LCOV_EXCL_STOP */
651 	}
652 
653 	return f;
654 }
655 #endif
656 
657 #if HAVE_LOCKFILE
lock_unlock(int f)658 int lock_unlock(int f)
659 {
660 	/*
661 	 * Intentionally don't remove the lock file.
662 	 * Removing it just introduces race course with other process
663 	 * that could have already opened it.
664 	 */
665 	if (close(f) == -1) {
666 		/* LCOV_EXCL_START */
667 		return -1;
668 		/* LCOV_EXCL_STOP */
669 	}
670 
671 	return 0;
672 }
673 #endif
674 
675