Changeset 3525 for trunk/kLdr/kLdrBase.h
- Timestamp:
- Aug 20, 2007, 12:14:55 AM (18 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdrBase.h
r3388 r3525 2 2 /** @file 3 3 * 4 * kLdr - The Dynamic Loader, Helper Functions.4 * kLdr - The Dynamic Loader, Base Definitions and Typedefs. 5 5 * 6 * Copyright (c) 2006 knut st. osmundsen <bird@anduin.net>6 * Copyright (c) 2006-2007 knut st. osmundsen <bird@anduin.net> 7 7 * 8 8 * … … 25 25 */ 26 26 27 #ifndef ___kLdrBase_h___ 28 #define ___kLdrBase_h___ 27 29 28 #ifndef __kLdrHlp_h__29 #define __kLdrHlp_h__30 30 31 /** @defgroup grp_kLdrHlp kLdrHlp - Helper Functions 32 * @internal 31 /** @defgroup grp_kLdrBase kLdrBase - Base Definitions And Typedefs 33 32 * @{ */ 33 34 /* 35 * kLdr depend on size_t, [u]intNN_t, [u]intptr_t and some related constants. 36 * If KLDR_ALREADY_INCLUDED_STD_TYPES is defined, these has already been defined. 37 */ 38 #ifndef KLDR_ALREADY_INCLUDED_STD_TYPES 39 # include <sys/types.h> 40 # include <stddef.h> 41 # ifdef _MSC_VER 42 typedef signed char int8_t; 43 typedef unsigned char uint8_t; 44 typedef signed short int16_t; 45 typedef unsigned short uint16_t; 46 typedef signed int int32_t; 47 typedef unsigned int uint32_t; 48 typedef signed __int64 int64_t; 49 typedef unsigned __int64 uint64_t; 50 typedef int64_t intmax_t; 51 typedef uint64_t uintmax_t; 52 # define UINT8_C(c) (c) 53 # define UINT16_C(c) (c) 54 # define UINT32_C(c) (c ## U) 55 # define UINT64_C(c) (c ## ULL) 56 # define INT8_C(c) (c) 57 # define INT16_C(c) (c) 58 # define INT32_C(c) (c) 59 # define INT64_C(c) (c ## LL) 60 # define INT8_MIN (INT8_C(-0x7f) - 1) 61 # define INT16_MIN (INT16_C(-0x7fff) - 1) 62 # define INT32_MIN (INT32_C(-0x7fffffff) - 1) 63 # define INT64_MIN (INT64_C(-0x7fffffffffffffff) - 1) 64 # define INT8_MAX INT8_C(0x7f) 65 # define INT16_MAX INT16_C(0x7fff) 66 # define INT32_MAX INT32_C(0x7fffffff) 67 # define INT64_MAX INT64_C(0x7fffffffffffffff) 68 # define UINT8_MAX UINT8_C(0xff) 69 # define UINT16_MAX UINT16_C(0xffff) 70 # define UINT32_MAX UINT32_C(0xffffffff) 71 # define UINT64_MAX UINT64_C(0xffffffffffffffff) 72 # else 73 # include <stdint.h> 74 # endif 75 #endif /* !KLDR_ALREADY_INCLUDED_STD_TYPES */ 76 34 77 35 78 /** Get the minimum of two values. */ … … 49 92 50 93 94 /** @def KLDR_LITTLE_ENDIAN 95 * The kLdr build is for a little endian target. */ 96 /** @def KLDR_BIG_ENDIAN 97 * The kLdr build is for a big endian target. */ 98 #if !defined(KLDR_LITTLE_ENDIAN) && !defined(KLDR_BIG_ENDIAN) 99 # define KLDR_LITTLE_ENDIAN 100 #endif 101 #ifdef __DOXYGEN__ 102 # define KLDR_BIG_ENDIAN 103 #endif 104 105 51 106 /** @name Endian Conversion 52 107 * @{ */ 53 108 54 /** @def KLDR HLP_E2E_U16109 /** @def KLDR_E2E_U16 55 110 * Convert the endian of an unsigned 16-bit value. */ 56 # define KLDR HLP_E2E_U16(u16)( (uint16_t) (((u16) >> 8) | ((u16) << 8)) )57 /** @def KLDR HLP_E2E_U32111 # define KLDR_E2E_U16(u16) ( (uint16_t) (((u16) >> 8) | ((u16) << 8)) ) 112 /** @def KLDR_E2E_U32 58 113 * Convert the endian of an unsigned 32-bit value. */ 59 # define KLDR HLP_E2E_U32(u32)( ( ((u32) & UINT32_C(0xff000000)) >> 24 ) \114 # define KLDR_E2E_U32(u32) ( ( ((u32) & UINT32_C(0xff000000)) >> 24 ) \ 60 115 | ( ((u32) & UINT32_C(0x00ff0000)) >> 8 ) \ 61 116 | ( ((u32) & UINT32_C(0x0000ff00)) << 8 ) \ 62 117 | ( ((u32) & UINT32_C(0x000000ff)) << 24 ) \ 63 118 ) 64 /** @def KLDR HLP_E2E_U64119 /** @def KLDR_E2E_U64 65 120 * Convert the endian of an unsigned 64-bit value. */ 66 # define KLDR HLP_E2E_U64(u64)( ( ((u64) & UINT64_C(0xff00000000000000)) >> 56 ) \121 # define KLDR_E2E_U64(u64) ( ( ((u64) & UINT64_C(0xff00000000000000)) >> 56 ) \ 67 122 | ( ((u64) & UINT64_C(0x00ff000000000000)) >> 40 ) \ 68 123 | ( ((u64) & UINT64_C(0x0000ff0000000000)) >> 24 ) \ … … 74 129 ) 75 130 76 /** @def KLDR HLP_LE2H_U16131 /** @def KLDR_LE2H_U16 77 132 * Unsigned 16-bit little-endian to host endian. */ 78 /** @def KLDR HLP_LE2H_U32133 /** @def KLDR_LE2H_U32 79 134 * Unsigned 32-bit little-endian to host endian. */ 80 /** @def KLDR HLP_LE2H_U64135 /** @def KLDR_LE2H_U64 81 136 * Unsigned 64-bit little-endian to host endian. */ 82 /** @def KLDR HLP_BE2H_U16137 /** @def KLDR_BE2H_U16 83 138 * Unsigned 16-bit big-endian to host endian. */ 84 /** @def KLDR HLP_BE2H_U32139 /** @def KLDR_BE2H_U32 85 140 * Unsigned 32-bit big-endian to host endian. */ 86 /** @def KLDR HLP_BE2H_U64141 /** @def KLDR_BE2H_U64 87 142 * Unsigned 64-bit big-endian to host endian. */ 88 143 #ifdef KLDR_LITTLE_ENDIAN 89 # define KLDR HLP_LE2H_U16(u16) ((uint16_t)(u16))90 # define KLDR HLP_LE2H_U32(u32) ((uint32_t)(u32))91 # define KLDR HLP_LE2H_U64(u64) ((uint32_t)(u32))92 # define KLDR HLP_BE2H_U16(u16) KLDRHLP_E2E_U16(u16)93 # define KLDR HLP_BE2H_U32(u32) KLDRHLP_E2E_U32(u32)94 # define KLDR HLP_BE2H_U64(u64) KLDRHLP_E2E_U64(u64)144 # define KLDR_LE2H_U16(u16) ((uint16_t)(u16)) 145 # define KLDR_LE2H_U32(u32) ((uint32_t)(u32)) 146 # define KLDR_LE2H_U64(u64) ((uint32_t)(u32)) 147 # define KLDR_BE2H_U16(u16) KLDR_E2E_U16(u16) 148 # define KLDR_BE2H_U32(u32) KLDR_E2E_U32(u32) 149 # define KLDR_BE2H_U64(u64) KLDR_E2E_U64(u64) 95 150 #elif defined(KLDR_BIG_ENDIAN) 96 # define KLDR HLP_LE2H_U16(u16) KLDRHLP_E2E_U16(u16)97 # define KLDR HLP_LE2H_U32(u32) KLDRHLP_E2E_U32(u32)98 # define KLDR HLP_LE2H_U32(u64) KLDRHLP_E2E_U64(u64)99 # define KLDR HLP_BE2H_U16(u16) ((uint16_t)(u16))100 # define KLDR HLP_BE2H_U32(u32) ((uint32_t)(u32))101 # define KLDR HLP_BE2H_U64(u64) ((uint32_t)(u32))151 # define KLDR_LE2H_U16(u16) KLDR_E2E_U16(u16) 152 # define KLDR_LE2H_U32(u32) KLDR_E2E_U32(u32) 153 # define KLDR_LE2H_U32(u64) KLDR_E2E_U64(u64) 154 # define KLDR_BE2H_U16(u16) ((uint16_t)(u16)) 155 # define KLDR_BE2H_U32(u32) ((uint32_t)(u32)) 156 # define KLDR_BE2H_U64(u64) ((uint32_t)(u32)) 102 157 #else 103 158 # error "KLDR_BIG_ENDIAN or KLDR_LITTLE_ENDIAN is supposed to be defined." … … 106 161 /** @} */ 107 162 108 109 /* 110 * Compiler specific helpers / CRT. 111 * (I.e. operations that tend to have compiler intrinsic implementations). 112 */ 113 #ifndef KLDR_USE_CRT 114 115 # ifdef __GNUC__ 116 /** memchr */ 117 # define kLdrHlpMemChr(a,b,c) __builtin_memchr(a,b,c) 118 /** memcmp */ 119 # define kLdrHlpMemComp(a,b,c) __builtin_memcmp(a,b,c) 120 /** memcpy */ 121 # define kLdrHlpMemCopy(a,b,c) __builtin_memcpy(a,b,c) 122 /** memmove */ 123 /*# define kLdrHlpMemMove(a,b,c) __builtin_memmove(a,b,c)*/ 124 # define kLdrHlpMemMove_needed 125 /** memset */ 126 # define kLdrHlpMemSet(a,b,c) __builtin_memset(a,b,c) 127 /** strchr */ 128 # define kLdrHlpStrChr(a, b) __builtin_strchr(a, b) 129 /** strcmp */ 130 # define kLdrHlpStrComp(a, b) __builtin_strcmp(a, b) 131 /** strncmp */ 132 # define kLdrHlpStrNComp(a,b,c) __builtin_strncmp(a, b, c) 133 /** strlen */ 134 # define kLdrHlpStrLen(a) __builtin_strlen(a) 135 /** alloca */ 136 # define kLdrHlpAllocA(a) __builtin_alloca(a) 137 /** int3 */ 138 # define kldrHlpBreakpoint() do { __asm__ __volatile__ ("int3\n\tnop"); } while (0) 139 /** NULL */ 140 # ifndef NULL 141 # define NULL 0 142 # endif 143 # endif 144 145 # ifdef _MSC_VER 146 # include <string.h> 147 # include <malloc.h> 148 # pragma intrinsic(memcmp, memcpy, memset, strcmp, strlen, __debugbreak) 149 /** memchr */ 150 # define kLdrHlpMemChr_needed 151 /** memcmp */ 152 # define kLdrHlpMemComp(a,b,c) memcmp(a,b,c) 153 /** memcpy */ 154 # define kLdrHlpMemCopy(a,b,c) memcpy(a,b,c) 155 /** memmove */ 156 # define kLdrHlpMemMove_needed 157 /** memset */ 158 # define kLdrHlpMemSet(a,b,c) memset(a,b,c) 159 /** strcmp */ 160 # define kLdrHlpStrComp(a, b) strcmp(a, b) 161 /** strncmp */ 162 # define kLdrHlpStrNComp_needed 163 /** strlen */ 164 # define kLdrHlpStrLen(a) strlen(a) 165 /** strchr */ 166 # define kLdrHlpStrChr_needed 167 /** alloca */ 168 # define kLdrHlpAllocA(a) alloca(a) 169 /** int3 */ 170 # define kldrHlpBreakpoint() __debugbreak() 171 /** NULL */ 172 # ifndef NULL 173 # define NULL 0 174 # endif 175 # endif 176 177 # ifdef kLdrHlpStrChr_needed 178 char *kLdrHlpStrChr(const char *psz, int ch); 179 # endif 180 # ifdef kLdrHlpStrChr_needed 181 int kLdrHlpStrNComp(const char *psz1, const char *psz2, size_t cch); 182 # endif 183 # ifdef kLdrHlpMemChr_needed 184 void *kLdrHlpMemChr(const void *pv, int ch, size_t cb); 185 # endif 186 # ifdef kLdrHlpMemMove_needed 187 void *kLdrHlpMemMove(void *pv1, const void *pv2, size_t cb); 188 # endif 189 190 191 #else /* KLDR_USE_CRT */ 192 193 # include <string.h> 194 # include <stdlib.h> 195 # ifdef _MSC_VER 196 # include <malloc.h> 197 # endif 198 199 # define kLdrHlpMemChr(a,b,c) memchr(a,b,c) 200 /** memcmp */ 201 # define kLdrHlpMemComp(a,b,c) memcmp(a,b,c) 202 /** memcpy */ 203 # define kLdrHlpMemCopy(a,b,c) memcpy(a,b,c) 204 /** memmove */ 205 # define kLdrHlpMemMove(a,b,c) memmove(a,b,c) 206 /** memset */ 207 # define kLdrHlpMemSet(a,b,c) memset(a,b,c) 208 /** strchr */ 209 # define kLdrHlpStrChr(a, b) strchr(a, b) 210 /** strcmp */ 211 # define kLdrHlpStrComp(a, b) strcmp(a, b) 212 /** strncmp */ 213 # define kLdrHlpStrNComp(a,b,c) strncmp(a, b, c) 214 /** strlen */ 215 # define kLdrHlpStrLen(a) strlen(a) 216 /** alloca */ 217 # define kLdrHlpAllocA(a) alloca(a) 218 /** int3 */ 219 # ifdef __GNUC__ 220 # define kldrHlpBreakpoint() do { __asm__ __volatile__ ("int3\n\tnop"); } while (0) 221 # endif 222 # ifdef _MSC_VER 223 # define kldrHlpBreakpoint() __debugbreak() 224 # endif 163 /** @} */ 225 164 226 165 #endif 227 166 228 #if (!defined(kLdrHlpMemChr) && !defined(kLdrHlpStrChr_needed))\229 || !defined(kLdrHlpMemComp) \230 || !defined(kLdrHlpMemCopy) \231 || !defined(kLdrHlpMemSet) \232 || (!defined(kLdrHlpStrChr) && !defined(kLdrHlpStrChr_needed)) \233 || !defined(kLdrHlpStrComp) \234 || (!defined(kLdrHlpStrNComp) && !defined(kLdrHlpStrNComp_needed)) \235 || !defined(kLdrHlpStrLen) \236 || !defined(kLdrHlpAllocA) \237 || !defined(kldrHlpBreakpoint)238 # error "Needs porting to your compiler."239 #endif240 241 #ifdef __cplusplus242 extern "C" {243 #endif244 245 size_t kLdrHlpStrNLen(const char *psz, size_t cchMax);246 int kLdrHlpMemIComp(const void *pv1, const void *pv2, size_t cb);247 int kLdrHlpStrIComp(const char *pv1, const char *pv2);248 249 int kldrHlpSemInit(void);250 void kldrHlpSemTerm(void);251 int kldrHlpSemRequest(void);252 void kldrHlpSemRelease(void);253 254 int kldrHlpPageAlloc(void **ppv, size_t cb, KLDRPROT enmProt, unsigned fFixed);255 int kldrHlpPageProtect(void *pv, size_t cb, KLDRPROT enmProt);256 int kldrHlpPageFree(void *pv, size_t cb);257 258 int kldrHlpHeapInit(void);259 void kldrHlpHeapTerm(void);260 void kldrHlpHeapDonate(void *pv, size_t cb);261 void * kldrHlpAlloc(size_t cb);262 void * kldrHlpAllocZ(size_t cb);263 void kldrHlpFree(void *pv);264 265 int kldrHlpGetEnv(const char *pszVar, char *pszVal, size_t cchVal);266 int kldrHlpGetEnvUZ(const char *pszVar, size_t *pcb);267 char *kldrHlpGetFilename(const char *pszFilename);268 char *kldrHlpGetSuff(const char *pszFilename);269 char *kldrHlpGetExt(const char *pszFilename);270 int kldrHlpIsFilenameOnly(const char *pszFilename);271 void kldrHlpExit(int rc);272 void kldrHlpSleep(unsigned cMillies);273 char *kldrHlpInt2Ascii(char *psz, size_t cch, long lVal, unsigned iBase);274 void kldrHlpAssertMsg(const char *pszExpr, const char *pszFile, unsigned iLine, const char *pszFunction);275 276 #ifdef __cplusplus277 }278 #endif279 280 281 /** Assertion macro.282 * Users should wrap it since this is ALWAYS compiled in. */283 #define kldrHlpAssert(expr) \284 do { \285 if (!(expr)) \286 { \287 kldrHlpAssertMsg(#expr, __FILE__, __LINE__, __FUNCTION__); \288 kldrHlpBreakpoint(); \289 } \290 } while (0)291 292 293 /** @name Parameter validation macros294 * @{ */295 296 /** Crash validation of a string argument. */297 #define KLDRHLP_VALIDATE_STRING(str) \298 do { kLdrHlpStrLen(str); } while (0)299 300 /** Crash validation of an optional string argument. */301 #define KLDRHLP_VALIDATE_OPTIONAL_STRING(str) \302 do { if (str) { KLDRHLP_VALIDATE_STRING(str); } } while (0)303 304 /** Return/Crash validation of an output buffer. */305 #define KLDRHLP_VALIDATE_BUFFER(buf, cb) \306 do { \307 if ((cb)) \308 { \309 uint8_t __b; \310 uint8_t volatile * __pb = (uint8_t volatile *)(buf); \311 size_t __cbPage1 = 0x1000 - ((uintptr_t)(__pb) & 0xfff); /* ASSUMES page size! */ \312 __b = *__pb; *__pb = 0xff; *__pb = __b; \313 if ((cb) > __cbPage1) \314 { \315 size_t __cb = (cb) - __cbPage1; \316 __pb -= __cbPage1; \317 for (;;) \318 { \319 __b = *__pb; *__pb = 0xff; *__pb = __b; \320 if (__cb < 0x1000) \321 break; \322 __pb += 0x1000; \323 __cb -= 0x1000; \324 } \325 } \326 } \327 else \328 return KLDR_ERR_INVALID_PARAMETER; \329 } while (0)330 331 /** Crash validation of an optional output buffer. */332 #define KLDRHLP_VALIDATE_OPTIONAL_BUFFER(buf, cb) \333 do { \334 if ((buf) != NULL && (cb) != 0) \335 { \336 KLDRHLP_VALIDATE_BUFFER(buf, cb); \337 } \338 } while (0)339 340 /** Return validation of an enum argument. */341 #define KLDRHLP_VALIDATE_ENUM(arg, enumname) \342 do { \343 if ((arg) <= enumname##_INVALID || (arg) >= enumname##_END) \344 { \345 return KLDR_ERR_INVALID_PARAMETER; \346 } \347 } while (0)348 349 /** Return validation of a flags argument. */350 #define KLDRHLP_VALIDATE_FLAGS(arg, AllowedMask) \351 do { \352 if ((arg) & ~(AllowedMask)) \353 { \354 return KLDR_ERR_INVALID_PARAMETER; \355 } \356 } while (0)357 358 /** @} */359 360 361 /** @} */362 363 #endif /* __kLdrHlp_h__ */364
Note:
See TracChangeset
for help on using the changeset viewer.