Magellan Linux

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 983 by niro, Fri Apr 24 18:33:46 2009 UTC revision 984 by niro, Sun May 30 11:32:42 2010 UTC
# Line 4  Line 4 
4    
5     Licensed under the GPL v2 or later, see the file LICENSE in this tarball.     Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
6  */  */
7  #ifndef __PLATFORM_H  #ifndef BB_PLATFORM_H
8  #define __PLATFORM_H 1  #define BB_PLATFORM_H 1
9    
10    /* 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    #define HAVE_STRSIGNAL 1
20    #define HAVE_VASPRINTF 1
21    
22  /* Convenience macros to test the version of gcc. */  /* Convenience macros to test the version of gcc. */
23  #undef __GNUC_PREREQ  #undef __GNUC_PREREQ
# Line 19  Line 31 
31  /* __restrict is known in EGCS 1.2 and above. */  /* __restrict is known in EGCS 1.2 and above. */
32  #if !__GNUC_PREREQ(2,92)  #if !__GNUC_PREREQ(2,92)
33  # ifndef __restrict  # ifndef __restrict
34  #  define __restrict     /* Ignore */  #  define __restrict
35  # endif  # endif
36  #endif  #endif
37    
# Line 36  Line 48 
48  #undef inline  #undef inline
49  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
50  /* it's a keyword */  /* it's a keyword */
51    #elif __GNUC_PREREQ(2,7)
52    # define inline __inline__
53  #else  #else
54  # if __GNUC_PREREQ(2,7)  # define inline
 #  define inline __inline__  
 # else  
 #  define inline  
 # endif  
