xref: /minix3/minix/lib/libmagicrt/include/magic_def.h (revision b2ed49a5d83e311ee0fa9e5ff613639b1bf77aaf)
1*b2ed49a5SDavid van Moolenbroek #ifndef _MAGIC_DEF_H
2*b2ed49a5SDavid van Moolenbroek #define _MAGIC_DEF_H
3*b2ed49a5SDavid van Moolenbroek 
4*b2ed49a5SDavid van Moolenbroek #if defined(_MINIX) || defined(_MINIX_SYSTEM)
5*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
6*b2ed49a5SDavid van Moolenbroek #define __MINIX 1
7*b2ed49a5SDavid van Moolenbroek #endif
8*b2ed49a5SDavid van Moolenbroek #endif
9*b2ed49a5SDavid van Moolenbroek 
10*b2ed49a5SDavid van Moolenbroek #include <limits.h>
11*b2ed49a5SDavid van Moolenbroek 
12*b2ed49a5SDavid van Moolenbroek /* Type macros. */
13*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
14*b2ed49a5SDavid van Moolenbroek #define MAGIC_LONG_LONG_SUPPORTED     1
15*b2ed49a5SDavid van Moolenbroek #define MAGIC_LONG_DOUBLE_SUPPORTED   0
16*b2ed49a5SDavid van Moolenbroek #else
17*b2ed49a5SDavid van Moolenbroek #ifdef LLONG_MAX
18*b2ed49a5SDavid van Moolenbroek #define MAGIC_LONG_LONG_SUPPORTED     1
19*b2ed49a5SDavid van Moolenbroek #endif
20*b2ed49a5SDavid van Moolenbroek #ifdef __LDBL_MAX__
21*b2ed49a5SDavid van Moolenbroek #define MAGIC_LONG_DOUBLE_SUPPORTED   1
22*b2ed49a5SDavid van Moolenbroek #endif
23*b2ed49a5SDavid van Moolenbroek #endif
24*b2ed49a5SDavid van Moolenbroek 
25*b2ed49a5SDavid van Moolenbroek /* Modifier macros. */
26*b2ed49a5SDavid van Moolenbroek #define EXTERN  extern
27*b2ed49a5SDavid van Moolenbroek #define PRIVATE static
28*b2ed49a5SDavid van Moolenbroek #ifdef __SHARED__
29*b2ed49a5SDavid van Moolenbroek #define PUBLIC EXTERN
30*b2ed49a5SDavid van Moolenbroek #else
31*b2ed49a5SDavid van Moolenbroek #define PUBLIC
32*b2ed49a5SDavid van Moolenbroek #endif
33*b2ed49a5SDavid van Moolenbroek 
34*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
35*b2ed49a5SDavid van Moolenbroek #define INLINE __inline__
36*b2ed49a5SDavid van Moolenbroek #define THREAD_LOCAL
37*b2ed49a5SDavid van Moolenbroek #undef UNUSED
38*b2ed49a5SDavid van Moolenbroek #define FUNCTION_BLOCK(B) B
39*b2ed49a5SDavid van Moolenbroek #else
40*b2ed49a5SDavid van Moolenbroek #define INLINE inline
41*b2ed49a5SDavid van Moolenbroek #define THREAD_LOCAL __thread
42*b2ed49a5SDavid van Moolenbroek #ifdef __cplusplus
43*b2ed49a5SDavid van Moolenbroek #define FUNCTION_BLOCK(B) extern "C"{ B }
44*b2ed49a5SDavid van Moolenbroek #else
45*b2ed49a5SDavid van Moolenbroek #define FUNCTION_BLOCK(B) B
46*b2ed49a5SDavid van Moolenbroek #endif
47*b2ed49a5SDavid van Moolenbroek #endif
48*b2ed49a5SDavid van Moolenbroek 
49*b2ed49a5SDavid van Moolenbroek #define UNUSED(VAR) VAR __attribute__((unused))
50*b2ed49a5SDavid van Moolenbroek #define USED __attribute__((used))
51*b2ed49a5SDavid van Moolenbroek #define VOLATILE volatile
52*b2ed49a5SDavid van Moolenbroek 
53*b2ed49a5SDavid van Moolenbroek /* Magic macros. */
54*b2ed49a5SDavid van Moolenbroek #define MAGIC_VAR USED
55*b2ed49a5SDavid van Moolenbroek #define MAGIC_FUNC PUBLIC USED __attribute__((noinline))
56*b2ed49a5SDavid van Moolenbroek #define MAGIC_FUNC_BODY() __asm__("")
57*b2ed49a5SDavid van Moolenbroek #define MAGIC_HOOK PUBLIC USED __attribute__((always_inline)) inline
58*b2ed49a5SDavid van Moolenbroek #define MAGIC_MACRO_FUNC static __attribute__((always_inline))
59*b2ed49a5SDavid van Moolenbroek 
60*b2ed49a5SDavid van Moolenbroek #define TRUE  1
61*b2ed49a5SDavid van Moolenbroek #define FALSE 0
62*b2ed49a5SDavid van Moolenbroek 
63*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
64*b2ed49a5SDavid van Moolenbroek #define SYS_PAGESIZE 4096
65*b2ed49a5SDavid van Moolenbroek #else
66*b2ed49a5SDavid van Moolenbroek #define SYS_PAGESIZE sysconf(_SC_PAGESIZE)
67*b2ed49a5SDavid van Moolenbroek #endif
68*b2ed49a5SDavid van Moolenbroek #define MAGIC_ROUND_DOWN(val, round)        ((val) & ~((round) - 1))
69*b2ed49a5SDavid van Moolenbroek #define MAGIC_ROUND_UP(val, round)           (MAGIC_ROUND_DOWN(val, round) ==  \
70*b2ed49a5SDavid van Moolenbroek     (val) ? (val) : MAGIC_ROUND_DOWN((val) + (round), (round)))
71*b2ed49a5SDavid van Moolenbroek #define MAGIC_ROUND_DOWN_TO_PAGESIZE(addr)  MAGIC_ROUND_DOWN(addr, SYS_PAGESIZE)
72*b2ed49a5SDavid van Moolenbroek #define MAGIC_ROUND_UP_TO_PAGESIZE(addr)    MAGIC_ROUND_UP(addr, SYS_PAGESIZE)
73*b2ed49a5SDavid van Moolenbroek 
74*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
75*b2ed49a5SDavid van Moolenbroek #define _MAGIC_CAS(P, O, N) (*(P) == (O) ? *(P)=(N) : (N)+1)
76*b2ed49a5SDavid van Moolenbroek #define MAGIC_CAS(P, O, N)  (_MAGIC_CAS(P, O, N) == (N) ? (O) : *(P))
77*b2ed49a5SDavid van Moolenbroek #define _MAGIC_PCAS(P, O, N) (*(P) == (O) ? *(P)=(N) : (void *)((intptr_t)(N)+1))
78*b2ed49a5SDavid van Moolenbroek #define MAGIC_PCAS(P, O, N)  (_MAGIC_PCAS(P, O, N) == (N) ? (O) : *(P))
79*b2ed49a5SDavid van Moolenbroek #define MAGIC_FAA(P, V) (((*P)+=V)-V)
80*b2ed49a5SDavid van Moolenbroek #define MAGIC_FAS(P, V) (((*P)-=V)+V)
81*b2ed49a5SDavid van Moolenbroek #else
82*b2ed49a5SDavid van Moolenbroek #define MAGIC_CAS(P, O, N) __sync_val_compare_and_swap((P), (O), (N))
83*b2ed49a5SDavid van Moolenbroek #define MAGIC_PCAS(P, O, N) MAGIC_CAS(P, O, N)
84*b2ed49a5SDavid van Moolenbroek #define MAGIC_FAA(P, V) __sync_fetch_and_add(P, V)
85*b2ed49a5SDavid van Moolenbroek #define MAGIC_FAS(P, V) __sync_fetch_and_sub(P, V)
86*b2ed49a5SDavid van Moolenbroek #endif
87*b2ed49a5SDavid van Moolenbroek 
88*b2ed49a5SDavid van Moolenbroek /* Magic arch-specific macros. */
89*b2ed49a5SDavid van Moolenbroek #define MAGIC_FRAMEADDR_TO_RETADDR_PTR(F) (((char*)(F))+4)
90*b2ed49a5SDavid van Moolenbroek 
91*b2ed49a5SDavid van Moolenbroek /* Magic ranges. */
92*b2ed49a5SDavid van Moolenbroek #define MAGIC_LINKER_VAR_NAMES   "end", "etext", "edata", NULL
93*b2ed49a5SDavid van Moolenbroek 
94*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
95*b2ed49a5SDavid van Moolenbroek #define MAGIC_TEXT_START         ((void*)(0x1000))
96*b2ed49a5SDavid van Moolenbroek #define MAGIC_STACK_GAP          (4*1024)
97*b2ed49a5SDavid van Moolenbroek #else
98*b2ed49a5SDavid van Moolenbroek #define MAGIC_TEXT_START         ((void*)(0x08048000))
99*b2ed49a5SDavid van Moolenbroek #define MAGIC_STACK_GAP          (4*1024*1024)
100*b2ed49a5SDavid van Moolenbroek #endif
101*b2ed49a5SDavid van Moolenbroek 
102*b2ed49a5SDavid van Moolenbroek #define MAGIC_TEXT_END           0    /* 0 if right before data. */
103*b2ed49a5SDavid van Moolenbroek #define MAGIC_HEAP_START         0    /* 0 if right after data.  */
104*b2ed49a5SDavid van Moolenbroek #define MAGIC_HEAP_GAP           (4*1024)
105*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_ROUND_DATA   1
106*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_ROUND_TEXT   1
107*b2ed49a5SDavid van Moolenbroek #define MAGIC_RANGE_ROUND_STACK  1
108*b2ed49a5SDavid van Moolenbroek 
109*b2ed49a5SDavid van Moolenbroek /* Magic IDs */
110*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_NONE 0
111*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_FORCE_LONG 1
112*b2ed49a5SDavid van Moolenbroek #if defined(__MINIX) || MAGIC_ID_FORCE_LONG
113*b2ed49a5SDavid van Moolenbroek typedef unsigned long _magic_id_t;
114*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_MAX    ULONG_MAX
115*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_FORMAT "%lu"
116*b2ed49a5SDavid van Moolenbroek #else
117*b2ed49a5SDavid van Moolenbroek typedef unsigned long long _magic_id_t;
118*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_MAX ULLONG_MAX
119*b2ed49a5SDavid van Moolenbroek #define MAGIC_ID_FORMAT "%llu"
120*b2ed49a5SDavid van Moolenbroek #endif
121*b2ed49a5SDavid van Moolenbroek 
122*b2ed49a5SDavid van Moolenbroek /* Magic error codes. */
123*b2ed49a5SDavid van Moolenbroek #define MAGIC_ENOENT      (-100)
124*b2ed49a5SDavid van Moolenbroek #define MAGIC_EBADENT     (-101)
125*b2ed49a5SDavid van Moolenbroek #define MAGIC_EBADMSTATE  (-102)
126*b2ed49a5SDavid van Moolenbroek #define MAGIC_EINVAL      (-103)
127*b2ed49a5SDavid van Moolenbroek #define MAGIC_EGENERIC    (-104)
128*b2ed49a5SDavid van Moolenbroek #define MAGIC_EBADWALK    (-105)
129*b2ed49a5SDavid van Moolenbroek #define MAGIC_ERANGE      (-106)
130*b2ed49a5SDavid van Moolenbroek #define MAGIC_ESIGN       (-107)
131*b2ed49a5SDavid van Moolenbroek #define MAGIC_ENOMEM      (-108)
132*b2ed49a5SDavid van Moolenbroek #define MAGIC_ENOPTR      ((void*)-1)
133*b2ed49a5SDavid van Moolenbroek 
134*b2ed49a5SDavid van Moolenbroek /*
135*b2ed49a5SDavid van Moolenbroek  * Basic return type definitions. Not really needed, but they make
136*b2ed49a5SDavid van Moolenbroek  * the code easier to read.
137*b2ed49a5SDavid van Moolenbroek  */
138*b2ed49a5SDavid van Moolenbroek #ifndef OK
139*b2ed49a5SDavid van Moolenbroek #define OK                                  0
140*b2ed49a5SDavid van Moolenbroek #endif
141*b2ed49a5SDavid van Moolenbroek #ifndef EGENERIC
142*b2ed49a5SDavid van Moolenbroek #define EGENERIC                            -1
143*b2ed49a5SDavid van Moolenbroek #endif
144*b2ed49a5SDavid van Moolenbroek 
145*b2ed49a5SDavid van Moolenbroek /* Magic printf. */
146*b2ed49a5SDavid van Moolenbroek #ifdef __MINIX
147*b2ed49a5SDavid van Moolenbroek #define MAGIC_PRINTF_DEFAULT printf
148*b2ed49a5SDavid van Moolenbroek #else
149*b2ed49a5SDavid van Moolenbroek #define MAGIC_PRINTF_DEFAULT magic_err_printf
150*b2ed49a5SDavid van Moolenbroek #endif
151*b2ed49a5SDavid van Moolenbroek 
152*b2ed49a5SDavid van Moolenbroek FUNCTION_BLOCK(
153*b2ed49a5SDavid van Moolenbroek 
154*b2ed49a5SDavid van Moolenbroek typedef int (*printf_ptr_t) (char const *str, ...);
155*b2ed49a5SDavid van Moolenbroek EXTERN printf_ptr_t _magic_printf;
156*b2ed49a5SDavid van Moolenbroek EXTERN void magic_assert_failed(const char *assertion, const char *file,
157*b2ed49a5SDavid van Moolenbroek     const char *function, const int line);
158*b2ed49a5SDavid van Moolenbroek 
159*b2ed49a5SDavid van Moolenbroek )
160*b2ed49a5SDavid van Moolenbroek 
161*b2ed49a5SDavid van Moolenbroek /* assert() override. */
162*b2ed49a5SDavid van Moolenbroek #define ENABLE_ASSERTIONS 1
163*b2ed49a5SDavid van Moolenbroek #ifndef __MINIX
164*b2ed49a5SDavid van Moolenbroek #define CUSTOM_ASSERTIONS 0
165*b2ed49a5SDavid van Moolenbroek #else
166*b2ed49a5SDavid van Moolenbroek #define CUSTOM_ASSERTIONS 1
167*b2ed49a5SDavid van Moolenbroek #endif
168*b2ed49a5SDavid van Moolenbroek 
169*b2ed49a5SDavid van Moolenbroek #include <assert.h>
170*b2ed49a5SDavid van Moolenbroek 
171*b2ed49a5SDavid van Moolenbroek #if CUSTOM_ASSERTIONS
172*b2ed49a5SDavid van Moolenbroek #ifdef assert
173*b2ed49a5SDavid van Moolenbroek #undef assert
174*b2ed49a5SDavid van Moolenbroek #endif
175*b2ed49a5SDavid van Moolenbroek #ifndef __ASSERT_FUNCTION
176*b2ed49a5SDavid van Moolenbroek #define __ASSERT_FUNCTION ""
177*b2ed49a5SDavid van Moolenbroek #endif
178*b2ed49a5SDavid van Moolenbroek 
179*b2ed49a5SDavid van Moolenbroek #if ENABLE_ASSERTIONS
180*b2ed49a5SDavid van Moolenbroek #define assert(X) do{       \
181*b2ed49a5SDavid van Moolenbroek         if(!(X)) {          \
182*b2ed49a5SDavid van Moolenbroek             magic_assert_failed(#X, __FILE__, __ASSERT_FUNCTION, __LINE__); \
183*b2ed49a5SDavid van Moolenbroek         }                   \
184*b2ed49a5SDavid van Moolenbroek     } while(0)
185*b2ed49a5SDavid van Moolenbroek #else
186*b2ed49a5SDavid van Moolenbroek #  define assert(X)
187*b2ed49a5SDavid van Moolenbroek #endif
188*b2ed49a5SDavid van Moolenbroek #endif
189*b2ed49a5SDavid van Moolenbroek 
190*b2ed49a5SDavid van Moolenbroek #endif
191*b2ed49a5SDavid van Moolenbroek 
192