1*33b1fccfSAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0+ OR Apache-2.0 */
2*33b1fccfSAndroid Build Coastguard Worker /*
3*33b1fccfSAndroid Build Coastguard Worker * Copyright (C) 2018 HUAWEI, Inc.
4*33b1fccfSAndroid Build Coastguard Worker * http://www.huawei.com/
5*33b1fccfSAndroid Build Coastguard Worker * Created by Li Guifu <[email protected]>
6*33b1fccfSAndroid Build Coastguard Worker * Modified by Gao Xiang <[email protected]>
7*33b1fccfSAndroid Build Coastguard Worker */
8*33b1fccfSAndroid Build Coastguard Worker #ifndef __EROFS_DEFS_H
9*33b1fccfSAndroid Build Coastguard Worker #define __EROFS_DEFS_H
10*33b1fccfSAndroid Build Coastguard Worker
11*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
12*33b1fccfSAndroid Build Coastguard Worker extern "C"
13*33b1fccfSAndroid Build Coastguard Worker {
14*33b1fccfSAndroid Build Coastguard Worker #endif
15*33b1fccfSAndroid Build Coastguard Worker
16*33b1fccfSAndroid Build Coastguard Worker #include <stddef.h>
17*33b1fccfSAndroid Build Coastguard Worker #include <stdint.h>
18*33b1fccfSAndroid Build Coastguard Worker #include <assert.h>
19*33b1fccfSAndroid Build Coastguard Worker #include <inttypes.h>
20*33b1fccfSAndroid Build Coastguard Worker #include <limits.h>
21*33b1fccfSAndroid Build Coastguard Worker #include <stdbool.h>
22*33b1fccfSAndroid Build Coastguard Worker
23*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
24*33b1fccfSAndroid Build Coastguard Worker #include <config.h>
25*33b1fccfSAndroid Build Coastguard Worker #endif
26*33b1fccfSAndroid Build Coastguard Worker
27*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_TYPES_H
28*33b1fccfSAndroid Build Coastguard Worker #include <linux/types.h>
29*33b1fccfSAndroid Build Coastguard Worker #endif
30*33b1fccfSAndroid Build Coastguard Worker
31*33b1fccfSAndroid Build Coastguard Worker /*
32*33b1fccfSAndroid Build Coastguard Worker * container_of - cast a member of a structure out to the containing structure
33*33b1fccfSAndroid Build Coastguard Worker * @ptr: the pointer to the member.
34*33b1fccfSAndroid Build Coastguard Worker * @type: the type of the container struct this is embedded in.
35*33b1fccfSAndroid Build Coastguard Worker * @member: the name of the member within the struct.
36*33b1fccfSAndroid Build Coastguard Worker */
37*33b1fccfSAndroid Build Coastguard Worker #define container_of(ptr, type, member) ({ \
38*33b1fccfSAndroid Build Coastguard Worker const typeof(((type *)0)->member) *__mptr = (ptr); \
39*33b1fccfSAndroid Build Coastguard Worker (type *)((char *)__mptr - offsetof(type, member)); })
40*33b1fccfSAndroid Build Coastguard Worker
41*33b1fccfSAndroid Build Coastguard Worker typedef uint8_t u8;
42*33b1fccfSAndroid Build Coastguard Worker typedef uint16_t u16;
43*33b1fccfSAndroid Build Coastguard Worker typedef uint32_t u32;
44*33b1fccfSAndroid Build Coastguard Worker typedef uint64_t u64;
45*33b1fccfSAndroid Build Coastguard Worker
46*33b1fccfSAndroid Build Coastguard Worker #ifndef HAVE_LINUX_TYPES_H
47*33b1fccfSAndroid Build Coastguard Worker typedef u8 __u8;
48*33b1fccfSAndroid Build Coastguard Worker typedef u16 __u16;
49*33b1fccfSAndroid Build Coastguard Worker typedef u32 __u32;
50*33b1fccfSAndroid Build Coastguard Worker typedef u64 __u64;
51*33b1fccfSAndroid Build Coastguard Worker typedef u16 __le16;
52*33b1fccfSAndroid Build Coastguard Worker typedef u32 __le32;
53*33b1fccfSAndroid Build Coastguard Worker typedef u64 __le64;
54*33b1fccfSAndroid Build Coastguard Worker typedef u16 __be16;
55*33b1fccfSAndroid Build Coastguard Worker typedef u32 __be32;
56*33b1fccfSAndroid Build Coastguard Worker typedef u64 __be64;
57*33b1fccfSAndroid Build Coastguard Worker #endif
58*33b1fccfSAndroid Build Coastguard Worker
59*33b1fccfSAndroid Build Coastguard Worker typedef int8_t s8;
60*33b1fccfSAndroid Build Coastguard Worker typedef int16_t s16;
61*33b1fccfSAndroid Build Coastguard Worker typedef int32_t s32;
62*33b1fccfSAndroid Build Coastguard Worker typedef int64_t s64;
63*33b1fccfSAndroid Build Coastguard Worker
64*33b1fccfSAndroid Build Coastguard Worker #if __BYTE_ORDER == __LITTLE_ENDIAN
65*33b1fccfSAndroid Build Coastguard Worker /*
66*33b1fccfSAndroid Build Coastguard Worker * The host byte order is the same as network byte order,
67*33b1fccfSAndroid Build Coastguard Worker * so these functions are all just identity.
68*33b1fccfSAndroid Build Coastguard Worker */
69*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le16(x) ((__u16)(x))
70*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le32(x) ((__u32)(x))
71*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le64(x) ((__u64)(x))
72*33b1fccfSAndroid Build Coastguard Worker #define le16_to_cpu(x) ((__u16)(x))
73*33b1fccfSAndroid Build Coastguard Worker #define le32_to_cpu(x) ((__u32)(x))
74*33b1fccfSAndroid Build Coastguard Worker #define le64_to_cpu(x) ((__u64)(x))
75*33b1fccfSAndroid Build Coastguard Worker
76*33b1fccfSAndroid Build Coastguard Worker #else
77*33b1fccfSAndroid Build Coastguard Worker #if __BYTE_ORDER == __BIG_ENDIAN
78*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le16(x) (__builtin_bswap16(x))
79*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le32(x) (__builtin_bswap32(x))
80*33b1fccfSAndroid Build Coastguard Worker #define cpu_to_le64(x) (__builtin_bswap64(x))
81*33b1fccfSAndroid Build Coastguard Worker #define le16_to_cpu(x) (__builtin_bswap16(x))
82*33b1fccfSAndroid Build Coastguard Worker #define le32_to_cpu(x) (__builtin_bswap32(x))
83*33b1fccfSAndroid Build Coastguard Worker #define le64_to_cpu(x) (__builtin_bswap64(x))
84*33b1fccfSAndroid Build Coastguard Worker #else
85*33b1fccfSAndroid Build Coastguard Worker #pragma error
86*33b1fccfSAndroid Build Coastguard Worker #endif
87*33b1fccfSAndroid Build Coastguard Worker #endif
88*33b1fccfSAndroid Build Coastguard Worker
89*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
90*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) static_assert(!(condition))
91*33b1fccfSAndroid Build Coastguard Worker #elif !defined(__OPTIMIZE__)
92*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2 * !!(condition)]))
93*33b1fccfSAndroid Build Coastguard Worker #else
94*33b1fccfSAndroid Build Coastguard Worker #define BUILD_BUG_ON(condition) assert(!(condition))
95*33b1fccfSAndroid Build Coastguard Worker #endif
96*33b1fccfSAndroid Build Coastguard Worker
97*33b1fccfSAndroid Build Coastguard Worker #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
98*33b1fccfSAndroid Build Coastguard Worker
99*33b1fccfSAndroid Build Coastguard Worker #define __round_mask(x, y) ((__typeof__(x))((y)-1))
100*33b1fccfSAndroid Build Coastguard Worker #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
101*33b1fccfSAndroid Build Coastguard Worker #define round_down(x, y) ((x) & ~__round_mask(x, y))
102*33b1fccfSAndroid Build Coastguard Worker
103*33b1fccfSAndroid Build Coastguard Worker #ifndef roundup
104*33b1fccfSAndroid Build Coastguard Worker /* The `const' in roundup() prevents gcc-3.3 from calling __divdi3 */
105*33b1fccfSAndroid Build Coastguard Worker #define roundup(x, y) ( \
106*33b1fccfSAndroid Build Coastguard Worker { \
107*33b1fccfSAndroid Build Coastguard Worker const typeof(y) __y = y; \
108*33b1fccfSAndroid Build Coastguard Worker (((x) + (__y - 1)) / __y) * __y; \
109*33b1fccfSAndroid Build Coastguard Worker } \
110*33b1fccfSAndroid Build Coastguard Worker )
111*33b1fccfSAndroid Build Coastguard Worker #endif
112*33b1fccfSAndroid Build Coastguard Worker #define rounddown(x, y) ( \
113*33b1fccfSAndroid Build Coastguard Worker { \
114*33b1fccfSAndroid Build Coastguard Worker typeof(x) __x = (x); \
115*33b1fccfSAndroid Build Coastguard Worker __x - (__x % (y)); \
116*33b1fccfSAndroid Build Coastguard Worker } \
117*33b1fccfSAndroid Build Coastguard Worker )
118*33b1fccfSAndroid Build Coastguard Worker
119*33b1fccfSAndroid Build Coastguard Worker /* Can easily conflict with C++'s std::min */
120*33b1fccfSAndroid Build Coastguard Worker #ifndef __cplusplus
121*33b1fccfSAndroid Build Coastguard Worker #define min(x, y) ({ \
122*33b1fccfSAndroid Build Coastguard Worker typeof(x) _min1 = (x); \
123*33b1fccfSAndroid Build Coastguard Worker typeof(y) _min2 = (y); \
124*33b1fccfSAndroid Build Coastguard Worker (void) (&_min1 == &_min2); \
125*33b1fccfSAndroid Build Coastguard Worker _min1 < _min2 ? _min1 : _min2; })
126*33b1fccfSAndroid Build Coastguard Worker
127*33b1fccfSAndroid Build Coastguard Worker #define max(x, y) ({ \
128*33b1fccfSAndroid Build Coastguard Worker typeof(x) _max1 = (x); \
129*33b1fccfSAndroid Build Coastguard Worker typeof(y) _max2 = (y); \
130*33b1fccfSAndroid Build Coastguard Worker (void) (&_max1 == &_max2); \
131*33b1fccfSAndroid Build Coastguard Worker _max1 > _max2 ? _max1 : _max2; })
132*33b1fccfSAndroid Build Coastguard Worker #endif
133*33b1fccfSAndroid Build Coastguard Worker
134*33b1fccfSAndroid Build Coastguard Worker /*
135*33b1fccfSAndroid Build Coastguard Worker * ..and if you can't take the strict types, you can specify one yourself.
136*33b1fccfSAndroid Build Coastguard Worker * Or don't use min/max at all, of course.
137*33b1fccfSAndroid Build Coastguard Worker */
138*33b1fccfSAndroid Build Coastguard Worker #define min_t(type, x, y) ({ \
139*33b1fccfSAndroid Build Coastguard Worker type __min1 = (x); \
140*33b1fccfSAndroid Build Coastguard Worker type __min2 = (y); \
141*33b1fccfSAndroid Build Coastguard Worker __min1 < __min2 ? __min1: __min2; })
142*33b1fccfSAndroid Build Coastguard Worker
143*33b1fccfSAndroid Build Coastguard Worker #define max_t(type, x, y) ({ \
144*33b1fccfSAndroid Build Coastguard Worker type __max1 = (x); \
145*33b1fccfSAndroid Build Coastguard Worker type __max2 = (y); \
146*33b1fccfSAndroid Build Coastguard Worker __max1 > __max2 ? __max1: __max2; })
147*33b1fccfSAndroid Build Coastguard Worker
148*33b1fccfSAndroid Build Coastguard Worker #define cmpsgn(x, y) ({ \
149*33b1fccfSAndroid Build Coastguard Worker typeof(x) _x = (x); \
150*33b1fccfSAndroid Build Coastguard Worker typeof(y) _y = (y); \
151*33b1fccfSAndroid Build Coastguard Worker (_x > _y) - (_x < _y); })
152*33b1fccfSAndroid Build Coastguard Worker
153*33b1fccfSAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
154*33b1fccfSAndroid Build Coastguard Worker
155*33b1fccfSAndroid Build Coastguard Worker #define BIT(nr) (1UL << (nr))
156*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL(nr) (1ULL << (nr))
157*33b1fccfSAndroid Build Coastguard Worker #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
158*33b1fccfSAndroid Build Coastguard Worker #define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
159*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL_MASK(nr) (1ULL << ((nr) % BITS_PER_LONG_LONG))
160*33b1fccfSAndroid Build Coastguard Worker #define BIT_ULL_WORD(nr) ((nr) / BITS_PER_LONG_LONG)
161*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_BYTE 8
162*33b1fccfSAndroid Build Coastguard Worker #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
163*33b1fccfSAndroid Build Coastguard Worker
164*33b1fccfSAndroid Build Coastguard Worker #ifdef __SIZEOF_LONG__
165*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_LONG (__CHAR_BIT__ * __SIZEOF_LONG__)
166*33b1fccfSAndroid Build Coastguard Worker #else
167*33b1fccfSAndroid Build Coastguard Worker #define BITS_PER_LONG __WORDSIZE
168*33b1fccfSAndroid Build Coastguard Worker #endif
169*33b1fccfSAndroid Build Coastguard Worker
170*33b1fccfSAndroid Build Coastguard Worker #define BUG_ON(cond) assert(!(cond))
171*33b1fccfSAndroid Build Coastguard Worker
172*33b1fccfSAndroid Build Coastguard Worker #ifdef NDEBUG
173*33b1fccfSAndroid Build Coastguard Worker #define DBG_BUGON(condition) ((void)(condition))
174*33b1fccfSAndroid Build Coastguard Worker #else
175*33b1fccfSAndroid Build Coastguard Worker #define DBG_BUGON(condition) BUG_ON(condition)
176*33b1fccfSAndroid Build Coastguard Worker #endif
177*33b1fccfSAndroid Build Coastguard Worker
178*33b1fccfSAndroid Build Coastguard Worker #ifndef __maybe_unused
179*33b1fccfSAndroid Build Coastguard Worker #define __maybe_unused __attribute__((__unused__))
180*33b1fccfSAndroid Build Coastguard Worker #endif
181*33b1fccfSAndroid Build Coastguard Worker
182*33b1fccfSAndroid Build Coastguard Worker #define __packed __attribute__((__packed__))
183*33b1fccfSAndroid Build Coastguard Worker
184*33b1fccfSAndroid Build Coastguard Worker #define __get_unaligned_t(type, ptr) ({ \
185*33b1fccfSAndroid Build Coastguard Worker const struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr); \
186*33b1fccfSAndroid Build Coastguard Worker __pptr->x; \
187*33b1fccfSAndroid Build Coastguard Worker })
188*33b1fccfSAndroid Build Coastguard Worker
189*33b1fccfSAndroid Build Coastguard Worker #define __put_unaligned_t(type, val, ptr) do { \
190*33b1fccfSAndroid Build Coastguard Worker struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr); \
191*33b1fccfSAndroid Build Coastguard Worker __pptr->x = (val); \
192*33b1fccfSAndroid Build Coastguard Worker } while (0)
193*33b1fccfSAndroid Build Coastguard Worker
194*33b1fccfSAndroid Build Coastguard Worker #define get_unaligned(ptr) __get_unaligned_t(typeof(*(ptr)), (ptr))
195*33b1fccfSAndroid Build Coastguard Worker #define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr))
196*33b1fccfSAndroid Build Coastguard Worker
get_unaligned_le32(const void * p)197*33b1fccfSAndroid Build Coastguard Worker static inline u32 get_unaligned_le32(const void *p)
198*33b1fccfSAndroid Build Coastguard Worker {
199*33b1fccfSAndroid Build Coastguard Worker return le32_to_cpu(__get_unaligned_t(__le32, p));
200*33b1fccfSAndroid Build Coastguard Worker }
201*33b1fccfSAndroid Build Coastguard Worker
put_unaligned_le32(u32 val,void * p)202*33b1fccfSAndroid Build Coastguard Worker static inline void put_unaligned_le32(u32 val, void *p)
203*33b1fccfSAndroid Build Coastguard Worker {
204*33b1fccfSAndroid Build Coastguard Worker __put_unaligned_t(__le32, cpu_to_le32(val), p);
205*33b1fccfSAndroid Build Coastguard Worker }
206*33b1fccfSAndroid Build Coastguard Worker
get_unaligned_le64(const void * p)207*33b1fccfSAndroid Build Coastguard Worker static inline u32 get_unaligned_le64(const void *p)
208*33b1fccfSAndroid Build Coastguard Worker {
209*33b1fccfSAndroid Build Coastguard Worker return le64_to_cpu(__get_unaligned_t(__le64, p));
210*33b1fccfSAndroid Build Coastguard Worker }
211*33b1fccfSAndroid Build Coastguard Worker
212*33b1fccfSAndroid Build Coastguard Worker /**
213*33b1fccfSAndroid Build Coastguard Worker * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
214*33b1fccfSAndroid Build Coastguard Worker * @n - parameter
215*33b1fccfSAndroid Build Coastguard Worker *
216*33b1fccfSAndroid Build Coastguard Worker * constant-capable log of base 2 calculation
217*33b1fccfSAndroid Build Coastguard Worker * - this can be used to initialise global variables from constant data, hence
218*33b1fccfSAndroid Build Coastguard Worker * the massive ternary operator construction
219*33b1fccfSAndroid Build Coastguard Worker *
220*33b1fccfSAndroid Build Coastguard Worker * selects the appropriately-sized optimised version depending on sizeof(n)
221*33b1fccfSAndroid Build Coastguard Worker */
222*33b1fccfSAndroid Build Coastguard Worker #define ilog2(n) \
223*33b1fccfSAndroid Build Coastguard Worker ( \
224*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 63) ? 63 : \
225*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 62) ? 62 : \
226*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 61) ? 61 : \
227*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 60) ? 60 : \
228*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 59) ? 59 : \
229*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 58) ? 58 : \
230*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 57) ? 57 : \
231*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 56) ? 56 : \
232*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 55) ? 55 : \
233*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 54) ? 54 : \
234*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 53) ? 53 : \
235*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 52) ? 52 : \
236*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 51) ? 51 : \
237*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 50) ? 50 : \
238*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 49) ? 49 : \
239*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 48) ? 48 : \
240*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 47) ? 47 : \
241*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 46) ? 46 : \
242*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 45) ? 45 : \
243*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 44) ? 44 : \
244*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 43) ? 43 : \
245*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 42) ? 42 : \
246*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 41) ? 41 : \
247*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 40) ? 40 : \
248*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 39) ? 39 : \
249*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 38) ? 38 : \
250*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 37) ? 37 : \
251*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 36) ? 36 : \
252*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 35) ? 35 : \
253*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 34) ? 34 : \
254*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 33) ? 33 : \
255*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 32) ? 32 : \
256*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 31) ? 31 : \
257*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 30) ? 30 : \
258*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 29) ? 29 : \
259*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 28) ? 28 : \
260*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 27) ? 27 : \
261*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 26) ? 26 : \
262*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 25) ? 25 : \
263*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 24) ? 24 : \
264*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 23) ? 23 : \
265*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 22) ? 22 : \
266*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 21) ? 21 : \
267*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 20) ? 20 : \
268*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 19) ? 19 : \
269*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 18) ? 18 : \
270*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 17) ? 17 : \
271*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 16) ? 16 : \
272*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 15) ? 15 : \
273*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 14) ? 14 : \
274*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 13) ? 13 : \
275*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 12) ? 12 : \
276*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 11) ? 11 : \
277*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 10) ? 10 : \
278*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 9) ? 9 : \
279*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 8) ? 8 : \
280*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 7) ? 7 : \
281*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 6) ? 6 : \
282*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 5) ? 5 : \
283*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 4) ? 4 : \
284*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 3) ? 3 : \
285*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 2) ? 2 : \
286*33b1fccfSAndroid Build Coastguard Worker (n) & (1ULL << 1) ? 1 : 0 \
287*33b1fccfSAndroid Build Coastguard Worker )
288*33b1fccfSAndroid Build Coastguard Worker
fls_long(unsigned long x)289*33b1fccfSAndroid Build Coastguard Worker static inline unsigned int fls_long(unsigned long x)
290*33b1fccfSAndroid Build Coastguard Worker {
291*33b1fccfSAndroid Build Coastguard Worker return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0;
292*33b1fccfSAndroid Build Coastguard Worker }
293*33b1fccfSAndroid Build Coastguard Worker
lowbit(unsigned long n)294*33b1fccfSAndroid Build Coastguard Worker static inline unsigned long lowbit(unsigned long n)
295*33b1fccfSAndroid Build Coastguard Worker {
296*33b1fccfSAndroid Build Coastguard Worker return n & -n;
297*33b1fccfSAndroid Build Coastguard Worker }
298*33b1fccfSAndroid Build Coastguard Worker
299*33b1fccfSAndroid Build Coastguard Worker /**
300*33b1fccfSAndroid Build Coastguard Worker * __roundup_pow_of_two() - round up to nearest power of two
301*33b1fccfSAndroid Build Coastguard Worker * @n: value to round up
302*33b1fccfSAndroid Build Coastguard Worker */
303*33b1fccfSAndroid Build Coastguard Worker static inline __attribute__((const))
__roundup_pow_of_two(unsigned long n)304*33b1fccfSAndroid Build Coastguard Worker unsigned long __roundup_pow_of_two(unsigned long n)
305*33b1fccfSAndroid Build Coastguard Worker {
306*33b1fccfSAndroid Build Coastguard Worker return 1UL << fls_long(n - 1);
307*33b1fccfSAndroid Build Coastguard Worker }
308*33b1fccfSAndroid Build Coastguard Worker
309*33b1fccfSAndroid Build Coastguard Worker /**
310*33b1fccfSAndroid Build Coastguard Worker * roundup_pow_of_two - round the given value up to nearest power of two
311*33b1fccfSAndroid Build Coastguard Worker * @n: parameter
312*33b1fccfSAndroid Build Coastguard Worker *
313*33b1fccfSAndroid Build Coastguard Worker * round the given value up to the nearest power of two
314*33b1fccfSAndroid Build Coastguard Worker * - the result is undefined when n == 0
315*33b1fccfSAndroid Build Coastguard Worker * - this can be used to initialise global variables from constant data
316*33b1fccfSAndroid Build Coastguard Worker */
317*33b1fccfSAndroid Build Coastguard Worker #define roundup_pow_of_two(n) \
318*33b1fccfSAndroid Build Coastguard Worker ( \
319*33b1fccfSAndroid Build Coastguard Worker __builtin_constant_p(n) ? ( \
320*33b1fccfSAndroid Build Coastguard Worker ((n) == 1) ? 1 : \
321*33b1fccfSAndroid Build Coastguard Worker (1UL << (ilog2((n) - 1) + 1)) \
322*33b1fccfSAndroid Build Coastguard Worker ) : \
323*33b1fccfSAndroid Build Coastguard Worker __roundup_pow_of_two(n) \
324*33b1fccfSAndroid Build Coastguard Worker )
325*33b1fccfSAndroid Build Coastguard Worker
326*33b1fccfSAndroid Build Coastguard Worker #ifndef __always_inline
327*33b1fccfSAndroid Build Coastguard Worker #define __always_inline inline
328*33b1fccfSAndroid Build Coastguard Worker #endif
329*33b1fccfSAndroid Build Coastguard Worker
330*33b1fccfSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_STAT_ST_ATIM
331*33b1fccfSAndroid Build Coastguard Worker /* Linux */
332*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) ((stbuf)->st_atim.tv_nsec)
333*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) ((stbuf)->st_ctim.tv_nsec)
334*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) ((stbuf)->st_mtim.tv_nsec)
335*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) (stbuf)->st_mtim.tv_nsec = (val)
336*33b1fccfSAndroid Build Coastguard Worker #elif defined(HAVE_STRUCT_STAT_ST_ATIMENSEC)
337*33b1fccfSAndroid Build Coastguard Worker /* macOS */
338*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) ((stbuf)->st_atimensec)
339*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) ((stbuf)->st_ctimensec)
340*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) ((stbuf)->st_mtimensec)
341*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) (stbuf)->st_mtimensec = (val)
342*33b1fccfSAndroid Build Coastguard Worker #else
343*33b1fccfSAndroid Build Coastguard Worker #define ST_ATIM_NSEC(stbuf) 0
344*33b1fccfSAndroid Build Coastguard Worker #define ST_CTIM_NSEC(stbuf) 0
345*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC(stbuf) 0
346*33b1fccfSAndroid Build Coastguard Worker #define ST_MTIM_NSEC_SET(stbuf, val) do { } while (0)
347*33b1fccfSAndroid Build Coastguard Worker #endif
348*33b1fccfSAndroid Build Coastguard Worker
349*33b1fccfSAndroid Build Coastguard Worker #define __erofs_likely(x) __builtin_expect(!!(x), 1)
350*33b1fccfSAndroid Build Coastguard Worker #define __erofs_unlikely(x) __builtin_expect(!!(x), 0)
351*33b1fccfSAndroid Build Coastguard Worker
352*33b1fccfSAndroid Build Coastguard Worker #ifdef __cplusplus
353*33b1fccfSAndroid Build Coastguard Worker }
354*33b1fccfSAndroid Build Coastguard Worker #endif
355*33b1fccfSAndroid Build Coastguard Worker
356*33b1fccfSAndroid Build Coastguard Worker #endif
357