55  #endif  #endif
56    
57  #ifndef __const  #ifndef __const
# Line 50  Line 60 
60    
61  #define UNUSED_PARAM __attribute__ ((__unused__))  #define UNUSED_PARAM __attribute__ ((__unused__))
62  #define NORETURN __attribute__ ((__noreturn__))  #define NORETURN __attribute__ ((__noreturn__))
63    /* "The malloc attribute is used to tell the compiler that a function
64     * may be treated as if any non-NULL pointer it returns cannot alias
65     * any other pointer valid when the function returns. This will often
66     * improve optimization. Standard functions with this property include
67     * malloc and calloc. realloc-like functions have this property as long
68     * as the old pointer is never referred to (including comparing it
69     * to the new pointer) after the function returns a non-NULL value."
70     */
71    #define RETURNS_MALLOC __attribute__ ((malloc))
72  #define PACKED __attribute__ ((__packed__))  #define PACKED __attribute__ ((__packed__))
73  #define ALIGNED(m) __attribute__ ((__aligned__(m)))  #define ALIGNED(m) __attribute__ ((__aligned__(m)))
74    
75  /* __NO_INLINE__: some gcc's do not honor inlining! :( */  /* __NO_INLINE__: some gcc's do not honor inlining! :( */
76  #if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)  #if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)
77  # define ALWAYS_INLINE __attribute__ ((always_inline)) inline  # define ALWAYS_INLINE __attribute__ ((always_inline)) inline
# Line 61  Line 81 
81  #  define DEPRECATED __attribute__ ((__deprecated__))  #  define DEPRECATED __attribute__ ((__deprecated__))
82  #  define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))  #  define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))
83  # else  # else
84  #  define DEPRECATED /* n/a */  #  define DEPRECATED
85  #  define UNUSED_PARAM_RESULT /* n/a */  #  define UNUSED_PARAM_RESULT
86  # endif  # endif
87  #else  #else
88  # define ALWAYS_INLINE inline /* n/a */  # define ALWAYS_INLINE inline
89  # define NOINLINE /* n/a */  # define NOINLINE
90  # define DEPRECATED /* n/a */  # define DEPRECATED
91  # define UNUSED_PARAM_RESULT /* n/a */  # define UNUSED_PARAM_RESULT
92  #endif  #endif
93    
94  /* -fwhole-program makes all symbols local. The attribute externally_visible  /* -fwhole-program makes all symbols local. The attribute externally_visible
# Line 78  Line 98 
98  //__attribute__ ((__externally_visible__))  //__attribute__ ((__externally_visible__))
99  #else  #else
100  # define EXTERNALLY_VISIBLE  # define EXTERNALLY_VISIBLE
101  #endif /* GNUC >= 4.1 */  #endif
102    
103  /* We use __extension__ in some places to suppress -pedantic warnings  /* We use __extension__ in some places to suppress -pedantic warnings
104     about GCC extensions.  This feature didn't work properly before     about GCC extensions.  This feature didn't work properly before
# Line 110  Line 130 
130  # define FAST_FUNC  # define FAST_FUNC
131  #endif  #endif
132    
133    /* Make all declarations hidden (-fvisibility flag only affects definitions) */
134    /* (don't include system headers after this until corresponding pop!) */
135    #if __GNUC_PREREQ(4,1)
136    # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN _Pragma("GCC visibility push(hidden)")
137    # define POP_SAVED_FUNCTION_VISIBILITY              _Pragma("GCC visibility pop")
138    #else
139    # define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
140    # define POP_SAVED_FUNCTION_VISIBILITY
141    #endif
142    
143  /* ---- Endian Detection ------------------------------------ */  /* ---- Endian Detection ------------------------------------ */
144    
145  #if (defined __digital__ && defined __unix__)  #if defined(__digital__) && defined(__unix__)
146  # include <sex.h>  # include <sex.h>
147  # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)  # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN)
148  # define __BYTE_ORDER BYTE_ORDER  # define __BYTE_ORDER BYTE_ORDER
149    #elif defined __FreeBSD__
150    # include <sys/resource.h> /* rlimit */
151    # include <machine/endian.h>
152    # define bswap_64 __bswap64
153    # define bswap_32 __bswap32
154    # define bswap_16 __bswap16
155    # define __BIG_ENDIAN__ (_BYTE_ORDER == _BIG_ENDIAN)
156  #elif !defined __APPLE__  #elif !defined __APPLE__
157  # include <byteswap.h>  # include <byteswap.h>
158  # include <endian.h>  # include <endian.h>
159  #endif  #endif
160    
161  #ifdef __BIG_ENDIAN__  #if defined(__BIG_ENDIAN__) && __BIG_ENDIAN__
162  # define BB_BIG_ENDIAN 1  # define BB_BIG_ENDIAN 1
163  # define BB_LITTLE_ENDIAN 0  # define BB_LITTLE_ENDIAN 0
164  #elif __BYTE_ORDER == __BIG_ENDIAN  #elif __BYTE_ORDER == __BIG_ENDIAN
165  # define BB_BIG_ENDIAN 1  # define BB_BIG_ENDIAN 1
166  # define BB_LITTLE_ENDIAN 0  # define BB_LITTLE_ENDIAN 0
167  #else  #elif __BYTE_ORDER == __LITTLE_ENDIAN
168  # define BB_BIG_ENDIAN 0  # define BB_BIG_ENDIAN 0
169  # define BB_LITTLE_ENDIAN 1  # define BB_LITTLE_ENDIAN 1
170    #else
171    # error "Can't determine endianness"
172  #endif  #endif
173    
174  /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */  /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
175  #if BB_BIG_ENDIAN  #if BB_BIG_ENDIAN
176  #define SWAP_BE16(x) (x)  # define SWAP_BE16(x) (x)
177  #define SWAP_BE32(x) (x)  # define SWAP_BE32(x) (x)
178  #define SWAP_BE64(x) (x)  # define SWAP_BE64(x) (x)
179  #define SWAP_LE16(x) bswap_16(x)  # define SWAP_LE16(x) bswap_16(x)
180  #define SWAP_LE32(x) bswap_32(x)  # define SWAP_LE32(x) bswap_32(x)
181  #define SWAP_LE64(x) bswap_64(x)  # define SWAP_LE64(x) bswap_64(x)
182  #else  #else
183  #define SWAP_BE16(x) bswap_16(x)  # define SWAP_BE16(x) bswap_16(x)
184  #define SWAP_BE32(x) bswap_32(x)  # define SWAP_BE32(x) bswap_32(x)
185  #define SWAP_BE64(x) bswap_64(x)  # define SWAP_BE64(x) bswap_64(x)
186  #define SWAP_LE16(x) (x)  # define SWAP_LE16(x) (x)
187  #define SWAP_LE32(x) (x)  # define SWAP_LE32(x) (x)
188  #define SWAP_LE64(x) (x)  # define SWAP_LE64(x) (x)
189  #endif  #endif
190    
191  /* ---- Unaligned access ------------------------------------ */  /* ---- Unaligned access ------------------------------------ */
192    
193  /* parameter is supposed to be an uint32_t* ptr */  /* NB: unaligned parameter should be a pointer, aligned one -
194     * a lvalue. This makes it more likely to not swap them by mistake
195     */
196  #if defined(i386) || defined(__x86_64__)  #if defined(i386) || defined(__x86_64__)
197  #define get_unaligned_u32p(u32p) (*(u32p))  # define move_from_unaligned_int(v, intp) ((v) = *(int*)(intp))
198    # define move_from_unaligned16(v, u16p) ((v) = *(uint16_t*)(u16p))
199    # define move_from_unaligned32(v, u32p) ((v) = *(uint32_t*)(u32p))
200    # define move_to_unaligned32(u32p, v)   (*(uint32_t*)(u32p) = (v))
201  /* #elif ... - add your favorite arch today! */  /* #elif ... - add your favorite arch today! */
202  #else  #else
203  /* performs reasonably well (gcc usually inlines memcpy here) */  /* performs reasonably well (gcc usually inlines memcpy here) */
204  #define get_unaligned_u32p(u32p) ({ uint32_t __t; memcpy(&__t, (u32p), 4); __t; })  # define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
205    # define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
206    # define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
207    # define move_to_unaligned32(u32p, v) do { \
208     uint32_t __t = (v); \
209     memcpy((u32p), &__t, 4); \
210    } while (0)
211  #endif  #endif
212    
213  /* ---- Networking ------------------------------------------ */  /* ---- Networking ------------------------------------------ */
214    
215  #ifndef __APPLE__  #ifndef __APPLE__
216  # include <arpa/inet.h>  # include <arpa/inet.h>
217  # ifndef __socklen_t_defined  # if !defined(__socklen_t_defined) && !defined(_SOCKLEN_T_DECLARED)
218  typedef int socklen_t;  typedef int socklen_t;
219  # endif  # endif
220  #else  #else
# Line 173  typedef int socklen_t; Line 223  typedef int socklen_t;
223    
224  /* ---- Compiler dependent settings ------------------------- */  /* ---- Compiler dependent settings ------------------------- */
225    
226  #if (defined __digital__ && defined __unix__) || defined __APPLE__  #if (defined __digital__ && defined __unix__) \
227     || defined __APPLE__ || defined __FreeBSD__
228  # undef HAVE_MNTENT_H  # undef HAVE_MNTENT_H
229  # undef HAVE_SYS_STATFS_H  # undef HAVE_SYS_STATFS_H
230  #else  #else
231  # define HAVE_MNTENT_H 1  # define HAVE_MNTENT_H 1
232  # define HAVE_SYS_STATFS_H 1  # define HAVE_SYS_STATFS_H 1
 #endif /* ___digital__ && __unix__ */  
   
 /* linux/loop.h relies on __u64. Make sure we have that as a proper type  
  * until userspace is widely fixed.  */  
 #if (defined __INTEL_COMPILER && !defined __GNUC__) || \  
  (defined __GNUC__ && defined __STRICT_ANSI__)  
 __extension__ typedef __signed__ long long __s64;  
 __extension__ typedef unsigned long long __u64;  
