15af32e75SAxel Dörfler /* 25af32e75SAxel Dörfler ** Copyright 2003, Marcus Overhagen. All rights reserved. 35af32e75SAxel Dörfler ** Distributed under the terms of the Haiku License. 45af32e75SAxel Dörfler */ 55af32e75SAxel Dörfler 65af32e75SAxel Dörfler 75af32e75SAxel Dörfler #include <SupportDefs.h> 85af32e75SAxel Dörfler 95af32e75SAxel Dörfler #include <syscalls.h> 105af32e75SAxel Dörfler 115af32e75SAxel Dörfler 125af32e75SAxel Dörfler #ifdef ATOMIC_FUNCS_ARE_SYSCALLS 135af32e75SAxel Dörfler 1424f0b1e2SAlexander von Gluck IV void 1524f0b1e2SAlexander von Gluck IV atomic_set(int32 *value, int32 newValue) 165af32e75SAxel Dörfler { 1724f0b1e2SAlexander von Gluck IV _kern_atomic_set(value, newValue); 185af32e75SAxel Dörfler } 195af32e75SAxel Dörfler 2024f0b1e2SAlexander von Gluck IV 215af32e75SAxel Dörfler int32 22*8f4db360SIthamar R. Adema atomic_get_and_set(int32 *value, int32 newValue) 23*8f4db360SIthamar R. Adema { 24*8f4db360SIthamar R. Adema return _kern_atomic_get_and_set(value, newValue); 25*8f4db360SIthamar R. Adema } 26*8f4db360SIthamar R. Adema 27*8f4db360SIthamar R. Adema 28*8f4db360SIthamar R. Adema int32 2924f0b1e2SAlexander von Gluck IV atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst) 305af32e75SAxel Dörfler { 315af32e75SAxel Dörfler return _kern_atomic_test_and_set(value, newValue, testAgainst); 325af32e75SAxel Dörfler } 335af32e75SAxel Dörfler 3424f0b1e2SAlexander von Gluck IV 355af32e75SAxel Dörfler int32 3624f0b1e2SAlexander von Gluck IV atomic_add(int32 *value, int32 addValue) 375af32e75SAxel Dörfler { 385af32e75SAxel Dörfler return _kern_atomic_add(value, addValue); 395af32e75SAxel Dörfler } 405af32e75SAxel Dörfler 4124f0b1e2SAlexander von Gluck IV 425af32e75SAxel Dörfler int32 4324f0b1e2SAlexander von Gluck IV atomic_and(int32 *value, int32 andValue) 445af32e75SAxel Dörfler { 455af32e75SAxel Dörfler return _kern_atomic_and(value, andValue); 465af32e75SAxel Dörfler } 475af32e75SAxel Dörfler 4824f0b1e2SAlexander von Gluck IV 495af32e75SAxel Dörfler int32 5024f0b1e2SAlexander von Gluck IV atomic_or(int32 *value, int32 orValue) 515af32e75SAxel Dörfler { 525af32e75SAxel Dörfler return _kern_atomic_or(value, orValue); 535af32e75SAxel Dörfler } 545af32e75SAxel Dörfler 5524f0b1e2SAlexander von Gluck IV 565af32e75SAxel Dörfler int32 5724f0b1e2SAlexander von Gluck IV atomic_get(int32 *value) 585af32e75SAxel Dörfler { 595af32e75SAxel Dörfler return _kern_atomic_get(value); 605af32e75SAxel Dörfler } 615af32e75SAxel Dörfler 6224f0b1e2SAlexander von Gluck IV 635af32e75SAxel Dörfler #endif /* ATOMIC_FUNCS_ARE_SYSCALLS */ 645af32e75SAxel Dörfler 655af32e75SAxel Dörfler #ifdef ATOMIC64_FUNCS_ARE_SYSCALLS 665af32e75SAxel Dörfler 6724f0b1e2SAlexander von Gluck IV void 6824f0b1e2SAlexander von Gluck IV atomic_set64(int64 *value, int64 newValue) 695af32e75SAxel Dörfler { 7024f0b1e2SAlexander von Gluck IV _kern_atomic_set64(value, newValue); 715af32e75SAxel Dörfler } 725af32e75SAxel Dörfler 7324f0b1e2SAlexander von Gluck IV 745af32e75SAxel Dörfler int64 7524f0b1e2SAlexander von Gluck IV atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst) 765af32e75SAxel Dörfler { 775af32e75SAxel Dörfler return _kern_atomic_test_and_set64(value, newValue, testAgainst); 785af32e75SAxel Dörfler } 795af32e75SAxel Dörfler 8024f0b1e2SAlexander von Gluck IV 815af32e75SAxel Dörfler int64 8224f0b1e2SAlexander von Gluck IV atomic_add64(int64 *value, int64 addValue) 835af32e75SAxel Dörfler { 845af32e75SAxel Dörfler return _kern_atomic_add64(value, addValue); 855af32e75SAxel Dörfler } 865af32e75SAxel Dörfler 8724f0b1e2SAlexander von Gluck IV 885af32e75SAxel Dörfler int64 8924f0b1e2SAlexander von Gluck IV atomic_and64(int64 *value, int64 andValue) 905af32e75SAxel Dörfler { 915af32e75SAxel Dörfler return _kern_atomic_and64(value, andValue); 925af32e75SAxel Dörfler } 935af32e75SAxel Dörfler 9424f0b1e2SAlexander von Gluck IV 955af32e75SAxel Dörfler int64 9624f0b1e2SAlexander von Gluck IV atomic_or64(int64 *value, int64 orValue) 975af32e75SAxel Dörfler { 985af32e75SAxel Dörfler return _kern_atomic_or64(value, orValue); 995af32e75SAxel Dörfler } 1005af32e75SAxel Dörfler 10124f0b1e2SAlexander von Gluck IV 1025af32e75SAxel Dörfler int64 10324f0b1e2SAlexander von Gluck IV atomic_get64(int64 *value) 1045af32e75SAxel Dörfler { 1055af32e75SAxel Dörfler return _kern_atomic_get64(value); 1065af32e75SAxel Dörfler } 1075af32e75SAxel Dörfler 10824f0b1e2SAlexander von Gluck IV 1095af32e75SAxel Dörfler #endif /* ATOMIC64_FUNCS_ARE_SYSCALLS */ 11075453edcSFrançois Revol 111f9ab70a1SFrançois Revol #ifdef __ARM__ 112f9ab70a1SFrançois Revol 113c436d67dSFrançois Revol /* GCC compatibility: libstdc++ needs this one. 114c436d67dSFrançois Revol * TODO: Update libstdc++ and drop this. 115c436d67dSFrançois Revol * cf. http://fedoraproject.org/wiki/Architectures/ARM/GCCBuiltInAtomicOperations 116c436d67dSFrançois Revol */ 117f9ab70a1SFrançois Revol extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue); 11875453edcSFrançois Revol 11975453edcSFrançois Revol extern int32_t __sync_fetch_and_add_4(int32_t *value, int32_t addValue) 12075453edcSFrançois Revol { 12124f0b1e2SAlexander von Gluck IV return atomic_add((int32 *)value, addValue); 12275453edcSFrançois Revol } 123f9ab70a1SFrançois Revol 124f9ab70a1SFrançois Revol #endif 125