Magellan Linux

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

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

revision 815 by niro, Sat Sep 1 22:45:15 2007 UTC revision 816 by niro, Fri Apr 24 18:33:46 2009 UTC
# Line 1  Line 1 
1  /* vi: set sw=4 ts=4: */  /* vi: set sw=4 ts=4: */
2  /*  /*
3     Copyright 2006, Bernhard Fischer     Copyright 2006, Bernhard Reutner-Fischer
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  */  */
# Line 17  Line 17 
17  #endif  #endif
18    
19  /* __restrict is known in EGCS 1.2 and above. */  /* __restrict is known in EGCS 1.2 and above. */
20  #if !__GNUC_PREREQ (2,92)  #if !__GNUC_PREREQ(2,92)
21  # ifndef __restrict  # ifndef __restrict
22  #  define __restrict     /* Ignore */  #  define __restrict     /* Ignore */
23  # endif  # endif
# Line 27  Line 27 
27     macros freely, and know that they will come into play for the     macros freely, and know that they will come into play for the
28     version of gcc in which they are supported.  */     version of gcc in which they are supported.  */
29    
30  #if !__GNUC_PREREQ (2,7)  #if !__GNUC_PREREQ(2,7)
31  # ifndef __attribute__  # ifndef __attribute__
32  #  define __attribute__(x)  #  define __attribute__(x)
33  # endif  # endif
# Line 37  Line 37 
37  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L  #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
38  /* it's a keyword */  /* it's a keyword */
39  #else  #else
40  # if __GNUC_PREREQ (2,7)  # if __GNUC_PREREQ(2,7)
41  #  define inline __inline__  #  define inline __inline__
42  # else  # else
43  #  define inline  #  define inline
# Line 48  Line 48 
48  # define __const const  # define __const const
49  #endif  #endif
50    
51  # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))  #define UNUSED_PARAM __attribute__ ((__unused__))
52  # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))  #define NORETURN __attribute__ ((__noreturn__))
53  # define ATTRIBUTE_PACKED __attribute__ ((__packed__))  #define PACKED __attribute__ ((__packed__))
54  # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m)))  #define ALIGNED(m) __attribute__ ((__aligned__(m)))
55  # if __GNUC_PREREQ (3,0)  /* __NO_INLINE__: some gcc's do not honor inlining! :( */
56  #  define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline  #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  # else  # else
64  #  define ATTRIBUTE_ALWAYS_INLINE inline  #  define DEPRECATED /* n/a */
65    #  define UNUSED_PARAM_RESULT /* n/a */
66  # endif  # endif
67    #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    
74  /* -fwhole-program makes all symbols local. The attribute externally_visible  /* -fwhole-program makes all symbols local. The attribute externally_visible
75     forces a symbol global.  */     forces a symbol global.  */
76  # if __GNUC_PREREQ (4,1)  #if __GNUC_PREREQ(4,1)
77  #  define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__))  # define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
78  # else  //__attribute__ ((__externally_visible__))
79  #  define ATTRIBUTE_EXTERNALLY_VISIBLE  #else
80  # endif /* GNUC >= 4.1 */  # define EXTERNALLY_VISIBLE
81    #endif /* GNUC >= 4.1 */
82    
83  /* We use __extension__ in some places to suppress -pedantic warnings  /* We use __extension__ in some places to suppress -pedantic warnings
84     about GCC extensions.  This feature didn't work properly before     about GCC extensions.  This feature didn't work properly before
85     gcc 2.8.  */     gcc 2.8.  */
86  #if !__GNUC_PREREQ (2,8)  #if !__GNUC_PREREQ(2,8)
87  # ifndef __extension__  # ifndef __extension__
88  #  define __extension__  #  define __extension__
89  # endif  # endif
90  #endif  #endif
91    
92  /* gcc-2.95 had no va_copy but only __va_copy. */  /* gcc-2.95 had no va_copy but only __va_copy. */
93  #if !__GNUC_PREREQ (3,0)  #if !__GNUC_PREREQ(3,0)
94  # include <stdarg.h>  # include <stdarg.h>
95  # if !defined va_copy && defined __va_copy  # if !defined va_copy && defined __va_copy
96  #  define va_copy(d,s) __va_copy((d),(s))  #  define va_copy(d,s) __va_copy((d),(s))
97  # endif  # endif
98  #endif  #endif
99    
100    /* 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  /* ---- Endian Detection ------------------------------------ */  /* ---- Endian Detection ------------------------------------ */
114    
115  #if (defined __digital__ && defined __unix__)  #if (defined __digital__ && defined __unix__)
# Line 105  Line 132 
132  # define BB_LITTLE_ENDIAN 1  # define BB_LITTLE_ENDIAN 1
133  #endif  #endif
134    
135    /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
136  #if BB_BIG_ENDIAN  #if BB_BIG_ENDIAN
137  #define SWAP_BE16(x) (x)  #define SWAP_BE16(x) (x)
138  #define SWAP_BE32(x) (x)  #define SWAP_BE32(x) (x)
# Line 121  Line 149 
149  #define SWAP_LE64(x) (x)  #define SWAP_LE64(x) (x)
150  #endif  #endif
151    
152    /* ---- 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  /* ---- Networking ------------------------------------------ */  /* ---- Networking ------------------------------------------ */
164    
165  #ifndef __APPLE__  #ifndef __APPLE__
166  # include <arpa/inet.h>  # include <arpa/inet.h>
167    # ifndef __socklen_t_defined
168    typedef int socklen_t;
169    # endif
170  #else  #else
171  # include <netinet/in.h>  # include <netinet/in.h>
172  #endif  #endif
173    
 #ifndef __socklen_t_defined  
 typedef int socklen_t;  
 #endif  
   
