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 32 #define NLIB_HAS_STDHEADER_INTTYPES 43 # define NLIB_CAFE_PPC 45 #define NLIB_ALWAYS_INLINE inline __attribute__((always_inline)) 46 #define NLIB_NEVER_INLINE __attribute__((__noinline__)) 48 #define NLIB_LIKELY(x) __builtin_expect(!!(x), 1) 49 #define NLIB_UNLIKELY(x) __builtin_expect(!!(x), 0) 51 #define NLIB_LIKELY(x) (x) 52 #define NLIB_UNLIKELY(x) (x) 54 #define NLIB_EXPECT(var, exp_value) __builtin_expect((var), (exp_value)) 55 #define NLIB_CHECK_RESULT __attribute__((warn_unused_result)) 56 #define NLIB_NORETURN __attribute__((noreturn)) 57 #define NLIB_NONNULL __attribute__((nonnull)) 58 #define NLIB_NONNULL_1 __attribute__((nonnull (1))) 59 #define NLIB_NONNULL_2 __attribute__((nonnull (2))) 60 #define NLIB_NONNULL_3 __attribute__((nonnull (3))) 61 #define NLIB_NONNULL_4 __attribute__((nonnull (4))) 62 #define NLIB_NONNULL_5 __attribute__((nonnull (5))) 63 #define NLIB_NONNULL_ENABLED 64 #define NLIB_ATTRIBUTE_MALLOC __attribute__((malloc)) 65 #define NLIB_ATTRIBUTE_PURE __attribute__((pure)) 66 #define NLIB_ATTRIBUTE_CONST __attribute__((const)) 67 #define NLIB_ATTRIBUTE_ALLOC_SIZE1(n) 68 #define NLIB_ATTRIBUTE_ALLOC_SIZE2(n0, n1) 69 #define NLIB_ATTRIBUTE_ALLOC_ALIGN(algn) 70 #define NLIB_ATTRIBUTE_ASSUME_ALIGNED(n) 71 #ifndef NLIB_DEPRECATED 72 #define NLIB_DEPRECATED __attribute__((deprecated)) 74 #ifndef NLIB_DEPRECATED_MSG 75 #define NLIB_DEPRECATED_MSG(msg) __attribute__((deprecated)) 77 #define NLIB_VIS_HIDDEN 78 #define NLIB_VIS_PUBLIC 79 #define NLIB_WEAKSYMBOL __attribute__((weak)) 81 #define NLIB_MEMORY_ORDER_RELEASE __LWSYNC() 82 #define NLIB_MEMORY_ORDER_ACQUIRE __ISYNC() 83 #define NLIB_MEMORY_ORDER_ACQ_REL __LWSYNC(); __ISYNC() 84 #define NLIB_MEMORY_ORDER_SEQ_CST OSCoherencyBarrier() 92 #define NLIB_MUTEX_INITIALIZER {0} 93 #define NLIB_RECURSIVE_MUTEX_INITIALIZER {0} 94 #define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER {0} 101 #define NLIB_COND_INITIALIZER {0} 103 void MyNoreturn_(
void) __attribute__((noreturn));
104 #define NLIB_ASSUME(cond) switch (0) case 0: default: if (cond) ; else MyNoreturn_() 106 #define NLIB_ATOMIC_RELAXED (0) 107 #define NLIB_ATOMIC_ACQUIRE (1) 108 #define NLIB_ATOMIC_RELEASE (2) 109 #define NLIB_ATOMIC_ACQ_REL (3) 110 #define NLIB_ATOMIC_SEQ_CST (7) 113 int32_t rval = *(
volatile int32_t*)ptr;
122 OSCoherencyBarrier();
125 *(
volatile int32_t*)ptr = val;
127 OSCoherencyBarrier();
134 OSCoherencyBarrier();
135 else if (memorder & NLIB_ATOMIC_RELEASE)
137 x = OSSwapAtomic((
volatile OSAtomicVar*)ptr, (uint32_t)val);
148 int32_t desired,
int weak,
149 int success_memorder,
150 int failure_memorder) {
152 OSCoherencyBarrier();
153 else if (success_memorder & NLIB_ATOMIC_RELEASE)
156 BOOL result = OSCompareAndSwapAtomicEx(
157 (
volatile OSAtomicVar*)ptr,
162 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
165 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
171 orig_val = (u32)__LWARX((u32*)ptr, 0);
172 if (orig_val == *expected) {
173 __DCBST(0, (u32)ptr);
174 if (__STWCX((u32*)ptr, 0, (u32)desired)) {
175 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
179 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
183 *expected = (int32_t)orig_val;
184 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
195 OSCoherencyBarrier();
196 else if (memorder & NLIB_ATOMIC_RELEASE)
198 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
199 if (memorder & NLIB_ATOMIC_ACQUIRE)
208 OSCoherencyBarrier();
209 else if (memorder & NLIB_ATOMIC_RELEASE)
211 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
212 if (memorder & NLIB_ATOMIC_ACQUIRE)
221 OSCoherencyBarrier();
222 else if (memorder & NLIB_ATOMIC_RELEASE)
224 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
225 if (memorder & NLIB_ATOMIC_ACQUIRE)
234 OSCoherencyBarrier();
235 else if (memorder & NLIB_ATOMIC_RELEASE)
237 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
238 if (memorder & NLIB_ATOMIC_ACQUIRE)
247 OSCoherencyBarrier();
248 else if (memorder & NLIB_ATOMIC_RELEASE)
250 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
251 if (memorder & NLIB_ATOMIC_ACQUIRE)
260 OSCoherencyBarrier();
261 else if (memorder & NLIB_ATOMIC_RELEASE)
263 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, val);
264 if (memorder & NLIB_ATOMIC_ACQUIRE)
273 OSCoherencyBarrier();
274 else if (memorder & NLIB_ATOMIC_RELEASE)
276 x = OSAddAtomic((
volatile OSAtomicVar*)ptr, -val);
277 if (memorder & NLIB_ATOMIC_ACQUIRE)
286 OSCoherencyBarrier();
287 else if (memorder & NLIB_ATOMIC_RELEASE)
289 x = OSAndAtomic((
volatile OSAtomicVar*)ptr, val);
290 if (memorder & NLIB_ATOMIC_ACQUIRE)
299 OSCoherencyBarrier();
300 else if (memorder & NLIB_ATOMIC_RELEASE)
302 x = OSXorAtomic((
volatile OSAtomicVar*)ptr, val);
303 if (memorder & NLIB_ATOMIC_ACQUIRE)
312 OSCoherencyBarrier();
313 else if (memorder & NLIB_ATOMIC_RELEASE)
315 x = OSOrAtomic((
volatile OSAtomicVar*)ptr, val);
316 if (memorder & NLIB_ATOMIC_ACQUIRE)
322 int64_t rval = (int64_t)OSGetAtomic64((
volatile OSAtomicVar64*)ptr);
323 if (memorder & NLIB_ATOMIC_ACQUIRE)
331 OSCoherencyBarrier();
332 else if (memorder & NLIB_ATOMIC_RELEASE)
334 OSSetAtomic64((
volatile OSAtomicVar64*)ptr, (u64)val);
336 OSCoherencyBarrier();
343 OSCoherencyBarrier();
344 else if (memorder & NLIB_ATOMIC_RELEASE)
346 x = OSSwapAtomic64((
volatile OSAtomicVar64*)ptr, (uint64_t)val);
347 if (memorder & NLIB_ATOMIC_ACQUIRE)
353 int64_t desired,
int weak,
354 int success_memorder,
355 int failure_memorder) {
359 OSCoherencyBarrier();
360 else if (success_memorder & NLIB_ATOMIC_RELEASE)
363 result = OSCompareAndSwapAtomicEx64(
364 (
volatile OSAtomicVar64*)ptr,
369 if (success_memorder & NLIB_ATOMIC_ACQUIRE)
372 if (failure_memorder & NLIB_ATOMIC_ACQUIRE)
382 OSCoherencyBarrier();
383 else if (memorder & NLIB_ATOMIC_RELEASE)
385 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
386 if (memorder & NLIB_ATOMIC_ACQUIRE)
395 OSCoherencyBarrier();
396 else if (memorder & NLIB_ATOMIC_RELEASE)
398 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
399 if (memorder & NLIB_ATOMIC_ACQUIRE)
408 OSCoherencyBarrier();
409 else if (memorder & NLIB_ATOMIC_RELEASE)
411 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
412 if (memorder & NLIB_ATOMIC_ACQUIRE)
421 OSCoherencyBarrier();
422 else if (memorder & NLIB_ATOMIC_RELEASE)
424 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
425 if (memorder & NLIB_ATOMIC_ACQUIRE)
434 OSCoherencyBarrier();
435 else if (memorder & NLIB_ATOMIC_RELEASE)
437 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
438 if (memorder & NLIB_ATOMIC_ACQUIRE)
447 OSCoherencyBarrier();
448 else if (memorder & NLIB_ATOMIC_RELEASE)
450 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, val);
451 if (memorder & NLIB_ATOMIC_ACQUIRE)
460 OSCoherencyBarrier();
461 else if (memorder & NLIB_ATOMIC_RELEASE)
463 x = OSAddAtomic64((
volatile OSAtomicVar64*)ptr, -val);
464 if (memorder & NLIB_ATOMIC_ACQUIRE)
473 OSCoherencyBarrier();
474 else if (memorder & NLIB_ATOMIC_RELEASE)
476 x = OSAndAtomic64((
volatile OSAtomicVar64*)ptr, val);
477 if (memorder & NLIB_ATOMIC_ACQUIRE)
486 OSCoherencyBarrier();
487 else if (memorder & NLIB_ATOMIC_RELEASE)
489 x = OSXorAtomic64((
volatile OSAtomicVar64*)ptr, val);
490 if (memorder & NLIB_ATOMIC_ACQUIRE)
499 OSCoherencyBarrier();
500 else if (memorder & NLIB_ATOMIC_RELEASE)
502 x = OSOrAtomic64((
volatile OSAtomicVar64*)ptr, val);
503 if (memorder & NLIB_ATOMIC_ACQUIRE)
509 void* rval = *(
void*
volatile*)ptr;
510 if (memorder & NLIB_ATOMIC_ACQUIRE)
517 OSCoherencyBarrier();
518 else if (memorder & NLIB_ATOMIC_RELEASE)
520 *(
void*
volatile*)ptr = val;
522 OSCoherencyBarrier();
526 void* desired,
int weak,
527 int success_memorder,
528 int failure_memorder) {
530 weak, success_memorder, failure_memorder);
537 case NLIB_ATOMIC_ACQUIRE:
540 case NLIB_ATOMIC_RELEASE:
552 #define NLIB_FD_O_RDONLY (0x0000) 553 #define NLIB_FD_O_WRONLY (0x0001) 554 #define NLIB_FD_O_RDWR (0x0002) 555 #define NLIB_FD_O_APPEND (0x0008) 556 #define NLIB_FD_O_CREAT (0x0100) 557 #define NLIB_FD_O_TRUNC (0x0200) 558 #define NLIB_FD_O_EXCL (0x0400) 564 #define NLIB_NOEXCEPT 571 #define NLIB_MEMCPY(a, b, c) OSBlockMove((a), (b), (c), FALSE) 572 #define NLIB_MEMMOVE(a, b, c) OSBlockMove((a), (b), (c), FALSE) 573 #define NLIB_MEMSET(a, b, c) OSBlockSet((a), (b), (c)) 575 #ifndef NLIB_HAS_ZLIB 576 # define NLIB_HAS_ZLIB 579 #ifndef NLIB_HAS_LIBCURL 580 # define NLIB_HAS_LIBCURL 584 #endif // INCLUDE_NN_NLIB_PLATFORM_CAFE_H_