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