174  /* ---- Compiler dependent settings ------------------------- */  /* ---- Compiler dependent settings ------------------------- */
175  #if (defined __digital__ && defined __unix__)  
176    #if (defined __digital__ && defined __unix__) || defined __APPLE__
177  # undef HAVE_MNTENT_H  # undef HAVE_MNTENT_H
178    # undef HAVE_SYS_STATFS_H
179  #else  #else
180  # define HAVE_MNTENT_H 1  # define HAVE_MNTENT_H 1
181    # define HAVE_SYS_STATFS_H 1
182  #endif /* ___digital__ && __unix__ */  #endif /* ___digital__ && __unix__ */
183    
184    /* 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  /*----- Kernel versioning ------------------------------------*/  /*----- Kernel versioning ------------------------------------*/
193    
194  #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))  #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
195    
196  /* ---- miscellaneous --------------------------------------- */  /* ---- Miscellaneous --------------------------------------- */
197    
198  #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \  #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \
199   !defined(__dietlibc__) && \   !defined(__dietlibc__) && \
# Line 151  typedef int socklen_t; Line 202  typedef int socklen_t;
202  # error "Sorry, this libc version is not supported :("  # error "Sorry, this libc version is not supported :("
203  #endif  #endif
204    
205  // Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead.  /* Don't perpetuate e2fsck crap into the headers.  Clean up e2fsck instead. */
206    
207  #if defined __GLIBC__ || defined __UCLIBC__ \  #if defined __GLIBC__ || defined __UCLIBC__ \
208   || defined __dietlibc__ || defined _NEWLIB_VERSION   || defined __dietlibc__ || defined _NEWLIB_VERSION
# Line 159  typedef int socklen_t; Line 210  typedef int socklen_t;
210  #define HAVE_FEATURES_H  #define HAVE_FEATURES_H
211  #include <stdint.h>  #include <stdint.h>
212  #define HAVE_STDINT_H  #define HAVE_STDINT_H
213  #else  #elif !defined __APPLE__
214  /* Largest integral types.  */  /* Largest integral types.  */
215  #if __BIG_ENDIAN__  #if __BIG_ENDIAN__
216  typedef long int                intmax_t;  typedef long                intmax_t;
217  typedef unsigned long int       uintmax_t;  typedef unsigned long       uintmax_t;
218  #else  #else
219  __extension__  __extension__
220  typedef long long int           intmax_t;  typedef long long           intmax_t;
221  __extension__  __extension__
222  typedef unsigned long long int  uintmax_t;  typedef unsigned long long  uintmax_t;
223  #endif  #endif
224  #endif  #endif
225    
# Line 183  typedef int smallint; Line 234  typedef int smallint;
234  typedef unsigned smalluint;  typedef unsigned smalluint;
235  #endif  #endif
236    
237    /* 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  /* uclibc does not implement daemon() for no-mmu systems.  /* uclibc does not implement daemon() for no-mmu systems.
258   * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.   * 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   * For earlier versions there is no reliable way to check if we are building
260   * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU"   * for a mmu-less system.
  * on his own.  
261   */   */
262  #if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \  #if ENABLE_NOMMU || \
263      __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__      (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \
264  #define BB_NOMMU      __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  #endif  #endif
273    
274  /* Platforms that haven't got dprintf need to implement fdprintf() in  /* Platforms that haven't got dprintf need to implement fdprintf() in
# Line 205  typedef unsigned smalluint; Line 282  typedef unsigned smalluint;
282  #endif  #endif
283    
284  #if defined(__dietlibc__)  #if defined(__dietlibc__)
285  static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) {  static ALWAYS_INLINE char* strchrnul(const char *s, char c)
286    {
287   while (*s && *s != c) ++s;   while (*s && *s != c) ++s;
288   return (char*)s;   return (char*)s;
289  }  }
290  #endif  #endif
291    
292  /* Don't use lchown with glibc older than 2.1.x ... uC-libc lacks it */  /* Don't use lchown with glibc older than 2.1.x ... uClibc lacks it */
293  #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \  #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \
294      defined __UC_LIBC__      defined __UC_LIBC__
295  # define lchown chown  # define lchown chown
296  #endif  #endif
297    
 /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */  
 /* FIXME: fix tar.c! */  
 #ifndef FNM_LEADING_DIR  
 #define FNM_LEADING_DIR 0  
 #endif  
   
298  #if (defined __digital__ && defined __unix__)  #if (defined __digital__ && defined __unix__)
299  #include <standards.h>  #include <standards.h>
300  #define HAVE_STANDARDS_H  #define HAVE_STANDARDS_H
# Line 230  static ATTRIBUTE_ALWAYS_INLINE char* str Line 302  static ATTRIBUTE_ALWAYS_INLINE char* str
302  #define HAVE_INTTYPES_H  #define HAVE_INTTYPES_H
303  #define PRIu32 "u"  #define PRIu32 "u"
304    
305  /* use legacy setpgrp(pidt_,pid_t) for now.  move to platform.c */  /* 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)  #define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0)
307    
308  #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET  #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
309  #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)  #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
# Line 247  static ATTRIBUTE_ALWAYS_INLINE char* str Line 319  static ATTRIBUTE_ALWAYS_INLINE char* str
319  #endif  #endif
320    
321  #else  #else
322  #define bb_setpgrp setpgrp()  #define bb_setpgrp() setpgrp()
323  #endif  #endif
324    
325  #if defined(__linux__)  #if defined(__linux__)
326  #include <sys/mount.h>  #include <sys/mount.h>
327  // Make sure we have all the new mount flags we actually try to use.  /* Make sure we have all the new mount flags we actually try to use. */
328  #ifndef MS_BIND  #ifndef MS_BIND
329  #define MS_BIND        (1<<12)  #define MS_BIND        (1<<12)
330  #endif  #endif
# Line 266  static ATTRIBUTE_ALWAYS_INLINE char* str Line 338  static ATTRIBUTE_ALWAYS_INLINE char* str
338  #define MS_SILENT      (1<<15)  #define MS_SILENT      (1<<15)
339  #endif  #endif
340    
341  // The shared subtree stuff, which went in around 2.6.15  /* The shared subtree stuff, which went in around 2.6.15. */
342  #ifndef MS_UNBINDABLE  #ifndef MS_UNBINDABLE
343  #define MS_UNBINDABLE  (1<<17)  #define MS_UNBINDABLE  (1<<17)
344  #endif  #endif
# Line 279  static ATTRIBUTE_ALWAYS_INLINE char* str Line 351  static ATTRIBUTE_ALWAYS_INLINE char* str
351  #ifndef MS_SHARED  #ifndef MS_SHARED
352  #define MS_SHARED      (1<<20)  #define MS_SHARED      (1<<20)
353  #endif  #endif
354    #ifndef MS_RELATIME
355    #define MS_RELATIME   (1 << 21)
356    #endif
357    
358  #if !defined(BLKSSZGET)  #if !defined(BLKSSZGET)
359  #define BLKSSZGET _IO(0x12, 104)  #define BLKSSZGET _IO(0x12, 104)

Legend:
Removed from v.815  
changed lines
  Added in v.816