X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fplatform.h;h=5d6a181071ebed5df4add7f07253aee515365d91;hb=f6fbd62760252f90ce95212f5cc33f8204159410;hp=57cff2c336e93ed86efe956198e74c29e02a0524;hpb=812870a2e7a00211b0658ebe05e3cee2154c9790;p=oweals%2Fbusybox.git diff --git a/include/platform.h b/include/platform.h index 57cff2c33..5d6a18107 100644 --- a/include/platform.h +++ b/include/platform.h @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - Copyright 2006, Bernhard Fischer + Copyright 2006, Bernhard Reutner-Fischer Licensed under the GPL v2 or later, see the file LICENSE in this tarball. */ @@ -17,7 +17,7 @@ #endif /* __restrict is known in EGCS 1.2 and above. */ -#if !__GNUC_PREREQ (2,92) +#if !__GNUC_PREREQ(2,92) # ifndef __restrict # define __restrict /* Ignore */ # endif @@ -27,7 +27,7 @@ macros freely, and know that they will come into play for the version of gcc in which they are supported. */ -#if !__GNUC_PREREQ (2,7) +#if !__GNUC_PREREQ(2,7) # ifndef __attribute__ # define __attribute__(x) # endif @@ -37,7 +37,7 @@ #if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L /* it's a keyword */ #else -# if __GNUC_PREREQ (2,7) +# if __GNUC_PREREQ(2,7) # define inline __inline__ # else # define inline @@ -48,55 +48,68 @@ # define __const const #endif -# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) -# define ATTRIBUTE_PACKED __attribute__ ((__packed__)) -# define ATTRIBUTE_ALIGNED(m) __attribute__ ((__aligned__(m))) +#define UNUSED_PARAM __attribute__ ((__unused__)) +#define NORETURN __attribute__ ((__noreturn__)) +#define PACKED __attribute__ ((__packed__)) +#define ALIGNED(m) __attribute__ ((__aligned__(m))) /* __NO_INLINE__: some gcc's do not honor inlining! :( */ -# if __GNUC_PREREQ (3,0) && !defined(__NO_INLINE__) -# define ALWAYS_INLINE __attribute__ ((always_inline)) inline +#if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__) +# define ALWAYS_INLINE __attribute__ ((always_inline)) inline /* I've seen a toolchain where I needed __noinline__ instead of noinline */ -# define NOINLINE __attribute__((__noinline__)) -# if !ENABLE_WERROR -# define ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__)) -# define ATTRIBUTE_UNUSED_RESULT __attribute__ ((warn_unused_result)) -# else -# define ATTRIBUTE_DEPRECATED /* n/a */ -# define ATTRIBUTE_UNUSED_RESULT /* n/a */ -# endif +# define NOINLINE __attribute__((__noinline__)) +# if !ENABLE_WERROR +# define DEPRECATED __attribute__ ((__deprecated__)) +# define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result)) # else -# define ALWAYS_INLINE inline /* n/a */ -# define NOINLINE /* n/a */ -# define ATTRIBUTE_DEPRECATED /* n/a */ -# define ATTRIBUTE_UNUSED_RESULT /* n/a */ +# define DEPRECATED /* n/a */ +# define UNUSED_PARAM_RESULT /* n/a */ # endif +#else +# define ALWAYS_INLINE inline /* n/a */ +# define NOINLINE /* n/a */ +# define DEPRECATED /* n/a */ +# define UNUSED_PARAM_RESULT /* n/a */ +#endif /* -fwhole-program makes all symbols local. The attribute externally_visible forces a symbol global. */ -# if __GNUC_PREREQ (4,1) -# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )) +#if __GNUC_PREREQ(4,1) +# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") )) //__attribute__ ((__externally_visible__)) -# else -# define EXTERNALLY_VISIBLE -# endif /* GNUC >= 4.1 */ +#else +# define EXTERNALLY_VISIBLE +#endif /* We use __extension__ in some places to suppress -pedantic warnings about GCC extensions. This feature didn't work properly before gcc 2.8. */ -#if !__GNUC_PREREQ (2,8) +#if !__GNUC_PREREQ(2,8) # ifndef __extension__ # define __extension__ # endif #endif /* gcc-2.95 had no va_copy but only __va_copy. */ -#if !__GNUC_PREREQ (3,0) +#if !__GNUC_PREREQ(3,0) # include # if !defined va_copy && defined __va_copy # define va_copy(d,s) __va_copy((d),(s)) # endif #endif +/* FAST_FUNC is a qualifier which (possibly) makes function call faster + * and/or smaller by using modified ABI. It is usually only needed + * on non-static, busybox internal functions. Recent versions of gcc + * optimize statics automatically. FAST_FUNC on static is required + * only if you need to match a function pointer's type */ +#if __GNUC_PREREQ(3,0) && defined(i386) /* || defined(__x86_64__)? */ +/* stdcall makes callee to pop arguments from stack, not caller */ +# define FAST_FUNC __attribute__((regparm(3),stdcall)) +/* #elif ... - add your favorite arch today! */ +#else +# define FAST_FUNC +#endif + /* ---- Endian Detection ------------------------------------ */ #if (defined __digital__ && defined __unix__) @@ -119,6 +132,7 @@ # define BB_LITTLE_ENDIAN 1 #endif +/* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */ #if BB_BIG_ENDIAN #define SWAP_BE16(x) (x) #define SWAP_BE32(x) (x) @@ -135,7 +149,25 @@ #define SWAP_LE64(x) (x) #endif +/* ---- Unaligned access ------------------------------------ */ + +/* NB: unaligned parameter should be a pointer, aligned one - + * a lvalue. This makes it more likely to not swap them by mistake + */ +#if defined(i386) || defined(__x86_64__) +#define move_from_unaligned16(v, u16p) ((v) = *(uint16_t*)(u16p)) +#define move_from_unaligned32(v, u32p) ((v) = *(uint32_t*)(u32p)) +#define move_to_unaligned32(u32p, v) (*(uint32_t*)(u32p) = (v)) +/* #elif ... - add your favorite arch today! */ +#else +/* performs reasonably well (gcc usually inlines memcpy here) */ +#define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2)) +#define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4)) +#define move_to_unaligned32(u32p, v) (memcpy((u32p), &(v), 4)) +#endif + /* ---- Networking ------------------------------------------ */ + #ifndef __APPLE__ # include # ifndef __socklen_t_defined @@ -146,6 +178,7 @@ typedef int socklen_t; #endif /* ---- Compiler dependent settings ------------------------- */ + #if (defined __digital__ && defined __unix__) || defined __APPLE__ # undef HAVE_MNTENT_H # undef HAVE_SYS_STATFS_H @@ -158,14 +191,15 @@ typedef int socklen_t; * until userspace is widely fixed. */ #if (defined __INTEL_COMPILER && !defined __GNUC__) || \ (defined __GNUC__ && defined __STRICT_ANSI__) -__extension__ typedef __signed__ long long __s64; +__extension__ typedef long long __s64; __extension__ typedef unsigned long long __u64; #endif /*----- Kernel versioning ------------------------------------*/ + #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) -/* ---- miscellaneous --------------------------------------- */ +/* ---- Miscellaneous --------------------------------------- */ #if defined(__GNU_LIBRARY__) && __GNU_LIBRARY__ < 5 && \ !defined(__dietlibc__) && \ @@ -235,12 +269,10 @@ typedef unsigned smalluint; (defined __UCLIBC__ && __UCLIBC_MAJOR__ >= 0 && __UCLIBC_MINOR__ >= 9 && \ __UCLIBC_SUBLEVEL__ > 28 && !defined __ARCH_USE_MMU__) #define BB_MMU 0 -#define BB_NOMMU 1 #define USE_FOR_NOMMU(...) __VA_ARGS__ #define USE_FOR_MMU(...) #else #define BB_MMU 1 -/* BB_NOMMU is not defined in this case! */ #define USE_FOR_NOMMU(...) #define USE_FOR_MMU(...) __VA_ARGS__ #endif @@ -270,30 +302,32 @@ static ALWAYS_INLINE char* strchrnul(const char *s, char c) #endif #if (defined __digital__ && defined __unix__) -#include -#define HAVE_STANDARDS_H -#include -#define HAVE_INTTYPES_H -#define PRIu32 "u" +# include +# define HAVE_STANDARDS_H +# include +# define HAVE_INTTYPES_H +# define PRIu32 "u" /* use legacy setpgrp(pid_t,pid_t) for now. move to platform.c */ -#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) -#if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET -#define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) -#endif -#if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY -#define ADJ_FREQUENCY MOD_FREQUENCY -#endif -#if !defined ADJ_TIMECONST && defined MOD_TIMECONST -#define ADJ_TIMECONST MOD_TIMECONST -#endif -#if !defined ADJ_TICK && defined MOD_CLKB -#define ADJ_TICK MOD_CLKB -#endif +# if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET +# define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET) +# endif +# if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY +# define ADJ_FREQUENCY MOD_FREQUENCY +# endif +# if !defined ADJ_TIMECONST && defined MOD_TIMECONST +# define ADJ_TIMECONST MOD_TIMECONST +# endif +# if !defined ADJ_TICK && defined MOD_CLKB +# define ADJ_TICK MOD_CLKB +# endif + +#else /* !__digital__ */ + +# define bb_setpgrp() setpgrp() -#else -#define bb_setpgrp() setpgrp() #endif #if defined(__linux__) @@ -325,7 +359,9 @@ static ALWAYS_INLINE char* strchrnul(const char *s, char c) #ifndef MS_SHARED #define MS_SHARED (1<<20) #endif - +#ifndef MS_RELATIME +#define MS_RELATIME (1 << 21) +#endif #if !defined(BLKSSZGET) #define BLKSSZGET _IO(0x12, 104)