233  #endif  #endif
234    
235  /*----- Kernel versioning ------------------------------------*/  /*----- Kernel versioning ------------------------------------*/
# Line 205  __extension__ typedef unsigned long long Line 248  __extension__ typedef unsigned long long
248  /* Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead. */  /* Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead. */
249    
250  #if defined __GLIBC__ || defined __UCLIBC__ \  #if defined __GLIBC__ || defined __UCLIBC__ \
251   || defined __dietlibc__ || defined _NEWLIB_VERSION   || defined __dietlibc__ || defined _NEWLIB_VERSION
252  #include <features.h>  # include <features.h>
253  #define HAVE_FEATURES_H  # define HAVE_FEATURES_H
254  #include <stdint.h>  # include <stdint.h>
255  #define HAVE_STDINT_H  # define HAVE_STDINT_H
256  #elif !defined __APPLE__  #elif !defined __APPLE__
257  /* Largest integral types.  */  /* Largest integral types. */
258  #if __BIG_ENDIAN__  # if BB_BIG_ENDIAN
259    /* Looks BROKEN! */
260  typedef long                intmax_t;  typedef long                intmax_t;
261  typedef unsigned long       uintmax_t;  typedef unsigned long       uintmax_t;
262  #else  # else
263  __extension__  __extension__
264  typedef long long           intmax_t;  typedef long long           intmax_t;
265  __extension__  __extension__
266  typedef unsigned long long  uintmax_t;  typedef unsigned long long  uintmax_t;
267  #endif  # endif
268  #endif  #endif
269    
270  /* Size-saving "small" ints (arch-dependent) */  /* Size-saving "small" ints (arch-dependent) */
# Line 237  typedef unsigned smalluint; Line 281  typedef unsigned smalluint;
281  /* ISO C Standard:  7.16  Boolean type and values  <stdbool.h> */  /* ISO C Standard:  7.16  Boolean type and values  <stdbool.h> */
282  #if (defined __digital__ && defined __unix__)  #if (defined __digital__ && defined __unix__)
283  /* old system without (proper) C99 support */  /* old system without (proper) C99 support */
284  #define bool smalluint  # define bool smalluint
285  #else  #else
286  /* modern system, so use it */  /* modern system, so use it */
287  #include <stdbool.h>  # include <stdbool.h>
288  #endif  #endif
289    
290  /* Try to defeat gcc's alignment of "char message[]"-like data */  /* Try to defeat gcc's alignment of "char message[]"-like data */
291  #if 1 /* if needed: !defined(arch1) && !defined(arch2) */  #if 1 /* if needed: !defined(arch1) && !defined(arch2) */
292  #define ALIGN1 __attribute__((aligned(1)))  # define ALIGN1 __attribute__((aligned(1)))
293  #define ALIGN2 __attribute__((aligned(2)))  # define ALIGN2 __attribute__((aligned(2)))
294  #else  #else
295  /* Arches which MUST have 2 or 4 byte alignment for everything are here */  /* Arches which MUST have 2 or 4 byte alignment for everything are here */
296  #define ALIGN1  # define ALIGN1
297  #define ALIGN2  # define ALIGN2
298  #endif  #endif
299    
300    
# Line 262  typedef unsigned smalluint; Line 306  typedef unsigned smalluint;
306  #if ENABLE_NOMMU || \  #if ENABLE_NOMMU || \
307      (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \      (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
308      __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__)      __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__)
309  #define BB_MMU 0  # define BB_MMU 0
310  #define USE_FOR_NOMMU(...) __VA_ARGS__  # define USE_FOR_NOMMU(...) __VA_ARGS__
311  #define USE_FOR_MMU(...)  # define USE_FOR_MMU(...)
312  #else  #else
313  #define BB_MMU 1  # define BB_MMU 1
314  #define USE_FOR_NOMMU(...)  # define USE_FOR_NOMMU(...)
315  #define USE_FOR_MMU(...) __VA_ARGS__  # define USE_FOR_MMU(...) __VA_ARGS__
 #endif  
   
 /* Platforms that haven't got dprintf need to implement fdprintf() in  
  * libbb.  This would require a platform.c.  It's not going to be cleaned  
  * out of the tree, so stop saying it should be. */  
 #if !defined(__dietlibc__)  
 /* Needed for: glibc */  
 /* Not needed for: dietlibc */  
 /* Others: ?? (add as needed) */  
 #define fdprintf dprintf  
 #endif  
   
 #if defined(__dietlibc__)  
 static ALWAYS_INLINE char* strchrnul(const char *s, char c)  
 {  
  while (*s && *s != c) ++s;  
  return (char*)s;  
 }  
