3 #ifndef INCLUDE_NN_NLIB_PLATFORM_CAFE_H_ 4 #define INCLUDE_NN_NLIB_PLATFORM_CAFE_H_ 5 #ifndef INCLUDE_NN_NLIB_PLATFORM_H_ 6 # error do not include directly 10 #define NLIB_HAS_STDHEADER_STDINT 11 #define NLIB_HAS_STDHEADER_INTTYPES 22 # define NLIB_CAFE_PPC 24 #define NLIB_ALWAYS_INLINE inline __attribute__((always_inline)) 25 #define NLIB_NEVER_INLINE __attribute__((__noinline__)) 27 #define NLIB_LIKELY(x) __builtin_expect(!!(x), 1) 28 #define NLIB_UNLIKELY(x) __builtin_expect(!!(x), 0) 30 #define NLIB_LIKELY(x) (x) 31 #define NLIB_UNLIKELY(x) (x) 33 #define NLIB_EXPECT(var, exp_value) __builtin_expect((var), (exp_value)) 34 #define NLIB_CHECK_RESULT __attribute__((warn_unused_result)) 35 #define NLIB_NORETURN __attribute__((noreturn)) 36 #define NLIB_NONNULL __attribute__((nonnull)) 37 #define NLIB_NONNULL_1 __attribute__((nonnull (1))) 38 #define NLIB_NONNULL_2 __attribute__((nonnull (2))) 39 #define NLIB_NONNULL_3 __attribute__((nonnull (3))) 40 #define NLIB_NONNULL_4 __attribute__((nonnull (4))) 41 #define NLIB_NONNULL_5 __attribute__((nonnull (5))) 42 #define NLIB_NONNULL_ENABLED 43 #define NLIB_ATTRIBUTE_MALLOC __attribute__((malloc)) 44 #define NLIB_ATTRIBUTE_PURE __attribute__((pure)) 45 #define NLIB_ATTRIBUTE_CONST __attribute__((const)) 46 #define NLIB_ATTRIBUTE_ALLOC_SIZE1(n) 47 #define NLIB_ATTRIBUTE_ALLOC_SIZE2(n0, n1) 48 #define NLIB_ATTRIBUTE_ALLOC_ALIGN(algn) 49 #define NLIB_ATTRIBUTE_ASSUME_ALIGNED(n) 50 #ifndef NLIB_DEPRECATED 51 #define NLIB_DEPRECATED __attribute__((deprecated)) 53 #ifndef NLIB_DEPRECATED_MSG 54 #define NLIB_DEPRECATED_MSG(msg) __attribute__((deprecated)) 56 #define NLIB_VIS_HIDDEN 57 #define NLIB_VIS_PUBLIC 58 #define NLIB_WEAKSYMBOL __attribute__((weak)) 60 #define NLIB_MEMORY_ORDER_RELEASE __LWSYNC() 61 #define NLIB_MEMORY_ORDER_ACQUIRE __ISYNC() 62 #define NLIB_MEMORY_ORDER_ACQ_REL __LWSYNC(); __ISYNC() 63 #define NLIB_MEMORY_ORDER_SEQ_CST OSCoherencyBarrier() 71 #define NLIB_MUTEX_INITIALIZER {0} 72 #define NLIB_RECURSIVE_MUTEX_INITIALIZER {0} 73 #define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER {0} 80 #define NLIB_COND_INITIALIZER {0} 82 void MyNoreturn_(
void) __attribute__((noreturn));
83 #define NLIB_ASSUME(cond) switch (0) case 0: default: if (cond) ; else MyNoreturn_() 85 #define NLIB_ATOMIC_RELAXED (0) 86 #define NLIB_ATOMIC_ACQUIRE (1) 87 #define NLIB_ATOMIC_RELEASE (2) 88 #define NLIB_ATOMIC_ACQ_REL (3) 89 #define NLIB_ATOMIC_SEQ_CST (7) 92 int32_t rval = *(
volatile int32_t*)ptr;
101 OSCoherencyBarrier();
104 *(
volatile int32_t*)ptr = val;
106 OSCoherencyBarrier();
113 OSCoherencyBarrier();
114 else if (memorder & NLIB_ATOMIC_RELEASE)
116 x = OSSwapAtomic((
volatile OSAtomicVar*)ptr, (uint32_t)val);
123 int32_t desired,
int weak,
124 int success_memorder,
125 int failure_memorder) {
127 OSCoherencyBarrier();
128 else if (success_memorder & NLIB_ATOMIC_RELEASE)
131 BOOL result = OSCompareAndSwapAtomicEx(
132 (
volatile OSAtomicVar*)ptr,
137 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
140 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
146 orig_val = (u32)__LWARX((u32*)ptr, 0);
147 if (orig_val == *expected) {
148 __DCBST(0, (u32)ptr);
149 if (__STWCX((u32*)ptr, 0, (u32)desired)) {
150 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
154 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
158 *expected = (int32_t)orig_val;
159 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
170 OSCoherencyBarrier();
171 else if (memorder & NLIB_ATOMIC_RELEASE)
173 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
174 if (memorder & NLIB_ATOMIC_ACQUIRE)
183 OSCoherencyBarrier();
184 else if (memorder & NLIB_ATOMIC_RELEASE)
186 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
187 if (memorder & NLIB_ATOMIC_ACQUIRE)
196 OSCoherencyBarrier();
197 else if (memorder & NLIB_ATOMIC_RELEASE)
199 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
200 if (memorder & NLIB_ATOMIC_ACQUIRE)
209 OSCoherencyBarrier();
210 else if (memorder & NLIB_ATOMIC_RELEASE)
212 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
213 if (memorder & NLIB_ATOMIC_ACQUIRE)
222 OSCoherencyBarrier();
223 else if (memorder & NLIB_ATOMIC_RELEASE)
225 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
226 if (memorder & NLIB_ATOMIC_ACQUIRE)
235 OSCoherencyBarrier();
236 else if (memorder & NLIB_ATOMIC_RELEASE)
238 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
239 if (memorder & NLIB_ATOMIC_ACQUIRE)
248 OSCoherencyBarrier();
249 else if (memorder & NLIB_ATOMIC_RELEASE)
251 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
252 if (memorder & NLIB_ATOMIC_ACQUIRE)
261 OSCoherencyBarrier();
262 else if (memorder & NLIB_ATOMIC_RELEASE)
264 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
265 if (memorder & NLIB_ATOMIC_ACQUIRE)
274 OSCoherencyBarrier();
275 else if (memorder & NLIB_ATOMIC_RELEASE)
277 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
278 if (memorder & NLIB_ATOMIC_ACQUIRE)
287 OSCoherencyBarrier();
288 else if (memorder & NLIB_ATOMIC_RELEASE)
290 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
291 if (memorder & NLIB_ATOMIC_ACQUIRE)
297 int64_t rval = (int64_t)OSGetAtomic64((
volatile OSAtomicVar64*)ptr);
298 if (memorder & NLIB_ATOMIC_ACQUIRE)
306 OSCoherencyBarrier();
307 else if (memorder & NLIB_ATOMIC_RELEASE)
309 OSSetAtomic64((
volatile OSAtomicVar64*)ptr, (u64)val);
311 OSCoherencyBarrier();
318 OSCoherencyBarrier();
319 else if (memorder & NLIB_ATOMIC_RELEASE)
321 x = OSSwapAtomic64((
volatile OSAtomicVar64*)ptr, (uint64_t)val);
322 if (memorder & NLIB_ATOMIC_ACQUIRE)
328 int64_t desired,
int weak,
329 int success_memorder,
330 int failure_memorder) {
334 OSCoherencyBarrier();
335 else if (success_memorder & NLIB_ATOMIC_RELEASE)
338 result = OSCompareAndSwapAtomicEx64(
339 (
volatile OSAtomicVar64*)ptr,
344 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
347 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
357 OSCoherencyBarrier();
358 else if (memorder & NLIB_ATOMIC_RELEASE)
360 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
361 if (memorder & NLIB_ATOMIC_ACQUIRE)
370 OSCoherencyBarrier();
371 else if (memorder & NLIB_ATOMIC_RELEASE)
373 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
374 if (memorder & NLIB_ATOMIC_ACQUIRE)
383 OSCoherencyBarrier();
384 else if (memorder & NLIB_ATOMIC_RELEASE)
386 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
387 if (memorder & NLIB_ATOMIC_ACQUIRE)
396 OSCoherencyBarrier();
397 else if (memorder & NLIB_ATOMIC_RELEASE)
399 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
400 if (memorder & NLIB_ATOMIC_ACQUIRE)
409 OSCoherencyBarrier();
410 else if (memorder & NLIB_ATOMIC_RELEASE)
412 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
413 if (memorder & NLIB_ATOMIC_ACQUIRE)
422 OSCoherencyBarrier();
423 else if (memorder & NLIB_ATOMIC_RELEASE)
425 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
426 if (memorder & NLIB_ATOMIC_ACQUIRE)
435 OSCoherencyBarrier();
436 else if (memorder & NLIB_ATOMIC_RELEASE)
438 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
439 if (memorder & NLIB_ATOMIC_ACQUIRE)
448 OSCoherencyBarrier();
449 else if (memorder & NLIB_ATOMIC_RELEASE)
451 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
452 if (memorder & NLIB_ATOMIC_ACQUIRE)
461 OSCoherencyBarrier();
462 else if (memorder & NLIB_ATOMIC_RELEASE)
464 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
465 if (memorder & NLIB_ATOMIC_ACQUIRE)
474 OSCoherencyBarrier();
475 else if (memorder & NLIB_ATOMIC_RELEASE)
477 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
478 if (memorder & NLIB_ATOMIC_ACQUIRE)
484 void* rval = *(
void*
volatile*)ptr;
485 if (memorder & NLIB_ATOMIC_ACQUIRE)
492 OSCoherencyBarrier();
493 else if (memorder & NLIB_ATOMIC_RELEASE)
495 *(
void*
volatile*)ptr = val;
497 OSCoherencyBarrier();
501 void* desired,
int weak,
502 int success_memorder,
503 int failure_memorder) {
505 weak, success_memorder, failure_memorder);
512 case NLIB_ATOMIC_ACQUIRE:
515 case NLIB_ATOMIC_RELEASE:
527 #define NLIB_FD_O_RDONLY (0x0000) 528 #define NLIB_FD_O_WRONLY (0x0001) 529 #define NLIB_FD_O_RDWR (0x0002) 530 #define NLIB_FD_O_APPEND (0x0008) 531 #define NLIB_FD_O_CREAT (0x0100) 532 #define NLIB_FD_O_TRUNC (0x0200) 533 #define NLIB_FD_O_EXCL (0x0400) 539 #define NLIB_NOEXCEPT 546 #define NLIB_MEMCPY(a, b, c) OSBlockMove((a), (b), (c), FALSE) 547 #define NLIB_MEMMOVE(a, b, c) OSBlockMove((a), (b), (c), FALSE) 548 #define NLIB_MEMSET(a, b, c) OSBlockSet((a), (b), (c)) 550 #ifndef NLIB_HAS_ZLIB 551 # define NLIB_HAS_ZLIB 554 #ifndef NLIB_HAS_LIBCURL 555 # define NLIB_HAS_LIBCURL 559 #endif // INCLUDE_NN_NLIB_PLATFORM_CAFE_H_