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_FALLTHROUGH 56 #define NLIB_NONNULL __attribute__((nonnull)) 57 #define NLIB_NONNULL_1 __attribute__((nonnull (1))) 58 #define NLIB_NONNULL_2 __attribute__((nonnull (2))) 59 #define NLIB_NONNULL_3 __attribute__((nonnull (3))) 60 #define NLIB_NONNULL_4 __attribute__((nonnull (4))) 61 #define NLIB_NONNULL_5 __attribute__((nonnull (5))) 62 #define NLIB_NONNULL_ENABLED 63 #define NLIB_ATTRIBUTE_MALLOC __attribute__((malloc)) 64 #define NLIB_ATTRIBUTE_PURE __attribute__((pure)) 65 #define NLIB_ATTRIBUTE_CONST __attribute__((const)) 66 #define NLIB_ATTRIBUTE_ALLOC_SIZE1(n) 67 #define NLIB_ATTRIBUTE_ALLOC_SIZE2(n0, n1) 68 #define NLIB_ATTRIBUTE_ALLOC_ALIGN(algn) 69 #define NLIB_ATTRIBUTE_ASSUME_ALIGNED(n) 70 #ifndef NLIB_DEPRECATED 71 #define NLIB_DEPRECATED __attribute__((deprecated)) 73 #ifndef NLIB_DEPRECATED_MSG 74 #define NLIB_DEPRECATED_MSG(msg) __attribute__((deprecated)) 76 #define NLIB_VIS_HIDDEN 77 #define NLIB_VIS_PUBLIC 78 #define NLIB_WEAKSYMBOL __attribute__((weak)) 80 #define NLIB_MEMORY_ORDER_RELEASE __LWSYNC() 81 #define NLIB_MEMORY_ORDER_ACQUIRE __ISYNC() 82 #define NLIB_MEMORY_ORDER_ACQ_REL __LWSYNC(); __ISYNC() 83 #define NLIB_MEMORY_ORDER_SEQ_CST OSCoherencyBarrier() 91 #define NLIB_MUTEX_INITIALIZER {0} 92 #define NLIB_RECURSIVE_MUTEX_INITIALIZER {0} 93 #define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER {0} 100 #define NLIB_COND_INITIALIZER {0} 102 void MyNoreturn_(
void) __attribute__((noreturn));
103 #define NLIB_ASSUME(cond) switch (0) case 0: default: if (cond) ; else MyNoreturn_() 105 #define NLIB_ATOMIC_RELAXED (0) 106 #define NLIB_ATOMIC_ACQUIRE (1) 107 #define NLIB_ATOMIC_RELEASE (2) 108 #define NLIB_ATOMIC_ACQ_REL (3) 109 #define NLIB_ATOMIC_SEQ_CST (7) 112 int32_t rval = *(
volatile int32_t*)ptr;
121 OSCoherencyBarrier();
124 *(
volatile int32_t*)ptr = val;
126 OSCoherencyBarrier();
133 OSCoherencyBarrier();
134 else if (memorder & NLIB_ATOMIC_RELEASE)
136 x = OSSwapAtomic((
volatile OSAtomicVar*)ptr, (uint32_t)val);
147 int32_t desired,
int weak,
148 int success_memorder,
149 int failure_memorder) {
151 OSCoherencyBarrier();
152 else if (success_memorder & NLIB_ATOMIC_RELEASE)
155 BOOL result = OSCompareAndSwapAtomicEx(
156 (
volatile OSAtomicVar*)ptr,
161 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
164 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
170 orig_val = (u32)__LWARX((u32*)ptr, 0);
171 if (orig_val == *expected) {
172 __DCBST(0, (u32)ptr);
173 if (__STWCX((u32*)ptr, 0, (u32)desired)) {
174 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
178 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
182 *expected = (int32_t)orig_val;
183 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
194 OSCoherencyBarrier();
195 else if (memorder & NLIB_ATOMIC_RELEASE)
197 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
198 if (memorder & NLIB_ATOMIC_ACQUIRE)
207 OSCoherencyBarrier();
208 else if (memorder & NLIB_ATOMIC_RELEASE)
210 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
211 if (memorder & NLIB_ATOMIC_ACQUIRE)
220 OSCoherencyBarrier();
221 else if (memorder & NLIB_ATOMIC_RELEASE)
223 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
224 if (memorder & NLIB_ATOMIC_ACQUIRE)
233 OSCoherencyBarrier();
234 else if (memorder & NLIB_ATOMIC_RELEASE)
236 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
237 if (memorder & NLIB_ATOMIC_ACQUIRE)
246 OSCoherencyBarrier();
247 else if (memorder & NLIB_ATOMIC_RELEASE)
249 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
250 if (memorder & NLIB_ATOMIC_ACQUIRE)
259 OSCoherencyBarrier();
260 else if (memorder & NLIB_ATOMIC_RELEASE)
262 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
263 if (memorder & NLIB_ATOMIC_ACQUIRE)
272 OSCoherencyBarrier();
273 else if (memorder & NLIB_ATOMIC_RELEASE)
275 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
276 if (memorder & NLIB_ATOMIC_ACQUIRE)
285 OSCoherencyBarrier();
286 else if (memorder & NLIB_ATOMIC_RELEASE)
288 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
289 if (memorder & NLIB_ATOMIC_ACQUIRE)
298 OSCoherencyBarrier();
299 else if (memorder & NLIB_ATOMIC_RELEASE)
301 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
302 if (memorder & NLIB_ATOMIC_ACQUIRE)
311 OSCoherencyBarrier();
312 else if (memorder & NLIB_ATOMIC_RELEASE)
314 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
315 if (memorder & NLIB_ATOMIC_ACQUIRE)
321 int64_t rval = (int64_t)OSGetAtomic64((
volatile OSAtomicVar64*)ptr);
322 if (memorder & NLIB_ATOMIC_ACQUIRE)
330 OSCoherencyBarrier();
331 else if (memorder & NLIB_ATOMIC_RELEASE)
333 OSSetAtomic64((
volatile OSAtomicVar64*)ptr, (u64)val);
335 OSCoherencyBarrier();
342 OSCoherencyBarrier();
343 else if (memorder & NLIB_ATOMIC_RELEASE)
345 x = OSSwapAtomic64((
volatile OSAtomicVar64*)ptr, (uint64_t)val);
346 if (memorder & NLIB_ATOMIC_ACQUIRE)
352 int64_t desired,
int weak,
353 int success_memorder,
354 int failure_memorder) {
358 OSCoherencyBarrier();
359 else if (success_memorder & NLIB_ATOMIC_RELEASE)
362 result = OSCompareAndSwapAtomicEx64(
363 (
volatile OSAtomicVar64*)ptr,
368 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
371 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
381 OSCoherencyBarrier();
382 else if (memorder & NLIB_ATOMIC_RELEASE)
384 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
385 if (memorder & NLIB_ATOMIC_ACQUIRE)
394 OSCoherencyBarrier();
395 else if (memorder & NLIB_ATOMIC_RELEASE)
397 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
398 if (memorder & NLIB_ATOMIC_ACQUIRE)
407 OSCoherencyBarrier();
408 else if (memorder & NLIB_ATOMIC_RELEASE)
410 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
411 if (memorder & NLIB_ATOMIC_ACQUIRE)
420 OSCoherencyBarrier();
421 else if (memorder & NLIB_ATOMIC_RELEASE)
423 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
424 if (memorder & NLIB_ATOMIC_ACQUIRE)
433 OSCoherencyBarrier();
434 else if (memorder & NLIB_ATOMIC_RELEASE)
436 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
437 if (memorder & NLIB_ATOMIC_ACQUIRE)
446 OSCoherencyBarrier();
447 else if (memorder & NLIB_ATOMIC_RELEASE)
449 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
450 if (memorder & NLIB_ATOMIC_ACQUIRE)
459 OSCoherencyBarrier();
460 else if (memorder & NLIB_ATOMIC_RELEASE)
462 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
463 if (memorder & NLIB_ATOMIC_ACQUIRE)
472 OSCoherencyBarrier();
473 else if (memorder & NLIB_ATOMIC_RELEASE)
475 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
476 if (memorder & NLIB_ATOMIC_ACQUIRE)
485 OSCoherencyBarrier();
486 else if (memorder & NLIB_ATOMIC_RELEASE)
488 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
489 if (memorder & NLIB_ATOMIC_ACQUIRE)
498 OSCoherencyBarrier();
499 else if (memorder & NLIB_ATOMIC_RELEASE)
501 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
502 if (memorder & NLIB_ATOMIC_ACQUIRE)
508 void* rval = *(
void*
volatile*)ptr;
509 if (memorder & NLIB_ATOMIC_ACQUIRE)
516 OSCoherencyBarrier();
517 else if (memorder & NLIB_ATOMIC_RELEASE)
519 *(
void*
volatile*)ptr = val;
521 OSCoherencyBarrier();
525 void* desired,
int weak,
526 int success_memorder,
527 int failure_memorder) {
529 weak, success_memorder, failure_memorder);
551 #define NLIB_FD_O_RDONLY (0x0000) 552 #define NLIB_FD_O_WRONLY (0x0001) 553 #define NLIB_FD_O_RDWR (0x0002) 554 #define NLIB_FD_O_APPEND (0x0008) 555 #define NLIB_FD_O_CREAT (0x0100) 556 #define NLIB_FD_O_TRUNC (0x0200) 557 #define NLIB_FD_O_EXCL (0x0400) 563 #define NLIB_NOEXCEPT 570 #define NLIB_MEMCPY(a, b, c) OSBlockMove((a), (b), (c), FALSE) 571 #define NLIB_MEMMOVE(a, b, c) OSBlockMove((a), (b), (c), FALSE) 572 #define NLIB_MEMSET(a, b, c) OSBlockSet((a), (b), (c)) 574 #ifndef NLIB_HAS_ZLIB 575 # define NLIB_HAS_ZLIB 578 #ifndef NLIB_HAS_LIBCURL 579 # define NLIB_HAS_LIBCURL 583 #endif // INCLUDE_NN_NLIB_PLATFORM_CAFE_H_