Make UEFI boot-platform build again
[haiku.git] / headers / os / support / SupportDefs.h
blobf2533bb89e59ce89c5dbd0ef27df93858ea33e9d
1 /*
2 * Copyright 2004-2010 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
5 * Author:
6 * Erik Jaesler (erik@cgsoftware.com)
7 */
8 #ifndef _SUPPORT_DEFS_H
9 #define _SUPPORT_DEFS_H
12 #include <BeBuild.h>
13 #include <Errors.h>
15 #include <inttypes.h>
16 #include <sys/types.h>
19 /* fixed-size integer types */
20 typedef __haiku_int8 int8;
21 typedef __haiku_uint8 uint8;
22 typedef __haiku_int16 int16;
23 typedef __haiku_uint16 uint16;
24 typedef __haiku_int32 int32;
25 typedef __haiku_uint32 uint32;
26 typedef __haiku_int64 int64;
27 typedef __haiku_uint64 uint64;
29 /* shorthand types */
30 typedef volatile int8 vint8;
31 typedef volatile uint8 vuint8;
32 typedef volatile int16 vint16;
33 typedef volatile uint16 vuint16;
34 typedef volatile int32 vint32;
35 typedef volatile uint32 vuint32;
36 typedef volatile int64 vint64;
37 typedef volatile uint64 vuint64;
39 typedef volatile long vlong;
40 typedef volatile int vint;
41 typedef volatile short vshort;
42 typedef volatile char vchar;
44 typedef volatile unsigned long vulong;
45 typedef volatile unsigned int vuint;
46 typedef volatile unsigned short vushort;
47 typedef volatile unsigned char vuchar;
49 typedef unsigned char uchar;
50 typedef unsigned short unichar;
52 /* descriptive types */
53 typedef int32 status_t;
54 typedef int64 bigtime_t;
55 typedef int64 nanotime_t;
56 typedef uint32 type_code;
57 typedef uint32 perform_code;
59 typedef __haiku_phys_addr_t phys_addr_t;
60 typedef phys_addr_t phys_size_t;
62 typedef __haiku_generic_addr_t generic_addr_t;
63 typedef generic_addr_t generic_size_t;
66 /* printf()/scanf() format strings for [u]int* types */
67 #define B_PRId8 "d"
68 #define B_PRIi8 "i"
69 #define B_PRId16 "d"
70 #define B_PRIi16 "i"
71 #define B_PRId32 __HAIKU_PRI_PREFIX_32 "d"
72 #define B_PRIi32 __HAIKU_PRI_PREFIX_32 "i"
73 #define B_PRId64 __HAIKU_PRI_PREFIX_64 "d"
74 #define B_PRIi64 __HAIKU_PRI_PREFIX_64 "i"
75 #define B_PRIu8 "u"
76 #define B_PRIo8 "o"
77 #define B_PRIx8 "x"
78 #define B_PRIX8 "X"
79 #define B_PRIu16 "u"
80 #define B_PRIo16 "o"
81 #define B_PRIx16 "x"
82 #define B_PRIX16 "X"
83 #define B_PRIu32 __HAIKU_PRI_PREFIX_32 "u"
84 #define B_PRIo32 __HAIKU_PRI_PREFIX_32 "o"
85 #define B_PRIx32 __HAIKU_PRI_PREFIX_32 "x"
86 #define B_PRIX32 __HAIKU_PRI_PREFIX_32 "X"
87 #define B_PRIu64 __HAIKU_PRI_PREFIX_64 "u"
88 #define B_PRIo64 __HAIKU_PRI_PREFIX_64 "o"
89 #define B_PRIx64 __HAIKU_PRI_PREFIX_64 "x"
90 #define B_PRIX64 __HAIKU_PRI_PREFIX_64 "X"
92 #define B_SCNd8 "hhd"
93 #define B_SCNi8 "hhi"
94 #define B_SCNd16 "hd"
95 #define B_SCNi16 "hi"
96 #define B_SCNd32 __HAIKU_PRI_PREFIX_32 "d"
97 #define B_SCNi32 __HAIKU_PRI_PREFIX_32 "i"
98 #define B_SCNd64 __HAIKU_PRI_PREFIX_64 "d"
99 #define B_SCNi64 __HAIKU_PRI_PREFIX_64 "i"
100 #define B_SCNu8 "hhu"
101 #define B_SCNo8 "hho"
102 #define B_SCNx8 "hhx"
103 #define B_SCNu16 "hu"
104 #define B_SCNo16 "ho"
105 #define B_SCNx16 "hx"
106 #define B_SCNu32 __HAIKU_PRI_PREFIX_32 "u"
107 #define B_SCNo32 __HAIKU_PRI_PREFIX_32 "o"
108 #define B_SCNx32 __HAIKU_PRI_PREFIX_32 "x"
109 #define B_SCNu64 __HAIKU_PRI_PREFIX_64 "u"
110 #define B_SCNo64 __HAIKU_PRI_PREFIX_64 "o"
111 #define B_SCNx64 __HAIKU_PRI_PREFIX_64 "x"
113 /* printf()/scanf() format strings for some standard types */
114 /* size_t */
115 #define B_PRIuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
116 #define B_PRIoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
117 #define B_PRIxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
118 #define B_PRIXSIZE __HAIKU_PRI_PREFIX_ADDR "X"
120 #define B_SCNuSIZE __HAIKU_PRI_PREFIX_ADDR "u"
121 #define B_SCNoSIZE __HAIKU_PRI_PREFIX_ADDR "o"
122 #define B_SCNxSIZE __HAIKU_PRI_PREFIX_ADDR "x"
124 /* ssize_t */
125 #define B_PRIdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
126 #define B_PRIiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
128 #define B_SCNdSSIZE __HAIKU_PRI_PREFIX_ADDR "d"
129 #define B_SCNiSSIZE __HAIKU_PRI_PREFIX_ADDR "i"
131 /* addr_t */
132 #define B_PRIuADDR __HAIKU_PRI_PREFIX_ADDR "u"
133 #define B_PRIoADDR __HAIKU_PRI_PREFIX_ADDR "o"
134 #define B_PRIxADDR __HAIKU_PRI_PREFIX_ADDR "x"
135 #define B_PRIXADDR __HAIKU_PRI_PREFIX_ADDR "X"
137 #define B_SCNuADDR __HAIKU_PRI_PREFIX_ADDR "u"
138 #define B_SCNoADDR __HAIKU_PRI_PREFIX_ADDR "o"
139 #define B_SCNxADDR __HAIKU_PRI_PREFIX_ADDR "x"
141 /* phys_addr_t */
142 #define B_PRIuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
143 #define B_PRIoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
144 #define B_PRIxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
145 #define B_PRIXPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "X"
147 #define B_SCNuPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "u"
148 #define B_SCNoPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "o"
149 #define B_SCNxPHYSADDR __HAIKU_PRI_PREFIX_PHYS_ADDR "x"
151 /* generic_addr_t */
152 #define B_PRIuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
153 #define B_PRIoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
154 #define B_PRIxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
155 #define B_PRIXGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "X"
157 #define B_SCNuGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "u"
158 #define B_SCNoGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "o"
159 #define B_SCNxGENADDR __HAIKU_PRI_PREFIX_GENERIC_ADDR "x"
161 /* off_t */
162 #define B_PRIdOFF B_PRId64
163 #define B_PRIiOFF B_PRIi64
164 #define B_PRIxOFF B_PRIx64
166 #define B_SCNdOFF B_SCNd64
167 #define B_SCNiOFF B_SCNi64
168 #define B_SCNxOFF B_SCNx64
170 /* dev_t */
171 #define B_PRIdDEV B_PRId32
172 #define B_PRIiDEV B_PRIi32
174 /* ino_t */
175 #define B_PRIdINO B_PRId64
176 #define B_PRIiINO B_PRIi64
178 /* time_t */
179 #if defined(__i386__) && !defined(__x86_64__)
180 # define B_PRIdTIME B_PRId32
181 # define B_PRIiTIME B_PRIi32
182 #else
183 # define B_PRIdTIME B_PRId64
184 # define B_PRIiTIME B_PRIi64
185 #endif
187 /* bigtime_t */
188 #define B_PRIdBIGTIME B_PRId64
189 #define B_PRIiBIGTIME B_PRIi64
192 /* Printed width of a pointer with the %p format (minus 0x prefix). */
193 #ifdef B_HAIKU_64_BIT
194 # define B_PRINTF_POINTER_WIDTH 16
195 #else
196 # define B_PRINTF_POINTER_WIDTH 8
197 #endif
200 /* Empty string ("") */
201 #ifdef __cplusplus
202 extern const char *B_EMPTY_STRING;
203 #endif
206 /* min and max comparisons */
207 #ifndef __cplusplus
208 # ifndef min
209 # define min(a,b) ((a)>(b)?(b):(a))
210 # endif
211 # ifndef max
212 # define max(a,b) ((a)>(b)?(a):(b))
213 # endif
214 #endif
216 /* min() and max() are functions in C++ */
217 #define min_c(a,b) ((a)>(b)?(b):(a))
218 #define max_c(a,b) ((a)>(b)?(a):(b))
221 /* Grandfathering */
222 #ifndef __cplusplus
223 # include <stdbool.h>
224 #endif
226 #ifndef NULL
227 # define NULL (0)
228 #endif
231 #ifdef __cplusplus
232 extern "C" {
233 #endif
235 /* Other stuff */
236 extern void* get_stack_frame(void);
238 #ifdef __cplusplus
240 #endif
242 /* Count items in an array, count_of is a common define */
243 #define B_COUNT_OF(a) (sizeof(a) / sizeof(a[0]))
245 /* Obsolete or discouraged API */
247 /* use 'true' and 'false' */
248 #ifndef FALSE
249 # define FALSE 0
250 #endif
251 #ifndef TRUE
252 # define TRUE 1
253 #endif
256 /* Use the built-in atomic functions, if requested and available. */
258 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || defined(__clang__)
261 static __inline__ void
262 atomic_set(int32* value, int32 newValue)
264 __atomic_store_n(value, newValue, __ATOMIC_RELEASE);
268 static __inline__ int32
269 atomic_get_and_set(int32* value, int32 newValue)
271 return __atomic_exchange_n(value, newValue, __ATOMIC_SEQ_CST);
275 static __inline__ int32
276 atomic_test_and_set(int32* value, int32 newValue, int32 testAgainst)
278 __atomic_compare_exchange_n(value, &testAgainst, newValue, 1,
279 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
280 return testAgainst;
284 static __inline__ int32
285 atomic_add(int32* value, int32 addValue)
287 return __atomic_fetch_add(value, addValue, __ATOMIC_SEQ_CST);
291 static __inline__ int32
292 atomic_and(int32* value, int32 andValue)
294 return __atomic_fetch_and(value, andValue, __ATOMIC_SEQ_CST);
298 static __inline__ int32
299 atomic_or(int32* value, int32 orValue)
301 return __atomic_fetch_or(value, orValue, __ATOMIC_SEQ_CST);
305 static __inline__ int32
306 atomic_get(int32* value)
308 return __atomic_load_n(value, __ATOMIC_ACQUIRE);
312 static __inline__ void
313 atomic_set64(int64* value, int64 newValue)
315 __atomic_store_n(value, newValue, __ATOMIC_RELEASE);
319 static __inline__ int64
320 atomic_get_and_set64(int64* value, int64 newValue)
322 return __atomic_exchange_n(value, newValue, __ATOMIC_SEQ_CST);
326 static __inline__ int64
327 atomic_test_and_set64(int64* value, int64 newValue, int64 testAgainst)
329 __atomic_compare_exchange_n(value, &testAgainst, newValue, 1,
330 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
331 return testAgainst;
335 static __inline__ int64
336 atomic_add64(int64* value, int64 addValue)
338 return __atomic_fetch_add(value, addValue, __ATOMIC_SEQ_CST);
342 static __inline__ int64
343 atomic_and64(int64* value, int64 andValue)
345 return __atomic_fetch_and(value, andValue, __ATOMIC_SEQ_CST);
349 static __inline__ int64
350 atomic_or64(int64* value, int64 orValue)
352 return __atomic_fetch_or(value, orValue, __ATOMIC_SEQ_CST);
356 static __inline__ int64
357 atomic_get64(int64* value)
359 return __atomic_load_n(value, __ATOMIC_ACQUIRE);
363 #else /* __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) */
365 #ifdef __cplusplus
366 extern "C" {
367 #endif
369 /* Atomic functions; previous value is returned */
370 extern void atomic_set(int32* value, int32 newValue);
371 extern int32 atomic_get_and_set(int32* value, int32 newValue);
372 extern int32 atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst);
373 extern int32 atomic_add(int32 *value, int32 addValue);
374 extern int32 atomic_and(int32 *value, int32 andValue);
375 extern int32 atomic_or(int32 *value, int32 orValue);
376 extern int32 atomic_get(int32 *value);
378 extern void atomic_set64(int64* value, int64 newValue);
379 extern int64 atomic_get_and_set64(int64* value, int64 newValue);
380 extern int64 atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst);
381 extern int64 atomic_add64(int64 *value, int64 addValue);
382 extern int64 atomic_and64(int64 *value, int64 andValue);
383 extern int64 atomic_or64(int64 *value, int64 orValue);
384 extern int64 atomic_get64(int64 *value);
386 #ifdef __cplusplus
388 #endif
390 #endif
393 #endif /* _SUPPORT_DEFS_H */