Annotation of /trunk/mkinitrd-magellan/busybox/include/platform.h
Parent Directory | Revision Log
Revision 532 -
(hide annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 7709 byte(s)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 7709 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | niro | 532 | /* vi: set sw=4 ts=4: */ |
2 | /* | ||
3 | Copyright 2006, Bernhard Fischer | ||
4 | |||
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 | #if !__GNUC_PREREQ (2,92) | ||
21 | # 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 | #if !__GNUC_PREREQ (2,7) | ||
31 | # 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 | # if __GNUC_PREREQ (2,7) | ||
41 | # define inline __inline__ | ||
42 | # else | ||
43 | # define inline | ||
44 | # endif | ||
45 | #endif | ||
46 | |||
47 | #ifndef __const | ||
48 | # define __const const | ||
49 | #endif | ||
50 | |||
51 | # define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) | ||
52 | # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) | ||
53 | # define ATTRIBUTE_PACKED __attribute__ ((__packed__)) | ||
54 | # define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) | ||
55 | # if __GNUC_PREREQ (3,0) | ||
56 | # define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) inline | ||
57 | # else | ||
58 | # define ATTRIBUTE_ALWAYS_INLINE inline | ||
59 | # endif | ||
60 | |||
61 | /* -fwhole-program makes all symbols local. The attribute externally_visible | ||
62 | forces a symbol global. */ | ||
63 | # if __GNUC_PREREQ (4,1) | ||
64 | # define ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((__externally_visible__)) | ||
65 | # else | ||
66 | # define ATTRIBUTE_EXTERNALLY_VISIBLE | ||
67 | # endif /* GNUC >= 4.1 */ | ||
68 | |||
69 | /* We use __extension__ in some places to suppress -pedantic warnings | ||
70 | about GCC extensions. This feature didn't work properly before | ||
71 | gcc 2.8. */ | ||
72 | #if !__GNUC_PREREQ (2,8) | ||
73 | # ifndef __extension__ | ||
74 | # define __extension__ | ||
75 | # endif | ||
76 | #endif | ||
77 | |||
78 | /* gcc-2.95 had no va_copy but only __va_copy. */ | ||
79 | #if !__GNUC_PREREQ (3,0) | ||
80 | # include <stdarg.h> | ||
81 | # if !defined va_copy && defined __va_copy | ||
82 | # define va_copy(d,s) __va_copy((d),(s)) | ||
83 | # endif | ||
84 | #endif | ||
85 | |||
86 | /* ---- Endian Detection ------------------------------------ */ | ||
87 | |||
88 | #if (defined __digital__ && defined __unix__) | ||
89 | # include <sex.h> | ||
90 | # define __BIG_ENDIAN__ (BYTE_ORDER == BIG_ENDIAN) | ||
91 | # define __BYTE_ORDER BYTE_ORDER | ||
92 | #elif !defined __APPLE__ | ||
93 | # include <byteswap.h> | ||
94 | # include <endian.h> | ||
95 | #endif | ||
96 | |||
97 | #ifdef __BIG_ENDIAN__ | ||
98 | # define BB_BIG_ENDIAN 1 | ||
99 | # define BB_LITTLE_ENDIAN 0 | ||
100 | #elif __BYTE_ORDER == __BIG_ENDIAN | ||
101 | # define BB_BIG_ENDIAN 1 | ||
102 | # define BB_LITTLE_ENDIAN 0 | ||
103 | #else | ||
104 | # define BB_BIG_ENDIAN 0 | ||
105 | # define BB_LITTLE_ENDIAN 1 | ||
106 | #endif | ||
107 | |||
108 | #if BB_BIG_ENDIAN | ||
109 | #define SWAP_BE16(x) (x) | ||
110 | #define SWAP_BE32(x) (x) | ||
111 | #define SWAP_BE64(x) (x) | ||
112 | #define SWAP_LE16(x) bswap_16(x) | ||
113 | #define SWAP_LE32(x) bswap_32(x) | ||
114 | #define SWAP_LE64(x) bswap_64(x) | ||
115 | #else | ||
116 | #define SWAP_BE16(x) bswap_16(x) | ||
117 | #define SWAP_BE32(x) bswap_32(x) | ||
118 | #define SWAP_BE64(x) bswap_64(x) | ||
119 | #define SWAP_LE16(x) (x) | ||
120 | #define SWAP_LE32(x) (x) | ||
121 | #define SWAP_LE64(x) (x) | ||
122 | #endif | ||
123 | |||
124 | /* ---- Networking ------------------------------------------ */ | ||
125 | #ifndef __APPLE__ | ||
126 | # include <arpa/inet.h> | ||
127 | #else | ||
128 | # include <netinet/in.h> | ||
129 | #endif | ||
130 | |||
131 | #ifndef __socklen_t_defined | ||
132 | typedef int socklen_t; | ||
133 | #endif | ||
134 | |||
135 | /* ---- Compiler dependent settings ------------------------- */ | ||
136 | #if (defined __digital__ && defined __unix__) | ||
137 | # undef HAVE_MNTENT_H | ||
138 | #else | ||
139 | # define HAVE_MNTENT_H 1 | ||
140 | #endif /* ___digital__ && __unix__ */ | ||
141 | |||
142 | /*----- Kernel versioning ------------------------------------*/ | ||
143 | #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) | ||
144 | |||
145 | /* ---- miscellaneous --------------------------------------- */ | ||
146 | |||
147 | #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ | ||
148 | !defined(__dietlibc__) && \ | ||
149 | !defined(_NEWLIB_VERSION) && \ | ||
150 | !(defined __digital__ && defined __unix__) | ||
151 | # error "Sorry, this libc version is not supported :(" | ||
152 | #endif | ||
153 | |||
154 | // Don't perpetuate e2fsck crap into the headers. Clean up e2fsck instead. | ||
155 | |||
156 | #if defined __GLIBC__ || defined __UCLIBC__ \ | ||
157 | || defined __dietlibc__ || defined _NEWLIB_VERSION | ||
158 | #include <features.h> | ||
159 | #define HAVE_FEATURES_H | ||
160 | #include <stdint.h> | ||
161 | #define HAVE_STDINT_H | ||
162 | #else | ||
163 | /* Largest integral types. */ | ||
164 | #if __BIG_ENDIAN__ | ||
165 | typedef long int intmax_t; | ||
166 | typedef unsigned long int uintmax_t; | ||
167 | #else | ||
168 | __extension__ | ||
169 | typedef long long int intmax_t; | ||
170 | __extension__ | ||
171 | typedef unsigned long long int uintmax_t; | ||
172 | #endif | ||
173 | #endif | ||
174 | |||
175 | /* Size-saving "small" ints (arch-dependent) */ | ||
176 | #if defined(i386) || defined(__x86_64__) || defined(__mips__) || defined(__cris__) | ||
177 | /* add other arches which benefit from this... */ | ||
178 | typedef signed char smallint; | ||
179 | typedef unsigned char smalluint; | ||
180 | #else | ||
181 | /* for arches where byte accesses generate larger code: */ | ||
182 | typedef int smallint; | ||
183 | typedef unsigned smalluint; | ||
184 | #endif | ||
185 | |||
186 | /* uclibc does not implement daemon() for no-mmu systems. | ||
187 | * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably. | ||
188 | * For earlier versions there is no reliable way to check if we are building | ||
189 | * for a mmu-less system; the user should pass EXTRA_CFLAGS="-DBB_NOMMU" | ||
190 | * on his own. | ||
191 | */ | ||
192 | #if defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ | ||
193 | __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__ | ||
194 | #define BB_NOMMU | ||
195 | #endif | ||
196 | |||
197 | /* Platforms that haven't got dprintf need to implement fdprintf() in | ||
198 | * libbb. This would require a platform.c. It's not going to be cleaned | ||
199 | * out of the tree, so stop saying it should be. */ | ||
200 | #if !defined(__dietlibc__) | ||
201 | /* Needed for: glibc */ | ||
202 | /* Not needed for: dietlibc */ | ||
203 | /* Others: ?? (add as needed) */ | ||
204 | #define fdprintf dprintf | ||
205 | #endif | ||
206 | |||
207 | #if defined(__dietlibc__) | ||
208 | static ATTRIBUTE_ALWAYS_INLINE char* strchrnul(const char *s, char c) { | ||
209 | while (*s && *s != c) ++s; | ||
210 | return (char*)s; | ||
211 | } | ||
212 | #endif | ||
213 | |||
214 | /* Don't use lchown with glibc older than 2.1.x ... uC-libc lacks it */ | ||
215 | #if (defined __GLIBC__ && __GLIBC__ <= 2 && __GLIBC_MINOR__ < 1) || \ | ||
216 | defined __UC_LIBC__ | ||
217 | # define lchown chown | ||
218 | #endif | ||
219 | |||
220 | /* THIS SHOULD BE CLEANED OUT OF THE TREE ENTIRELY */ | ||
221 | /* FIXME: fix tar.c! */ | ||
222 | #ifndef FNM_LEADING_DIR | ||
223 | #define FNM_LEADING_DIR 0 | ||
224 | #endif | ||
225 | |||
226 | #if (defined __digital__ && defined __unix__) | ||
227 | #include <standards.h> | ||
228 | #define HAVE_STANDARDS_H | ||
229 | #include <inttypes.h> | ||
230 | #define HAVE_INTTYPES_H | ||
231 | #define PRIu32 "u" | ||
232 | |||
233 | /* use legacy setpgrp(pidt_,pid_t) for now. move to platform.c */ | ||
234 | #define bb_setpgrp do { pid_t __me = getpid(); setpgrp(__me,__me); } while (0) | ||
235 | |||
236 | #if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET | ||
237 | #define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) | ||
238 | #endif | ||
239 | #if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY | ||
240 | #define ADJ_FREQUENCY MOD_FREQUENCY | ||
241 | #endif | ||
242 | #if !defined ADJ_TIMECONST && defined MOD_TIMECONST | ||
243 | #define ADJ_TIMECONST MOD_TIMECONST | ||
244 | #endif | ||
245 | #if !defined ADJ_TICK && defined MOD_CLKB | ||
246 | #define ADJ_TICK MOD_CLKB | ||
247 | #endif | ||
248 | |||
249 | #else | ||
250 | #define bb_setpgrp setpgrp() | ||
251 | #endif | ||
252 | |||
253 | #if defined(__linux__) | ||
254 | #include <sys/mount.h> | ||
255 | // Make sure we have all the new mount flags we actually try to use. | ||
256 | #ifndef MS_BIND | ||
257 | #define MS_BIND (1<<12) | ||
258 | #endif | ||
259 | #ifndef MS_MOVE | ||
260 | #define MS_MOVE (1<<13) | ||
261 | #endif | ||
262 | #ifndef MS_RECURSIVE | ||
263 | #define MS_RECURSIVE (1<<14) | ||
264 | #endif | ||
265 | #ifndef MS_SILENT | ||
266 | #define MS_SILENT (1<<15) | ||
267 | #endif | ||
268 | |||
269 | // The shared subtree stuff, which went in around 2.6.15 | ||
270 | #ifndef MS_UNBINDABLE | ||
271 | #define MS_UNBINDABLE (1<<17) | ||
272 | #endif | ||
273 | #ifndef MS_PRIVATE | ||
274 | #define MS_PRIVATE (1<<18) | ||
275 | #endif | ||
276 | #ifndef MS_SLAVE | ||
277 | #define MS_SLAVE (1<<19) | ||
278 | #endif | ||
279 | #ifndef MS_SHARED | ||
280 | #define MS_SHARED (1<<20) | ||
281 | #endif | ||
282 | |||
283 | |||
284 | #if !defined(BLKSSZGET) | ||
285 | #define BLKSSZGET _IO(0x12, 104) | ||
286 | #endif | ||
287 | #if !defined(BLKGETSIZE64) | ||
288 | #define BLKGETSIZE64 _IOR(0x12,114,size_t) | ||
289 | #endif | ||
290 | #endif | ||
291 | |||
292 | #endif /* platform.h */ |