316  #endif  #endif
317    
318  /* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */  /* Don't use lchown with glibc older than 2.1.x */
319  #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \  #if defined(__GLIBC__) && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1
     defined __UC_LIBC__  
320  # define lchown chown  # define lchown chown
321  #endif  #endif
322    
323  #if (defined __digital__ && defined __unix__)  #if defined(__digital__) && defined(__unix__)
 #include <standards.h>  
 #define HAVE_STANDARDS_H  
 #include <inttypes.h>  
 #define HAVE_INTTYPES_H  
 #define PRIu32 "u"  
324    
325    # include <standards.h>
326    # include <inttypes.h>
327    # define PRIu32 "u"
328  /* use legacy setpgrp(pid_t,pid_t) for now.  move to platform.c */  /* use legacy setpgrp(pid_t,pid_t) for now.  move to platform.c */
329  #define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0)  # define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me, __me); } while (0)
330    # if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
331  #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET  #  define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
332  #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)  # endif
333  #endif  # if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
334  #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY  #  define ADJ_FREQUENCY MOD_FREQUENCY
335  #define ADJ_FREQUENCY MOD_FREQUENCY  # endif
336  #endif  # if !defined ADJ_TIMECONST && defined MOD_TIMECONST
337  #if !defined ADJ_TIMECONST && defined MOD_TIMECONST  #  define ADJ_TIMECONST MOD_TIMECONST
338  #define ADJ_TIMECONST MOD_TIMECONST  # endif
339  #endif  # if !defined ADJ_TICK && defined MOD_CLKB
340  #if !defined ADJ_TICK && defined MOD_CLKB  #  define ADJ_TICK MOD_CLKB
341  #define ADJ_TICK MOD_CLKB  # endif
 #endif  
