mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 11:26:12 +08:00
libc/arch_atomic: add FAR to pointers.
Signed-off-by: wangbowen6 <wangbowen6@xiaomi.com>
This commit is contained in:
@@ -34,59 +34,60 @@
|
|||||||
|
|
||||||
#define STORE(n, type) \
|
#define STORE(n, type) \
|
||||||
\
|
\
|
||||||
void __atomic_store_ ## n (volatile void *ptr, \
|
void __atomic_store_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
\
|
\
|
||||||
*(type *)ptr = value; \
|
*(FAR type *)ptr = value; \
|
||||||
\
|
\
|
||||||
spin_unlock_irqrestore(NULL, irqstate); \
|
spin_unlock_irqrestore(NULL, irqstate); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LOAD(n, type) \
|
#define LOAD(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_load_ ## n (const volatile void *ptr, \
|
type __atomic_load_ ## n (FAR const volatile void *ptr, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
\
|
\
|
||||||
type ret = *(type *)ptr; \
|
type ret = *(FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
spin_unlock_irqrestore(NULL, irqstate); \
|
spin_unlock_irqrestore(NULL, irqstate); \
|
||||||
return ret; \
|
return ret; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXCHANGE(n, type) \
|
#define EXCHANGE(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_exchange_ ## n (volatile void *ptr, \
|
type __atomic_exchange_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
*tmp = value; \
|
*tmp = value; \
|
||||||
\
|
\
|
||||||
spin_unlock_irqrestore(NULL, irqstate); \
|
spin_unlock_irqrestore(NULL, irqstate); \
|
||||||
return ret; \
|
return ret; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CMP_EXCHANGE(n, type) \
|
#define CMP_EXCHANGE(n, type) \
|
||||||
\
|
\
|
||||||
bool __atomic_compare_exchange_ ## n (volatile void *mem,\
|
bool __atomic_compare_exchange_ ## n ( \
|
||||||
void *expect, \
|
FAR volatile void *mem, \
|
||||||
type desired, \
|
FAR void *expect, \
|
||||||
bool weak, \
|
type desired, \
|
||||||
int success, \
|
bool weak, \
|
||||||
int failure) \
|
int success, \
|
||||||
|
int failure) \
|
||||||
{ \
|
{ \
|
||||||
bool ret = false; \
|
bool ret = false; \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmpmem = (type *)mem; \
|
FAR type *tmpmem = (FAR type *)mem; \
|
||||||
type *tmpexp = (type *)expect; \
|
FAR type *tmpexp = (FAR type *)expect; \
|
||||||
\
|
\
|
||||||
if (*tmpmem == *tmpexp) \
|
if (*tmpmem == *tmpexp) \
|
||||||
{ \
|
{ \
|
||||||
@@ -99,17 +100,17 @@
|
|||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
spin_unlock_irqrestore(NULL, irqstate); \
|
spin_unlock_irqrestore(NULL, irqstate); \
|
||||||
return ret; \
|
return ret; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FETCH_ADD(n, type) \
|
#define FETCH_ADD(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_fetch_add_ ## n (volatile void *ptr, \
|
type __atomic_fetch_add_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp + value; \
|
*tmp = *tmp + value; \
|
||||||
@@ -120,12 +121,12 @@
|
|||||||
|
|
||||||
#define FETCH_SUB(n, type) \
|
#define FETCH_SUB(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_fetch_sub_ ## n (volatile void *ptr, \
|
type __atomic_fetch_sub_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp - value; \
|
*tmp = *tmp - value; \
|
||||||
@@ -136,12 +137,12 @@
|
|||||||
|
|
||||||
#define FETCH_AND(n, type) \
|
#define FETCH_AND(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_fetch_and_ ## n (volatile void *ptr, \
|
type __atomic_fetch_and_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp & value; \
|
*tmp = *tmp & value; \
|
||||||
@@ -152,12 +153,12 @@
|
|||||||
|
|
||||||
#define FETCH_OR(n, type) \
|
#define FETCH_OR(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_fetch_or_ ## n (volatile void *ptr, \
|
type __atomic_fetch_or_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp | value; \
|
*tmp = *tmp | value; \
|
||||||
@@ -168,12 +169,12 @@
|
|||||||
|
|
||||||
#define FETCH_XOR(n, type) \
|
#define FETCH_XOR(n, type) \
|
||||||
\
|
\
|
||||||
type __atomic_fetch_xor_ ## n (volatile void *ptr, \
|
type __atomic_fetch_xor_ ## n (FAR volatile void *ptr, \
|
||||||
type value, \
|
type value, \
|
||||||
int memorder) \
|
int memorder) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp ^ value; \
|
*tmp = *tmp ^ value; \
|
||||||
@@ -184,11 +185,12 @@
|
|||||||
|
|
||||||
#define SYNC_ADD_FETCH(n, type) \
|
#define SYNC_ADD_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_add_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_add_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp + value; \
|
*tmp = *tmp + value; \
|
||||||
\
|
\
|
||||||
@@ -198,11 +200,12 @@
|
|||||||
|
|
||||||
#define SYNC_SUB_FETCH(n, type) \
|
#define SYNC_SUB_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_sub_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_sub_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp - value; \
|
*tmp = *tmp - value; \
|
||||||
\
|
\
|
||||||
@@ -212,11 +215,12 @@
|
|||||||
|
|
||||||
#define SYNC_OR_FETCH(n, type) \
|
#define SYNC_OR_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_or_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_or_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp | value; \
|
*tmp = *tmp | value; \
|
||||||
\
|
\
|
||||||
@@ -226,11 +230,12 @@
|
|||||||
|
|
||||||
#define SYNC_AND_FETCH(n, type) \
|
#define SYNC_AND_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_and_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_and_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp & value; \
|
*tmp = *tmp & value; \
|
||||||
\
|
\
|
||||||
@@ -240,11 +245,12 @@
|
|||||||
|
|
||||||
#define SYNC_XOR_FETCH(n, type) \
|
#define SYNC_XOR_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_xor_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_xor_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = *tmp ^ value; \
|
*tmp = *tmp ^ value; \
|
||||||
\
|
\
|
||||||
@@ -254,11 +260,12 @@
|
|||||||
|
|
||||||
#define SYNC_NAND_FETCH(n, type) \
|
#define SYNC_NAND_FETCH(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_nand_and_fetch_ ## n (volatile void *ptr, \
|
type __sync_nand_and_fetch_ ## n ( \
|
||||||
type value) \
|
FAR volatile void *ptr, \
|
||||||
|
type value) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
*tmp = ~(*tmp & value); \
|
*tmp = ~(*tmp & value); \
|
||||||
\
|
\
|
||||||
@@ -269,13 +276,13 @@
|
|||||||
#define SYNC_BOOL_CMP_SWAP(n, type) \
|
#define SYNC_BOOL_CMP_SWAP(n, type) \
|
||||||
\
|
\
|
||||||
bool __sync_bool_compare_and_swap_ ## n ( \
|
bool __sync_bool_compare_and_swap_ ## n ( \
|
||||||
volatile void *ptr, \
|
FAR volatile void *ptr, \
|
||||||
type oldvalue, \
|
type oldvalue, \
|
||||||
type newvalue) \
|
type newvalue) \
|
||||||
{ \
|
{ \
|
||||||
bool ret = false; \
|
bool ret = false; \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
\
|
\
|
||||||
if (*tmp == oldvalue) \
|
if (*tmp == oldvalue) \
|
||||||
{ \
|
{ \
|
||||||
@@ -290,12 +297,12 @@
|
|||||||
#define SYNC_VAL_CMP_SWAP(n, type) \
|
#define SYNC_VAL_CMP_SWAP(n, type) \
|
||||||
\
|
\
|
||||||
type __sync_val_compare_and_swap_ ## n ( \
|
type __sync_val_compare_and_swap_ ## n ( \
|
||||||
volatile void *ptr, \
|
FAR volatile void *ptr, \
|
||||||
type oldvalue, \
|
type oldvalue, \
|
||||||
type newvalue) \
|
type newvalue) \
|
||||||
{ \
|
{ \
|
||||||
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
irqstate_t irqstate = spin_lock_irqsave(NULL); \
|
||||||
type *tmp = (type *)ptr; \
|
FAR type *tmp = (FAR type *)ptr; \
|
||||||
type ret = *tmp; \
|
type ret = *tmp; \
|
||||||
\
|
\
|
||||||
if (*tmp == oldvalue) \
|
if (*tmp == oldvalue) \
|
||||||
|
|||||||
Reference in New Issue
Block a user