16 #ifndef INCLUDE_NN_NLIB_PLATFORM_CAFE_H_ 17 #define INCLUDE_NN_NLIB_PLATFORM_CAFE_H_ 18 #ifndef INCLUDE_NN_NLIB_PLATFORM_H_ 19 # error do not include directly 24 #ifndef __STDC_LIMIT_MACROS 25 #define __STDC_LIMIT_MACROS 27 #ifndef __STDC_CONSTANT_MACROS 28 #define __STDC_CONSTANT_MACROS 41 # define NLIB_CAFE_PPC 43 #define NLIB_ALWAYS_INLINE inline __attribute__((always_inline)) 44 #define NLIB_NEVER_INLINE __attribute__((__noinline__)) 46 #define NLIB_LIKELY(x) __builtin_expect(!!(x), 1) 47 #define NLIB_UNLIKELY(x) __builtin_expect(!!(x), 0) 49 #define NLIB_LIKELY(x) (x) 50 #define NLIB_UNLIKELY(x) (x) 52 #define NLIB_EXPECT(var, exp_value) __builtin_expect((var), (exp_value)) 53 #define NLIB_CHECK_RESULT __attribute__((warn_unused_result)) 54 #define NLIB_NORETURN __attribute__((noreturn)) 55 #define NLIB_NONNULL __attribute__((nonnull)) 56 #define NLIB_NONNULL_1 __attribute__((nonnull (1))) 57 #define NLIB_NONNULL_2 __attribute__((nonnull (2))) 58 #define NLIB_NONNULL_3 __attribute__((nonnull (3))) 59 #define NLIB_NONNULL_4 __attribute__((nonnull (4))) 60 #define NLIB_NONNULL_5 __attribute__((nonnull (5))) 61 #define NLIB_NONNULL_ENABLED 62 #define NLIB_ATTRIBUTE_MALLOC __attribute__((malloc)) 63 #define NLIB_ATTRIBUTE_PURE __attribute__((pure)) 64 #define NLIB_ATTRIBUTE_CONST __attribute__((const)) 65 #define NLIB_ATTRIBUTE_ALLOC_SIZE1(n) 66 #define NLIB_ATTRIBUTE_ALLOC_SIZE2(n0, n1) 67 #define NLIB_ATTRIBUTE_ALLOC_ALIGN(algn) 68 #define NLIB_ATTRIBUTE_ASSUME_ALIGNED(n) 69 #ifndef NLIB_DEPRECATED 70 #define NLIB_DEPRECATED __attribute__((deprecated)) 72 #ifndef NLIB_DEPRECATED_MSG 73 #define NLIB_DEPRECATED_MSG(msg) __attribute__((deprecated)) 75 #define NLIB_VIS_HIDDEN 76 #define NLIB_VIS_PUBLIC 77 #define NLIB_WEAKSYMBOL __attribute__((weak)) 79 #define NLIB_MEMORY_ORDER_RELEASE __LWSYNC() 80 #define NLIB_MEMORY_ORDER_ACQUIRE __ISYNC() 81 #define NLIB_MEMORY_ORDER_ACQ_REL __LWSYNC(); __ISYNC() 82 #define NLIB_MEMORY_ORDER_SEQ_CST OSCoherencyBarrier() 90 #define NLIB_MUTEX_INITIALIZER {0} 91 #define NLIB_RECURSIVE_MUTEX_INITIALIZER {0} 92 #define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER {0} 99 #define NLIB_COND_INITIALIZER {0} 101 void MyNoreturn_(
void) __attribute__((noreturn));
102 #define NLIB_ASSUME(cond) switch (0) case 0: default: if (cond) ; else MyNoreturn_() 104 #define NLIB_ATOMIC_RELAXED (0) 105 #define NLIB_ATOMIC_ACQUIRE (1) 106 #define NLIB_ATOMIC_RELEASE (2) 107 #define NLIB_ATOMIC_ACQ_REL (3) 108 #define NLIB_ATOMIC_SEQ_CST (7) 111 int32_t rval = *(
volatile int32_t*)ptr;
120 OSCoherencyBarrier();
123 *(
volatile int32_t*)ptr = val;
125 OSCoherencyBarrier();
132 OSCoherencyBarrier();
133 else if (memorder & NLIB_ATOMIC_RELEASE)
135 x = OSSwapAtomic((
volatile OSAtomicVar*)ptr, (uint32_t)val);
146 int32_t desired,
int weak,
147 int success_memorder,
148 int failure_memorder) {
150 OSCoherencyBarrier();
151 else if (success_memorder & NLIB_ATOMIC_RELEASE)
154 BOOL result = OSCompareAndSwapAtomicEx(
155 (
volatile OSAtomicVar*)ptr,
160 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
163 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
169 orig_val = (u32)__LWARX((u32*)ptr, 0);
170 if (orig_val == *expected) {
171 __DCBST(0, (u32)ptr);
172 if (__STWCX((u32*)ptr, 0, (u32)desired)) {
173 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
177 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
181 *expected = (int32_t)orig_val;
182 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
193 OSCoherencyBarrier();
194 else if (memorder & NLIB_ATOMIC_RELEASE)
196 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
197 if (memorder & NLIB_ATOMIC_ACQUIRE)
206 OSCoherencyBarrier();
207 else if (memorder & NLIB_ATOMIC_RELEASE)
209 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
210 if (memorder & NLIB_ATOMIC_ACQUIRE)
219 OSCoherencyBarrier();
220 else if (memorder & NLIB_ATOMIC_RELEASE)
222 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
223 if (memorder & NLIB_ATOMIC_ACQUIRE)
232 OSCoherencyBarrier();
233 else if (memorder & NLIB_ATOMIC_RELEASE)
235 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
236 if (memorder & NLIB_ATOMIC_ACQUIRE)
245 OSCoherencyBarrier();
246 else if (memorder & NLIB_ATOMIC_RELEASE)
248 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
249 if (memorder & NLIB_ATOMIC_ACQUIRE)
258 OSCoherencyBarrier();
259 else if (memorder & NLIB_ATOMIC_RELEASE)
261 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
262 if (memorder & NLIB_ATOMIC_ACQUIRE)
271 OSCoherencyBarrier();
272 else if (memorder & NLIB_ATOMIC_RELEASE)
274 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
275 if (memorder & NLIB_ATOMIC_ACQUIRE)
284 OSCoherencyBarrier();
285 else if (memorder & NLIB_ATOMIC_RELEASE)
287 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
288 if (memorder & NLIB_ATOMIC_ACQUIRE)
297 OSCoherencyBarrier();
298 else if (memorder & NLIB_ATOMIC_RELEASE)
300 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
301 if (memorder & NLIB_ATOMIC_ACQUIRE)
310 OSCoherencyBarrier();
311 else if (memorder & NLIB_ATOMIC_RELEASE)
313 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
314 if (memorder & NLIB_ATOMIC_ACQUIRE)
320 int64_t rval = (int64_t)OSGetAtomic64((
volatile OSAtomicVar64*)ptr);
321 if (memorder & NLIB_ATOMIC_ACQUIRE)
329 OSCoherencyBarrier();
330 else if (memorder & NLIB_ATOMIC_RELEASE)
332 OSSetAtomic64((
volatile OSAtomicVar64*)ptr, (u64)val);
334 OSCoherencyBarrier();
341 OSCoherencyBarrier();
342 else if (memorder & NLIB_ATOMIC_RELEASE)
344 x = OSSwapAtomic64((
volatile OSAtomicVar64*)ptr, (uint64_t)val);
345 if (memorder & NLIB_ATOMIC_ACQUIRE)
351 int64_t desired,
int weak,
352 int success_memorder,
353 int failure_memorder) {
357 OSCoherencyBarrier();
358 else if (success_memorder & NLIB_ATOMIC_RELEASE)
361 result = OSCompareAndSwapAtomicEx64(
362 (
volatile OSAtomicVar64*)ptr,
367 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
370 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
380 OSCoherencyBarrier();
381 else if (memorder & NLIB_ATOMIC_RELEASE)
383 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
384 if (memorder & NLIB_ATOMIC_ACQUIRE)
393 OSCoherencyBarrier();
394 else if (memorder & NLIB_ATOMIC_RELEASE)
396 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
397 if (memorder & NLIB_ATOMIC_ACQUIRE)
406 OSCoherencyBarrier();
407 else if (memorder & NLIB_ATOMIC_RELEASE)
409 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
410 if (memorder & NLIB_ATOMIC_ACQUIRE)
419 OSCoherencyBarrier();
420 else if (memorder & NLIB_ATOMIC_RELEASE)
422 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
423 if (memorder & NLIB_ATOMIC_ACQUIRE)
432 OSCoherencyBarrier();
433 else if (memorder & NLIB_ATOMIC_RELEASE)
435 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
436 if (memorder & NLIB_ATOMIC_ACQUIRE)
445 OSCoherencyBarrier();
446 else if (memorder & NLIB_ATOMIC_RELEASE)
448 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
449 if (memorder & NLIB_ATOMIC_ACQUIRE)
458 OSCoherencyBarrier();
459 else if (memorder & NLIB_ATOMIC_RELEASE)
461 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
462 if (memorder & NLIB_ATOMIC_ACQUIRE)
471 OSCoherencyBarrier();
472 else if (memorder & NLIB_ATOMIC_RELEASE)
474 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
475 if (memorder & NLIB_ATOMIC_ACQUIRE)
484 OSCoherencyBarrier();
485 else if (memorder & NLIB_ATOMIC_RELEASE)
487 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
488 if (memorder & NLIB_ATOMIC_ACQUIRE)
497 OSCoherencyBarrier();
498 else if (memorder & NLIB_ATOMIC_RELEASE)
500 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
501 if (memorder & NLIB_ATOMIC_ACQUIRE)
507 void* rval = *(
void*
volatile*)ptr;
508 if (memorder & NLIB_ATOMIC_ACQUIRE)
515 OSCoherencyBarrier();
516 else if (memorder & NLIB_ATOMIC_RELEASE)
518 *(
void*
volatile*)ptr = val;
520 OSCoherencyBarrier();
524 void* desired,
int weak,
525 int success_memorder,
526 int failure_memorder) {
528 weak, success_memorder, failure_memorder);
550 #define NLIB_FD_O_RDONLY (0x0000) 551 #define NLIB_FD_O_WRONLY (0x0001) 552 #define NLIB_FD_O_RDWR (0x0002) 553 #define NLIB_FD_O_APPEND (0x0008) 554 #define NLIB_FD_O_CREAT (0x0100) 555 #define NLIB_FD_O_TRUNC (0x0200) 556 #define NLIB_FD_O_EXCL (0x0400) 562 #define NLIB_NOEXCEPT 569 #define NLIB_MEMCPY(a, b, c) OSBlockMove((a), (b), (c), FALSE) 570 #define NLIB_MEMMOVE(a, b, c) OSBlockMove((a), (b), (c), FALSE) 571 #define NLIB_MEMSET(a, b, c) OSBlockSet((a), (b), (c)) 573 #ifndef NLIB_HAS_ZLIB 574 # define NLIB_HAS_ZLIB 577 #ifndef NLIB_HAS_LIBCURL 578 # define NLIB_HAS_LIBCURL 582 #endif // INCLUDE_NN_NLIB_PLATFORM_CAFE_H_