X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/b0d623f7f2ae71ed96e60569f61f9a9a27016e80..04b8595b18b1b41ac7a206e4b3d51a635f8413d7:/libkern/gen/OSAtomicOperations.c?ds=sidebyside diff --git a/libkern/gen/OSAtomicOperations.c b/libkern/gen/OSAtomicOperations.c index aeeb09364..25ff477ff 100644 --- a/libkern/gen/OSAtomicOperations.c +++ b/libkern/gen/OSAtomicOperations.c @@ -54,51 +54,11 @@ enum { * Like standards, there are a lot of atomic ops to choose from! */ -#if !defined(__ppc__) && !defined(__i386__) && !defined(__x86_64__) -/* Implemented in assembly for ppc and i386 and x86_64 */ -#undef OSAddAtomic -SInt32 -OSAddAtomic(SInt32 amount, volatile SInt32 * value) -{ - SInt32 oldValue; - SInt32 newValue; - - do { - oldValue = *value; - newValue = oldValue + amount; - } while (!OSCompareAndSwap((UInt32)oldValue, - (UInt32)newValue, - (volatile UInt32 *) value)); - return oldValue; -} - -long -OSAddAtomicLong(long theAmount, volatile long *address) -{ -#if __LP64__ -#error Unimplemented +#if defined(__i386__) || defined(__x86_64__) +/* Implemented in assembly for i386 and x86_64 */ #else - return (long)OSAddAtomic((SInt32)theAmount, address); +#error Unsupported arch #endif -} - -/* Implemented as an assembly alias for i386 and linker alias for ppc */ -#undef OSCompareAndSwapPtr -Boolean OSCompareAndSwapPtr(void *oldValue, void *newValue, - void * volatile *address) -{ -#if __LP64__ - return OSCompareAndSwap64((UInt64)oldValue, (UInt64)newValue, - (volatile UInt64 *)address); -#else - return OSCompareAndSwap((UInt32)oldValue, (UInt32)newValue, - (volatile UInt32 *)address); -#endif -} -#endif - -#ifndef __ppc__ -/* Implemented as assembly for ppc */ #undef OSIncrementAtomic SInt32 OSIncrementAtomic(volatile SInt32 * value) @@ -111,7 +71,6 @@ SInt32 OSDecrementAtomic(volatile SInt32 * value) { return OSAddAtomic(-1, value); } -#endif /* !__ppc__ */ static UInt32 OSBitwiseAtomic(UInt32 and_mask, UInt32 or_mask, UInt32 xor_mask, volatile UInt32 * value) { @@ -144,6 +103,7 @@ UInt32 OSBitXorAtomic(UInt32 mask, volatile UInt32 * value) return OSBitwiseAtomic((UInt32) -1, 0, mask, value); } +#if defined(__i386__) || defined(__x86_64__) static Boolean OSCompareAndSwap8(UInt8 oldValue8, UInt8 newValue8, volatile UInt8 * value8) { UInt32 mask = 0x000000ff; @@ -162,6 +122,7 @@ static Boolean OSCompareAndSwap8(UInt8 oldValue8, UInt8 newValue8, volatile UInt return OSCompareAndSwap(oldValue, newValue, value32); } +#endif static Boolean OSTestAndSetClear(UInt32 bit, Boolean wantSet, volatile UInt8 * startAddress) { @@ -207,6 +168,7 @@ SInt8 OSDecrementAtomic8(volatile SInt8 * value) return OSAddAtomic8(-1, value); } +#if defined(__i386__) || defined(__x86_64__) SInt8 OSAddAtomic8(SInt32 amount, volatile SInt8 * value) { SInt8 oldValue; @@ -219,6 +181,7 @@ SInt8 OSAddAtomic8(SInt32 amount, volatile SInt8 * value) return oldValue; } +#endif static UInt8 OSBitwiseAtomic8(UInt32 and_mask, UInt32 or_mask, UInt32 xor_mask, volatile UInt8 * value) { @@ -248,6 +211,7 @@ UInt8 OSBitXorAtomic8(UInt32 mask, volatile UInt8 * value) return OSBitwiseAtomic8((UInt32) -1, 0, mask, value); } +#if defined(__i386__) || defined(__x86_64__) static Boolean OSCompareAndSwap16(UInt16 oldValue16, UInt16 newValue16, volatile UInt16 * value16) { UInt32 mask = 0x0000ffff; @@ -266,6 +230,7 @@ static Boolean OSCompareAndSwap16(UInt16 oldValue16, UInt16 newValue16, volatile return OSCompareAndSwap(oldValue, newValue, value32); } +#endif SInt16 OSIncrementAtomic16(volatile SInt16 * value) { @@ -277,6 +242,7 @@ SInt16 OSDecrementAtomic16(volatile SInt16 * value) return OSAddAtomic16(-1, value); } +#if defined(__i386__) || defined(__x86_64__) SInt16 OSAddAtomic16(SInt32 amount, volatile SInt16 * value) { SInt16 oldValue; @@ -289,6 +255,7 @@ SInt16 OSAddAtomic16(SInt32 amount, volatile SInt16 * value) return oldValue; } +#endif static UInt16 OSBitwiseAtomic16(UInt32 and_mask, UInt32 or_mask, UInt32 xor_mask, volatile UInt16 * value) {