Annotation of /trunk/mkinitrd-magellan/busybox/include/platform.h
Parent Directory | Revision Log
Revision 816 -
(hide annotations)
(download)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 10321 byte(s)
Fri Apr 24 18:33:46 2009 UTC (15 years, 1 month ago) by niro
File MIME type: text/plain
File size: 10321 byte(s)
-updated to busybox-1.13.4
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | niro | 816 | Copyright 2006, Bernhard Reutner-Fischer |
4 | niro | 532 | |
5 | Licensed under the GPL v2 or later, see the file LICENSE in this tarball. | ||
6 | */ | ||
7 | #ifndef __PLATFORM_H | ||
8 | #define __PLATFORM_H 1 | ||
9 | |||
10 | /* Convenience macros to test the version of gcc. */ | ||
11 | #undef __GNUC_PREREQ | ||
12 | #if defined __GNUC__ && defined __GNUC_MINOR__ | ||
13 | # define __GNUC_PREREQ(maj, min) \ | ||
14 | ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) | ||
15 | #else | ||
16 | # define __GNUC_PREREQ(maj, min) 0 | ||
17 | #endif | ||
18 | |||
19 | /* __restrict is known in EGCS 1.2 and above. */ | ||
20 | niro | 816 | #if !__GNUC_PREREQ(2,92) |
21 | niro | 532 | # ifndef __restrict |
22 | # define __restrict /* Ignore */ | ||
23 | # endif | ||
24 | #endif | ||
25 | |||
26 | /* Define macros for some gcc attributes. This permits us to use the | ||
27 | macros freely, and know that they will come into play for the | ||
28 | version of gcc in which they are supported. */ | ||
29 | |||
30 | niro | 816 | #if !__GNUC_PREREQ(2,7) |
31 | niro | 532 | # ifndef __attribute__ |
32 | # define __attribute__(x) | ||
33 | # endif | ||
34 | #endif | ||
35 | |||
36 | #undef inline | ||
37 | #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L | ||
38 | /* it's a keyword */ | ||
39 | #else | ||
40 | niro | 816 | # if __GNUC_PREREQ(2,7) |
41 | niro | 532 | # define inline __inline__ |
42 | # else | ||
43 | # define inline | ||
44 | # endif | ||
45 | #endif | ||
46 | |||
47 | #ifndef __const | ||
48 | # define __const const | ||
49 | #endif | ||
50 | |||
51 | niro | 816 | #define UNUSED_PARAM __attribute__ ((__unused__)) |
52 | #define NORETURN __attribute__ ((__noreturn__)) | ||
53 | #define PACKED __attribute__ ((__packed__)) | ||
54 | #define ALIGNED(m) __attribute__ ((__aligned__(m))) | ||
55 | /* __NO_INLINE__: some gcc's do not honor inlining! :( */ | ||
56 | #if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__) | ||
57 | # define ALWAYS_INLINE __attribute__ ((always_inline)) inline | ||
58 | /* I've seen a toolchain where I needed __noinline__ instead of noinline */ | ||
59 | # define NOINLINE __attribute__((__noinline__)) | ||
60 | # if !ENABLE_WERROR | ||
61 | # define DEPRECATED __attribute__ ((__deprecated__)) | ||
62 | # define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result)) | ||
63 | niro | 532 | # else |
64 | niro | 816 | # define DEPRECATED /* n/a */ |
65 | # define UNUSED_PARAM_RESULT /* n/a */ | ||
66 | niro | 532 | # endif |
67 | niro | 816 | #else |
68 | # define ALWAYS_INLINE inline /* n/a */ | ||
69 | # define NOINLINE /* n/a */ | ||
70 | # define DEPRECATED /* n/a */ | ||
71 | # define UNUSED_PARAM_RESULT /* n/a */ | ||
72 | #endif | ||
73 | niro | 532 | |
74 | /* -fwhole-program makes all symbols local. The attribute externally_visible | ||
75 | forces a symbol global. */ | ||
76 | niro | 816 | #if __GNUC_PREREQ(4,1) |
77 | # define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )) | ||
78 | //__attribute__ ((__externally_visible__)) | ||
79 | #else | ||
80 | # define EXTERNALLY_VISIBLE | ||
81 | #endif /* GNUC >= 4.1 */ | ||
82 | niro | 532 | |
83 | /* We use __extension__ in some places to suppress -pedantic warnings | ||
84 | about GCC extensions. This feature didn't work properly before | ||
85 | gcc 2.8. */ | ||
86 | niro | 816 | #if !__GNUC_PREREQ(2,8) |
87 | niro | 532 | # ifndef __extension__ |
88 | # define __extension__ | ||
89 | # endif | ||
90 | #endif | ||
91 | |||
92 | /* gcc-2.95 had no va_copy but only __va_copy. */ | ||
93 | niro | 816 | #if !__GNUC_PREREQ(3,0) |
94 | niro | 532 | # include <stdarg.h> |
95 | # if !defined va_copy && defined __va_copy | ||
96 | # define va_copy(d,s) __va_copy((d),(s)) | ||
97 | # endif | ||
98 | #endif | ||
99 | |||
100 | niro | 816 | /* FAST_FUNC is a qualifier which (possibly) makes function call faster |
101 | * and/or smaller by using modified ABI. It is usually only needed | ||
102 | * on non-static, busybox internal functions. Recent versions of gcc | ||
103 | * optimize statics automatically. FAST_FUNC on static is required | ||
104 | * only if you need to match a function pointer's type */ | ||
105 | #if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */ | ||
106 | /* stdcall makes callee to pop arguments from stack, not caller */ | ||
107 | # define FAST_FUNC __attribute__((regparm(3),stdcall)) | ||
108 | /* #elif ... - add your favorite arch today! */ | ||
109 | #else | ||
110 | # define FAST_FUNC | ||
111 | #endif | ||
112 | |||
113 | niro | 532 | /* ---- Endian Detection ------------------------------------ */ |
114 | |||
115 | #if (defined __digital__ && defined __unix__) | ||
116 | # include <sex.h> | ||
117 | # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN) | ||
118 | # define __BYTE_ORDER BYTE_ORDER | ||
119 | #elif !defined __APPLE__ | ||
120 | # include <byteswap.h> | ||
121 | # include <endian.h> | ||
122 | #endif | ||
123 | |||
124 | #ifdef __BIG_ENDIAN__ | ||
125 | # define BB_BIG_ENDIAN 1 | ||
126 | # define BB_LITTLE_ENDIAN 0 | ||
127 | #elif __BYTE_ORDER == __BIG_ENDIAN | ||
128 | # define BB_BIG_ENDIAN 1 | ||
129 | # define BB_LITTLE_ENDIAN 0 | ||
130 | #else | ||
131 | # define BB_BIG_ENDIAN 0 | ||
132 | # define BB_LITTLE_ENDIAN 1 | ||
133 | #endif | ||
134 | |||
135 | niro | 816 | /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */ |
136 | niro | 532 | #if BB_BIG_ENDIAN |
137 | #define SWAP_BE16(x) (x) | ||
138 | #define SWAP_BE32(x) (x) | ||
139 | #define SWAP_BE64(x) (x) | ||
140 | #define SWAP_LE16(x) bswap_16(x) | ||
141 | #define SWAP_LE32(x) bswap_32(x) | ||
142 | #define SWAP_LE64(x) bswap_64(x) | ||
143 | #else | ||
144 | #define SWAP_BE16(x) bswap_16(x) | ||
145 | #define SWAP_BE32(x) bswap_32(x) | ||
146 | #define SWAP_BE64(x) bswap_64(x) | ||
147 | #define SWAP_LE16(x) (x) | ||
148 | #define SWAP_LE32(x) (x) | ||
149 | #define SWAP_LE64(x) (x) | ||
150 | #endif | ||
151 | |||
152 | niro | 816 | /* ---- Unaligned access ------------------------------------ */ |
153 | |||
154 | /* parameter is supposed to be an uint32_t* ptr */ | ||
155 | #if defined(i386) || defined(__x86_64__) | ||
156 | #define get_unaligned_u32p(u32p) (*(u32p)) | ||
157 | /* #elif ... - add your favorite arch today! */ | ||
158 | #else | ||
159 | /* performs reasonably well (gcc usually inlines memcpy here) */ | ||
160 | #define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; }) | ||
161 | #endif | ||
162 | |||
163 | niro | 532 | /* ---- Networking ------------------------------------------ */ |
164 | niro | 816 | |
165 | niro | 532 | #ifndef __APPLE__ |
166 | # include <arpa/inet.h> | ||
167 | niro | 816 | # ifndef __socklen_t_defined |
168 | typedef int socklen_t; | ||
169 | # endif | ||
170 | niro | 532 | #else |
171 | # include <netinet/in.h> | ||
172 | #endif | ||
173 | |||
174 | niro | 816 | /* ---- Compiler dependent settings ------------------------- */ |
175 | niro | 532 | |
176 | niro | 816 | #if (defined __digital__ && defined __unix__) || defined __APPLE__ |
177 | niro | 532 | # undef HAVE_MNTENT_H |
178 | niro | 816 | # undef HAVE_SYS_STATFS_H |
179 | niro | 532 | #else |
180 | # define HAVE_MNTENT_H 1 | ||
181 | niro | 816 | # define HAVE_SYS_STATFS_H 1 |
182 | niro | 532 | #endif /* ___digital__ && __unix__ */ |
183 | |||
184 | niro | 816 | /* linux/loop.h relies on __u64. Make sure we have that as a proper type |
185 | * until userspace is widely fixed. */ | ||
186 | #if (defined __INTEL_COMPILER && !defined __GNUC__) || \ | ||
187 | (defined __GNUC__ && defined __STRICT_ANSI__) | ||
188 | __extension__ typedef __signed__ long long __s64; | ||
189 | __extension__ typedef unsigned long long __u64; | ||
190 | #endif | ||
191 | |||
192 | niro | 532 | /*----- Kernel versioning ------------------------------------*/ |
193 | niro | 816 | |
194 | niro | 532 | #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) |
195 | |||
196 | niro | 816 | /* ---- Miscellaneous --------------------------------------- */ |
197 | niro | 532 | |
198 | #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ | ||
199 | !defined(__dietlibc__) && \ | ||
200 | !defined(_NEWLIB_VERSION) && \ | ||
201 | !(defined __digital__ && defined __unix__) | ||
202 | # error "Sorry, this libc version is not supported :(" | ||
203 | #endif | ||
204 | |||
205 | niro | 816 | /* Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. */ |
206 | niro | 532 | |
207 | #if defined __GLIBC__ || defined __UCLIBC__ \ | ||
208 | || defined __dietlibc__ || defined _NEWLIB_VERSION | ||
209 | #include <features.h> | ||
210 | #define HAVE_FEATURES_H | ||
211 | #include <stdint.h> | ||
212 | #define HAVE_STDINT_H | ||
213 | niro | 816 | #elif !defined __APPLE__ |
214 | niro | 532 | /* Largest integral types. */ |
215 | #if __BIG_ENDIAN__ | ||
216 | niro | 816 | typedef long intmax_t; |
217 | typedef unsigned long uintmax_t; | ||
218 | niro | 532 | #else |
219 | __extension__ | ||
220 | niro | 816 | typedef long long intmax_t; |
221 | niro | 532 | __extension__ |
222 | niro | 816 | typedef unsigned long long uintmax_t; |
223 | niro | 532 | #endif |
224 | #endif | ||
225 | |||
226 | /* Size-saving "small" ints (arch-dependent) */ | ||
227 | #if defined(i386) || defined(__x86_64__) || defined(__mips__) || defined(__cris__) | ||
228 | /* add other arches which benefit from this... */ | ||
229 | typedef signed char smallint; | ||
230 | typedef unsigned char smalluint; | ||
231 | #else | ||
232 | /* for arches where byte accesses generate larger code: */ | ||
233 | typedef int smallint; | ||
234 | typedef unsigned smalluint; | ||
235 | #endif | ||
236 | |||
237 | niro | 816 | /* ISO C Standard: 7.16 Boolean type and values <stdbool.h> */ |
238 | #if (defined __digital__ && defined __unix__) | ||
239 | /* old system without (proper) C99 support */ | ||
240 | #define bool smalluint | ||
241 | #else | ||
242 | /* modern system, so use it */ | ||
243 | #include <stdbool.h> | ||
244 | #endif | ||
245 | |||
246 | /* Try to defeat gcc's alignment of "char message[]"-like data */ | ||
247 | #if 1 /* if needed: !defined(arch1) && !defined(arch2) */ | ||
248 | #define ALIGN1 __attribute__((aligned(1))) | ||
249 | #define ALIGN2 __attribute__((aligned(2))) | ||
250 | #else | ||
251 | /* Arches which MUST have 2 or 4 byte alignment for everything are here */ | ||
252 | #define ALIGN1 | ||
253 | #define ALIGN2 | ||
254 | #endif | ||
255 | |||
256 | |||
257 | niro | 532 | /* uclibc does not implement daemon() for no-mmu systems. |
258 | * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. | ||
259 | * For earlier versions there is no reliable way to check if we are building | ||
260 | niro | 816 | * for a mmu-less system. |
261 | niro | 532 | */ |
262 | niro | 816 | #if ENABLE_NOMMU || \ |
263 | (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ | ||
264 | __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__) | ||
265 | #define BB_MMU 0 | ||
266 | #define USE_FOR_NOMMU(...) __VA_ARGS__ | ||
267 | #define USE_FOR_MMU(...) | ||
268 | #else | ||
269 | #define BB_MMU 1 | ||
270 | #define USE_FOR_NOMMU(...) | ||
271 | #define USE_FOR_MMU(...) __VA_ARGS__ | ||
272 | niro | 532 | #endif |
273 | |||
274 | /* Platforms that haven't got dprintf need to implement fdprintf() in | ||
275 | * libbb. This would require a platform.c. It's not going to be cleaned | ||
276 | * out of the tree, so stop saying it should be. */ | ||
277 | #if !defined(__dietlibc__) | ||
278 | /* Needed for: glibc */ | ||
279 | /* Not needed for: dietlibc */ | ||
280 | /* Others: ?? (add as needed) */ | ||
281 | #define fdprintf dprintf | ||
282 | #endif | ||
283 | |||
284 | #if defined(__dietlibc__) | ||
285 | niro | 816 | static ALWAYS_INLINE char* strchrnul(const char *s, char c) |
286 | { | ||
287 | niro | 532 | while (*s && *s != c) ++s; |
288 | return (char*)s; | ||
289 | } | ||
290 | #endif | ||
291 | |||
292 | niro | 816 | /* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */ |
293 | niro | 532 | #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ |
294 | defined __UC_LIBC__ | ||
295 | # define lchown chown | ||
296 | #endif | ||
297 | |||
298 | #if (defined __digital__ && defined __unix__) | ||
299 | #include <standards.h> | ||
300 | #define HAVE_STANDARDS_H | ||
301 | #include <inttypes.h> | ||
302 | #define HAVE_INTTYPES_H | ||
303 | #define PRIu32 "u" | ||
304 | |||
305 | niro | 816 | /* use legacy setpgrp(pid_t,pid_t) for now. move to platform.c */ |
306 | #define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0) | ||
307 | niro | 532 | |
308 | #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET | ||
309 | #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) | ||
310 | #endif | ||
311 | #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY | ||
312 | #define ADJ_FREQUENCY MOD_FREQUENCY | ||
313 | #endif | ||
314 | #if !defined ADJ_TIMECONST && defined MOD_TIMECONST | ||
315 | #define ADJ_TIMECONST MOD_TIMECONST | ||
316 | #endif | ||
317 | #if !defined ADJ_TICK && defined MOD_CLKB | ||
318 | #define ADJ_TICK MOD_CLKB | ||
319 | #endif | ||
320 | |||
321 | #else | ||
322 | niro | 816 | #define bb_setpgrp() setpgrp() |
323 | niro | 532 | #endif |
324 | |||
325 | #if defined(__linux__) | ||
326 | #include <sys/mount.h> | ||
327 | niro | 816 | /* Make sure we have all the new mount flags we actually try to use. */ |
328 | niro | 532 | #ifndef MS_BIND |
329 | #define MS_BIND (1<<12) | ||
330 | #endif | ||
331 | #ifndef MS_MOVE | ||
332 | #define MS_MOVE (1<<13) | ||
333 | #endif | ||
334 | #ifndef MS_RECURSIVE | ||
335 | #define MS_RECURSIVE (1<<14) | ||
336 | #endif | ||
337 | #ifndef MS_SILENT | ||
338 | #define MS_SILENT (1<<15) | ||
339 | #endif | ||
340 | |||
341 | niro | 816 | /* The shared subtree stuff, which went in around 2.6.15. */ |
342 | niro | 532 | #ifndef MS_UNBINDABLE |
343 | #define MS_UNBINDABLE (1<<17) | ||
344 | #endif | ||
345 | #ifndef MS_PRIVATE | ||
346 | #define MS_PRIVATE (1<<18) | ||
347 | #endif | ||
348 | #ifndef MS_SLAVE | ||
349 | #define MS_SLAVE (1<<19) | ||
350 | #endif | ||
351 | #ifndef MS_SHARED | ||
352 | #define MS_SHARED (1<<20) | ||
353 | #endif | ||
354 | niro | 816 | #ifndef MS_RELATIME |
355 | #define MS_RELATIME (1 << 21) | ||
356 | #endif | ||
357 | niro | 532 | |
358 | #if !defined(BLKSSZGET) | ||
359 | #define BLKSSZGET _IO(0x12, 104) | ||
360 | #endif | ||
361 | #if !defined(BLKGETSIZE64) | ||
362 | #define BLKGETSIZE64 _IOR(0x12,114,size_t) | ||
363 | #endif | ||
364 | #endif | ||
365 | |||
366 | #endif /* platform.h */ |