342    
343  #else  #else
344  #define bb_setpgrp() setpgrp()  
345    # define bb_setpgrp() setpgrp()
346    
347  #endif  #endif
348    
349  #if defined(__linux__)  #if defined(__GLIBC__)
350  #include <sys/mount.h>  # define fdprintf dprintf
 /* Make sure we have all the new mount flags we actually try to use. */  
 #ifndef MS_BIND  
 #define MS_BIND        (1<<12)  
351  #endif  #endif
352  #ifndef MS_MOVE  
353  #define MS_MOVE        (1<<13)  #if defined(__dietlibc__)
354    # undef HAVE_STRCHRNUL
355  #endif  #endif
356  #ifndef MS_RECURSIVE  
357  #define MS_RECURSIVE   (1<<14)  #if defined(__WATCOMC__)
358    # undef HAVE_FDPRINTF
359    # undef HAVE_MEMRCHR
360    # undef HAVE_MKDTEMP
361    # undef HAVE_SETBIT
362    # undef HAVE_STRCASESTR
363    # undef HAVE_STRCHRNUL
364    # undef HAVE_STRSIGNAL
365    # undef HAVE_VASPRINTF
366  #endif  #endif
367  #ifndef MS_SILENT  
368  #define MS_SILENT      (1<<15)  #if defined(__FreeBSD__)
369    # undef HAVE_STRCHRNUL
370  #endif  #endif
371    
372  /* The shared subtree stuff, which went in around 2.6.15. */  /*
373  #ifndef MS_UNBINDABLE   * Now, define prototypes for all the functions defined in platform.c
374  #define MS_UNBINDABLE  (1<<17)   * These must come after all the HAVE_* macros are defined (or not)
375     */
376    
377    #ifndef HAVE_FDPRINTF
378    extern int fdprintf(int fd, const char *format, ...);
379  #endif  #endif
380  #ifndef MS_PRIVATE  
381  #define MS_PRIVATE     (1<<18)  #ifndef HAVE_MEMRCHR
382    extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
383  #endif  #endif
384  #ifndef MS_SLAVE  
385  #define MS_SLAVE       (1<<19)  #ifndef HAVE_MKDTEMP
386    extern char *mkdtemp(char *template) FAST_FUNC;
387  #endif  #endif
388  #ifndef MS_SHARED  
389  #define MS_SHARED      (1<<20)  #ifndef HAVE_SETBIT
390    # define setbit(a, b)  ((a)[(b) >> 3] |= 1 << ((b) & 7))
391    # define clrbit(a, b)  ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
392  #endif  #endif
393  #ifndef MS_RELATIME  
394  #define MS_RELATIME   (1 << 21)  #ifndef HAVE_STRCASESTR
395    extern char *strcasestr(const char *s, const char *pattern) FAST_FUNC;
396  #endif  #endif
397    
398  #if !defined(BLKSSZGET)  #ifndef HAVE_STRCHRNUL
399  #define BLKSSZGET _IO(0x12, 104)  extern char *strchrnul(const char *s, int c) FAST_FUNC;
400  #endif  #endif
401  #if !defined(BLKGETSIZE64)  
402  #define BLKGETSIZE64 _IOR(0x12,114,size_t)  #ifndef HAVE_STRSIGNAL
403    /* Not exactly the same: instead of "Stopped" it shows "STOP" etc */
404    # define strsignal(sig) get_signame(sig)
405  #endif  #endif
406    
407    #ifndef HAVE_VASPRINTF
408    extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
409  #endif  #endif
410    
411  #endif /* platform.h */  #endif

Legend:
Removed from v.983  
changed lines
  Added in v.984