Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/include/platform.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1123 - (hide annotations) (download)
Wed Aug 18 21:56:57 2010 UTC (13 years, 9 months ago) by niro
File MIME type: text/plain
File size: 12379 byte(s)
-updated to busybox-1.17.1
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 niro 984 #ifndef BB_PLATFORM_H
8     #define BB_PLATFORM_H 1
9 niro 532
10 niro 984 /* Assume all these functions exist by default. Platforms where it is not
11     * true will #undef them below.
12     */
13     #define HAVE_FDPRINTF 1
14     #define HAVE_MEMRCHR 1
15     #define HAVE_MKDTEMP 1
16     #define HAVE_SETBIT 1
17     #define HAVE_STRCASESTR 1
18     #define HAVE_STRCHRNUL 1
19 niro 1123 #define HAVE_STRSEP 1
20 niro 984 #define HAVE_STRSIGNAL 1
21     #define HAVE_VASPRINTF 1
22    
23 niro 532 /* Convenience macros to test the version of gcc. */
24     #undef __GNUC_PREREQ
25     #if defined __GNUC__ && defined __GNUC_MINOR__
26     # define __GNUC_PREREQ(maj, min) \
27     ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
28     #else
29     # define __GNUC_PREREQ(maj, min) 0
30     #endif
31    
32     /* __restrict is known in EGCS 1.2 and above. */
33 niro 816 #if !__GNUC_PREREQ(2,92)
34 niro 532 # ifndef __restrict
35 niro 984 # define __restrict
36 niro 532 # endif
37     #endif
38    
39     /* Define macros for some gcc attributes. This permits us to use the
40     macros freely, and know that they will come into play for the
41     version of gcc in which they are supported. */
42    
43 niro 816 #if !__GNUC_PREREQ(2,7)
44 niro 532 # ifndef __attribute__
45     # define __attribute__(x)
46     # endif
47     #endif
48    
49     #undef inline
50     #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
51     /* it's a keyword */
52 niro 984 #elif __GNUC_PREREQ(2,7)
53     # define inline __inline__
54 niro 532 #else
55 niro 984 # define inline
56 niro 532 #endif
57    
58     #ifndef __const
59     # define __const const
60     #endif
61    
62 niro 816 #define UNUSED_PARAM __attribute__ ((__unused__))
63     #define NORETURN __attribute__ ((__noreturn__))
64 niro 984 /* "The malloc attribute is used to tell the compiler that a function
65     * may be treated as if any non-NULL pointer it returns cannot alias
66     * any other pointer valid when the function returns. This will often
67     * improve optimization. Standard functions with this property include
68     * malloc and calloc. realloc-like functions have this property as long
69     * as the old pointer is never referred to (including comparing it
70     * to the new pointer) after the function returns a non-NULL value."
71     */
72     #define RETURNS_MALLOC __attribute__ ((malloc))
73 niro 816 #define PACKED __attribute__ ((__packed__))
74     #define ALIGNED(m) __attribute__ ((__aligned__(m)))
75 niro 984
76 niro 816 /* __NO_INLINE__: some gcc's do not honor inlining! :( */
77     #if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)
78     # define ALWAYS_INLINE __attribute__ ((always_inline)) inline
79     /* I've seen a toolchain where I needed __noinline__ instead of noinline */
80     # define NOINLINE __attribute__((__noinline__))
81     # if !ENABLE_WERROR
82     # define DEPRECATED __attribute__ ((__deprecated__))
83     # define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))
84 niro 532 # else
85 niro 984 # define DEPRECATED
86     # define UNUSED_PARAM_RESULT
87 niro 532 # endif
88 niro 816 #else
89 niro 984 # define ALWAYS_INLINE inline
90     # define NOINLINE
91     # define DEPRECATED
92     # define UNUSED_PARAM_RESULT
93 niro 816 #endif
94 niro 532
95     /* -fwhole-program makes all symbols local. The attribute externally_visible
96     forces a symbol global. */
97 niro 816 #if __GNUC_PREREQ(4,1)
98     # define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
99     //__attribute__ ((__externally_visible__))
100     #else
101     # define EXTERNALLY_VISIBLE
102 niro 984 #endif
103 niro 532
104 niro 1123 /* At 4.4 gcc become much more anal about this, need to use "aliased" types */
105     #if __GNUC_PREREQ(4,4)
106     # define FIX_ALIASING __attribute__((__may_alias__))
107     #else
108     # define FIX_ALIASING
109     #endif
110    
111 niro 532 /* We use __extension__ in some places to suppress -pedantic warnings
112     about GCC extensions. This feature didn't work properly before
113     gcc 2.8. */
114 niro 816 #if !__GNUC_PREREQ(2,8)
115 niro 532 # ifndef __extension__
116     # define __extension__
117     # endif
118     #endif
119    
120     /* gcc-2.95 had no va_copy but only __va_copy. */
121 niro 816 #if !__GNUC_PREREQ(3,0)
122 niro 532 # include <stdarg.h>
123     # if !defined va_copy && defined __va_copy
124     # define va_copy(d,s) __va_copy((d),(s))
125     # endif
126     #endif
127    
128 niro 816 /* FAST_FUNC is a qualifier which (possibly) makes function call faster
129     * and/or smaller by using modified ABI. It is usually only needed
130     * on non-static, busybox internal functions. Recent versions of gcc
131     * optimize statics automatically. FAST_FUNC on static is required
132     * only if you need to match a function pointer's type */
133     #if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */
134     /* stdcall makes callee to pop arguments from stack, not caller */
135     # define FAST_FUNC __attribute__((regparm(3),stdcall))
136     /* #elif ... - add your favorite arch today! */
137     #else
138     # define FAST_FUNC
139     #endif
140    
141 niro 984 /* Make all declarations hidden (-fvisibility flag only affects definitions) */
142     /* (don't include system headers after this until corresponding pop!) */
143     #if __GNUC_PREREQ(4,1)
144     # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN _Pragma("GCC visibility push(hidden)")
145     # define POP_SAVED_FUNCTION_VISIBILITY _Pragma("GCC visibility pop")
146     #else
147     # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
148     # define POP_SAVED_FUNCTION_VISIBILITY
149     #endif
150    
151 niro 532 /* ---- Endian Detection ------------------------------------ */
152    
153 niro 984 #if defined(__digital__) && defined(__unix__)
154 niro 532 # include <sex.h>
155     # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)
156     # define __BYTE_ORDER BYTE_ORDER
157 niro 984 #elif defined __FreeBSD__
158     # include <sys/resource.h> /* rlimit */
159     # include <machine/endian.h>
160     # define bswap_64 __bswap64
161     # define bswap_32 __bswap32
162     # define bswap_16 __bswap16
163     # define __BIG_ENDIAN__ (_BYTE_ORDER == _BIG_ENDIAN)
164 niro 532 #elif !defined __APPLE__
165     # include <byteswap.h>
166     # include <endian.h>
167     #endif
168    
169 niro 984 #if defined(__BIG_ENDIAN__) && __BIG_ENDIAN__
170 niro 532 # define BB_BIG_ENDIAN 1
171     # define BB_LITTLE_ENDIAN 0
172 niro 1123 #elif defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN
173 niro 532 # define BB_BIG_ENDIAN 1
174     # define BB_LITTLE_ENDIAN 0
175 niro 1123 #elif (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN) || defined(__386__)
176 niro 532 # define BB_BIG_ENDIAN 0
177     # define BB_LITTLE_ENDIAN 1
178 niro 984 #else
179     # error "Can't determine endianness"
180 niro 532 #endif
181    
182 niro 816 /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
183 niro 532 #if BB_BIG_ENDIAN
184 niro 984 # define SWAP_BE16(x) (x)
185     # define SWAP_BE32(x) (x)
186     # define SWAP_BE64(x) (x)
187     # define SWAP_LE16(x) bswap_16(x)
188     # define SWAP_LE32(x) bswap_32(x)
189     # define SWAP_LE64(x) bswap_64(x)
190 niro 532 #else
191 niro 984 # define SWAP_BE16(x) bswap_16(x)
192     # define SWAP_BE32(x) bswap_32(x)
193     # define SWAP_BE64(x) bswap_64(x)
194     # define SWAP_LE16(x) (x)
195     # define SWAP_LE32(x) (x)
196     # define SWAP_LE64(x) (x)
197 niro 532 #endif
198    
199 niro 816 /* ---- Unaligned access ------------------------------------ */
200    
201 niro 984 /* NB: unaligned parameter should be a pointer, aligned one -
202     * a lvalue. This makes it more likely to not swap them by mistake
203     */
204 niro 1123 #if defined(i386) || defined(__x86_64__) || defined(__powerpc__)
205     # include <stdint.h>
206     typedef int bb__aliased_int FIX_ALIASING;
207     typedef uint16_t bb__aliased_uint16_t FIX_ALIASING;
208     typedef uint32_t bb__aliased_uint32_t FIX_ALIASING;
209     # define move_from_unaligned_int(v, intp) ((v) = *(bb__aliased_int*)(intp))
210     # define move_from_unaligned16(v, u16p) ((v) = *(bb__aliased_uint16_t*)(u16p))
211     # define move_from_unaligned32(v, u32p) ((v) = *(bb__aliased_uint32_t*)(u32p))
212     # define move_to_unaligned16(u16p, v) (*(bb__aliased_uint16_t*)(u16p) = (v))
213     # define move_to_unaligned32(u32p, v) (*(bb__aliased_uint32_t*)(u32p) = (v))
214 niro 816 /* #elif ... - add your favorite arch today! */
215     #else
216     /* performs reasonably well (gcc usually inlines memcpy here) */
217 niro 984 # define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
218     # define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
219     # define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
220 niro 1123 # define move_to_unaligned16(u16p, v) do { \
221     uint16_t __t = (v); \
222     memcpy((u16p), &__t, 4); \
223     } while (0)
224 niro 984 # define move_to_unaligned32(u32p, v) do { \
225     uint32_t __t = (v); \
226     memcpy((u32p), &__t, 4); \
227     } while (0)
228 niro 816 #endif
229    
230     /* ---- Compiler dependent settings ------------------------- */
231 niro 532
232 niro 984 #if (defined __digital__ && defined __unix__) \
233     || defined __APPLE__ || defined __FreeBSD__
234 niro 532 # undef HAVE_MNTENT_H
235 niro 816 # undef HAVE_SYS_STATFS_H
236 niro 532 #else
237     # define HAVE_MNTENT_H 1
238 niro 816 # define HAVE_SYS_STATFS_H 1
239     #endif
240    
241 niro 532 /*----- Kernel versioning ------------------------------------*/
242 niro 816
243 niro 532 #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
244    
245 niro 816 /* ---- Miscellaneous --------------------------------------- */
246 niro 532
247     #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \
248     !defined(__dietlibc__) && \
249     !defined(_NEWLIB_VERSION) && \
250     !(defined __digital__ && defined __unix__)
251     # error "Sorry, this libc version is not supported :("
252     #endif
253    
254 niro 816 /* Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. */
255 niro 532
256     #if defined __GLIBC__ || defined __UCLIBC__ \
257 niro 984 || defined __dietlibc__ || defined _NEWLIB_VERSION
258     # include <features.h>
259 niro 532 #endif
260    
261     /* Size-saving "small" ints (arch-dependent) */
262     #if defined(i386) || defined(__x86_64__) || defined(__mips__) || defined(__cris__)
263     /* add other arches which benefit from this... */
264     typedef signed char smallint;
265     typedef unsigned char smalluint;
266     #else
267     /* for arches where byte accesses generate larger code: */
268     typedef int smallint;
269     typedef unsigned smalluint;
270     #endif
271    
272 niro 816 /* ISO C Standard: 7.16 Boolean type and values <stdbool.h> */
273     #if (defined __digital__ && defined __unix__)
274     /* old system without (proper) C99 support */
275 niro 984 # define bool smalluint
276 niro 816 #else
277     /* modern system, so use it */
278 niro 984 # include <stdbool.h>
279 niro 816 #endif
280    
281     /* Try to defeat gcc's alignment of "char message[]"-like data */
282     #if 1 /* if needed: !defined(arch1) && !defined(arch2) */
283 niro 984 # define ALIGN1 __attribute__((aligned(1)))
284     # define ALIGN2 __attribute__((aligned(2)))
285 niro 988 # define ALIGN4 __attribute__((aligned(4)))
286 niro 816 #else
287     /* Arches which MUST have 2 or 4 byte alignment for everything are here */
288 niro 984 # define ALIGN1
289     # define ALIGN2
290 niro 988 # define ALIGN4
291 niro 816 #endif
292    
293    
294 niro 532 /* uclibc does not implement daemon() for no-mmu systems.
295     * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.
296     * For earlier versions there is no reliable way to check if we are building
297 niro 816 * for a mmu-less system.
298 niro 532 */
299 niro 816 #if ENABLE_NOMMU || \
300     (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
301     __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__)
302 niro 984 # define BB_MMU 0
303     # define USE_FOR_NOMMU(...) __VA_ARGS__
304     # define USE_FOR_MMU(...)
305 niro 816 #else
306 niro 984 # define BB_MMU 1
307     # define USE_FOR_NOMMU(...)
308     # define USE_FOR_MMU(...) __VA_ARGS__
309 niro 532 #endif
310    
311 niro 984 /* Don't use lchown with glibc older than 2.1.x */
312     #if defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1
313 niro 532 # define lchown chown
314     #endif
315    
316 niro 984 #if defined(__digital__) && defined(__unix__)
317 niro 532
318 niro 984 # include <standards.h>
319     # include <inttypes.h>
320     # define PRIu32 "u"
321 niro 816 /* use legacy setpgrp(pid_t,pid_t) for now. move to platform.c */
322 niro 984 # define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me, __me); } while (0)
323     # if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
324     # define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
325     # endif
326     # if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
327     # define ADJ_FREQUENCY MOD_FREQUENCY
328     # endif
329     # if !defined ADJ_TIMECONST && defined MOD_TIMECONST
330     # define ADJ_TIMECONST MOD_TIMECONST
331     # endif
332     # if !defined ADJ_TICK && defined MOD_CLKB
333     # define ADJ_TICK MOD_CLKB
334     # endif
335 niro 532
336 niro 984 #else
337    
338     # define bb_setpgrp() setpgrp()
339    
340 niro 532 #endif
341 niro 984
342     #if defined(__GLIBC__)
343     # define fdprintf dprintf
344 niro 532 #endif
345 niro 984
346     #if defined(__dietlibc__)
347     # undef HAVE_STRCHRNUL
348 niro 532 #endif
349 niro 984
350     #if defined(__WATCOMC__)
351     # undef HAVE_FDPRINTF
352     # undef HAVE_MEMRCHR
353     # undef HAVE_MKDTEMP
354     # undef HAVE_SETBIT
355     # undef HAVE_STRCASESTR
356     # undef HAVE_STRCHRNUL
357 niro 1123 # undef HAVE_STRSEP
358 niro 984 # undef HAVE_STRSIGNAL
359     # undef HAVE_VASPRINTF
360 niro 532 #endif
361    
362 niro 984 #if defined(__FreeBSD__)
363     # undef HAVE_STRCHRNUL
364 niro 532 #endif
365    
366 niro 984 /*
367     * Now, define prototypes for all the functions defined in platform.c
368     * These must come after all the HAVE_* macros are defined (or not)
369     */
370    
371     #ifndef HAVE_FDPRINTF
372     extern int fdprintf(int fd, const char *format, ...);
373 niro 532 #endif
374 niro 984
375     #ifndef HAVE_MEMRCHR
376     extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
377 niro 532 #endif
378 niro 984
379     #ifndef HAVE_MKDTEMP
380     extern char *mkdtemp(char *template) FAST_FUNC;
381 niro 532 #endif
382 niro 984
383     #ifndef HAVE_SETBIT
384     # define setbit(a, b) ((a)[(b) >> 3] |= 1 << ((b) & 7))
385     # define clrbit(a, b) ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
386 niro 532 #endif
387    
388 niro 984 #ifndef HAVE_STRCASESTR
389     extern char *strcasestr(const char *s, const char *pattern) FAST_FUNC;
390 niro 532 #endif
391 niro 984
392     #ifndef HAVE_STRCHRNUL
393     extern char *strchrnul(const char *s, int c) FAST_FUNC;
394 niro 532 #endif
395 niro 984
396 niro 1123 #ifndef HAVE_STRSEP
397     extern char *strsep(char **stringp, const char *delim) FAST_FUNC;
398     #endif
399    
400 niro 984 #ifndef HAVE_STRSIGNAL
401     /* Not exactly the same: instead of "Stopped" it shows "STOP" etc */
402     # define strsignal(sig) get_signame(sig)
403 niro 532 #endif
404 niro 984
405     #ifndef HAVE_VASPRINTF
406     extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
407 niro 532 #endif
408    
409     #endif