arm/atomic: round of atomic function changes

* change vint{32,64} to int{32,64} in:
  * kernel implementation
  * syscall definitions
  * libroot prototypes
* update syscall functions with new atomic prototypes.
This commit is contained in:
Ithamar R. Adema 2014-02-15 11:36:17 +01:00
parent f5e19a38de
commit 8f4db360bc
6 changed files with 121 additions and 57 deletions

View File

@ -13,19 +13,21 @@
extern "C" {
#endif
int32 _user_atomic_set(vint32 *value, int32 newValue);
int32 _user_atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst);
int32 _user_atomic_add(vint32 *value, int32 addValue);
int32 _user_atomic_and(vint32 *value, int32 andValue);
int32 _user_atomic_or(vint32 *value, int32 orValue);
int32 _user_atomic_get(vint32 *value);
void _user_atomic_set(int32 *value, int32 newValue);
int32 _user_atomic_get_and_set(int32 *value, int32 newValue);
int32 _user_atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst);
int32 _user_atomic_add(int32 *value, int32 addValue);
int32 _user_atomic_and(int32 *value, int32 andValue);
int32 _user_atomic_or(int32 *value, int32 orValue);
int32 _user_atomic_get(int32 *value);
int64 _user_atomic_set64(vint64 *value, int64 newValue);
int64 _user_atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst);
int64 _user_atomic_add64(vint64 *value, int64 addValue);
int64 _user_atomic_and64(vint64 *value, int64 andValue);
int64 _user_atomic_or64(vint64 *value, int64 orValue);
int64 _user_atomic_get64(vint64 *value);
void _user_atomic_set64(int64 *value, int64 newValue);
int64 _user_atomic_get_and_set64(int64 *value, int64 newValue);
int64 _user_atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst);
int64 _user_atomic_add64(int64 *value, int64 addValue);
int64 _user_atomic_and64(int64 *value, int64 andValue);
int64 _user_atomic_or64(int64 *value, int64 orValue);
int64 _user_atomic_get64(int64 *value);
#ifdef __cplusplus
}

View File

@ -494,23 +494,25 @@ extern status_t _kern_system_profiler_recorded(
/* atomic_* ops (needed for CPUs that don't support them directly) */
#ifdef ATOMIC_FUNCS_ARE_SYSCALLS
extern int32 _kern_atomic_set(vint32 *value, int32 newValue);
extern int32 _kern_atomic_test_and_set(vint32 *value, int32 newValue,
extern void _kern_atomic_set(int32 *value, int32 newValue);
extern int32 _kern_atomic_get_and_set(int32 *value, int32 newValue);
extern int32 _kern_atomic_test_and_set(int32 *value, int32 newValue,
int32 testAgainst);
extern int32 _kern_atomic_add(vint32 *value, int32 addValue);
extern int32 _kern_atomic_and(vint32 *value, int32 andValue);
extern int32 _kern_atomic_or(vint32 *value, int32 orValue);
extern int32 _kern_atomic_get(vint32 *value);
extern int32 _kern_atomic_add(int32 *value, int32 addValue);
extern int32 _kern_atomic_and(int32 *value, int32 andValue);
extern int32 _kern_atomic_or(int32 *value, int32 orValue);
extern int32 _kern_atomic_get(int32 *value);
#endif // ATOMIC_FUNCS_ARE_SYSCALLS
#ifdef ATOMIC64_FUNCS_ARE_SYSCALLS
extern int64 _kern_atomic_set64(vint64 *value, int64 newValue);
extern int64 _kern_atomic_test_and_set64(vint64 *value, int64 newValue,
extern void _kern_atomic_set64(int64 *value, int64 newValue);
extern int64 _kern_atomic_get_and_set64(int64 *value, int64 newValue);
extern int64 _kern_atomic_test_and_set64(int64 *value, int64 newValue,
int64 testAgainst);
extern int64 _kern_atomic_add64(vint64 *value, int64 addValue);
extern int64 _kern_atomic_and64(vint64 *value, int64 andValue);
extern int64 _kern_atomic_or64(vint64 *value, int64 orValue);
extern int64 _kern_atomic_get64(vint64 *value);
extern int64 _kern_atomic_add64(int64 *value, int64 addValue);
extern int64 _kern_atomic_and64(int64 *value, int64 andValue);
extern int64 _kern_atomic_or64(int64 *value, int64 orValue);
extern int64 _kern_atomic_get64(int64 *value);
#endif // ATOMIC64_FUNCS_ARE_SYSCALLS
/* System informations */

View File

@ -24,18 +24,24 @@
* this is an acceptable compromise.
*/
int32
atomic_set(vint32 *value, int32 newValue)
void
atomic_set(int32 *value, int32 newValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
*value = newValue;
}
int32
atomic_get_and_set(int32 *value, int32 newValue)
{
InterruptsLocker locker;
int32 oldValue = *value;
atomic_set(value, newValue);
return oldValue;
}
int32
atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst)
atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst)
{
InterruptsLocker locker;
@ -46,7 +52,7 @@ atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst)
}
int32
atomic_add(vint32 *value, int32 addValue)
atomic_add(int32 *value, int32 addValue)
{
InterruptsLocker locker;
@ -56,7 +62,7 @@ atomic_add(vint32 *value, int32 addValue)
}
int32
atomic_and(vint32 *value, int32 andValue)
atomic_and(int32 *value, int32 andValue)
{
InterruptsLocker locker;
@ -66,7 +72,7 @@ atomic_and(vint32 *value, int32 andValue)
}
int32
atomic_or(vint32 *value, int32 orValue)
atomic_or(int32 *value, int32 orValue)
{
InterruptsLocker locker;
@ -76,7 +82,7 @@ atomic_or(vint32 *value, int32 orValue)
}
int32
atomic_get(vint32 *value)
atomic_get(int32 *value)
{
InterruptsLocker locker;
@ -84,12 +90,27 @@ atomic_get(vint32 *value)
return oldValue;
}
int32
_user_atomic_set(vint32 *value, int32 newValue)
void
_user_atomic_set(int32 *value, int32 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_set(value, newValue);
atomic_set(value, newValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return;
}
access_violation:
// XXX kill application
return;
}
int32
_user_atomic_get_and_set(int32 *value, int32 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_get_and_set(value, newValue);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
@ -100,11 +121,11 @@ access_violation:
}
int32
_user_atomic_test_and_set(vint32 *value, int32 newValue, int32 testAgainst)
_user_atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
int32 oldValue = atomic_test_and_set(value, newValue, testAgainst);
int32 oldValue = atomic_test_and_set((int32*)value, newValue, testAgainst);
unlock_memory((void *)value, sizeof(int32), B_READ_DEVICE);
return oldValue;
}
@ -115,7 +136,7 @@ access_violation:
}
int32
_user_atomic_add(vint32 *value, int32 addValue)
_user_atomic_add(int32 *value, int32 addValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
@ -130,7 +151,7 @@ access_violation:
}
int32
_user_atomic_and(vint32 *value, int32 andValue)
_user_atomic_and(int32 *value, int32 andValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
@ -145,7 +166,7 @@ access_violation:
}
int32
_user_atomic_or(vint32 *value, int32 orValue)
_user_atomic_or(int32 *value, int32 orValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {
@ -160,7 +181,7 @@ access_violation:
}
int32
_user_atomic_get(vint32 *value)
_user_atomic_get(int32 *value)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int32), B_READ_DEVICE) == B_OK) {

View File

@ -30,8 +30,17 @@
static spinlock atomic_lock = B_SPINLOCK_INITIALIZER;
void
atomic_set64(int64 *value, int64 newValue)
{
SpinLocker locker(&atomic_lock);
*value = newValue;
}
int64
atomic_set64(vint64 *value, int64 newValue)
atomic_get_and_set64(int64 *value, int64 newValue)
{
SpinLocker locker(&atomic_lock);
@ -42,7 +51,7 @@ atomic_set64(vint64 *value, int64 newValue)
int64
atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst)
atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst)
{
SpinLocker locker(&atomic_lock);
@ -54,7 +63,7 @@ atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst)
int64
atomic_add64(vint64 *value, int64 addValue)
atomic_add64(int64 *value, int64 addValue)
{
SpinLocker locker(&atomic_lock);
@ -65,7 +74,7 @@ atomic_add64(vint64 *value, int64 addValue)
int64
atomic_and64(vint64 *value, int64 andValue)
atomic_and64(int64 *value, int64 andValue)
{
SpinLocker locker(&atomic_lock);
@ -76,7 +85,7 @@ atomic_and64(vint64 *value, int64 andValue)
int64
atomic_or64(vint64 *value, int64 orValue)
atomic_or64(int64 *value, int64 orValue)
{
SpinLocker locker(&atomic_lock);
@ -87,7 +96,7 @@ atomic_or64(vint64 *value, int64 orValue)
int64
atomic_get64(vint64 *value)
atomic_get64(int64 *value)
{
SpinLocker locker(&atomic_lock);
return *value;
@ -95,11 +104,11 @@ atomic_get64(vint64 *value)
int64
_user_atomic_set64(vint64 *value, int64 newValue)
_user_atomic_get_and_set64(int64 *value, int64 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
int64 oldValue = atomic_set64(value, newValue);
int64 oldValue = atomic_get_and_set64(value, newValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return oldValue;
}
@ -110,8 +119,24 @@ access_violation:
}
void
_user_atomic_set64(int64 *value, int64 newValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
atomic_set64(value, newValue);
unlock_memory((void *)value, sizeof(int64), B_READ_DEVICE);
return;
}
access_violation:
// XXX kill application
return;
}
int64
_user_atomic_test_and_set64(vint64 *value, int64 newValue, int64 testAgainst)
_user_atomic_test_and_set64(int64 *value, int64 newValue, int64 testAgainst)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
@ -127,7 +152,7 @@ access_violation:
int64
_user_atomic_add64(vint64 *value, int64 addValue)
_user_atomic_add64(int64 *value, int64 addValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
@ -143,7 +168,7 @@ access_violation:
int64
_user_atomic_and64(vint64 *value, int64 andValue)
_user_atomic_and64(int64 *value, int64 andValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
@ -159,7 +184,7 @@ access_violation:
int64
_user_atomic_or64(vint64 *value, int64 orValue)
_user_atomic_or64(int64 *value, int64 orValue)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {
@ -175,7 +200,7 @@ access_violation:
int64
_user_atomic_get64(vint64 *value)
_user_atomic_get64(int64 *value)
{
if (IS_USER_ADDRESS(value)
&& lock_memory((void *)value, sizeof(int64), B_READ_DEVICE) == B_OK) {

View File

@ -49,15 +49,22 @@ miss3: ldrex r12, [r0]
bx lr
FUNCTION_END(atomic_or)
/* int atomic_set(int *value, int setTo)
/* void atomic_set(int *value, int setTo)
*/
FUNCTION(atomic_set):
str r1, [r0]
bx lr
FUNCTION_END(atomic_set)
/* int atomic_get_and_set(int *value, int setTo)
*/
FUNCTION(atomic_get_and_set):
miss4: ldrex r12, [r0]
strex r3, r1, [r0]
teq r3, #0
bne miss4
bx lr
FUNCTION_END(atomic_set)
FUNCTION_END(atomic_get_and_set)
/* int atomic_test_and_set(int *value, int setTo, int testValue)
*/

View File

@ -18,6 +18,13 @@ atomic_set(int32 *value, int32 newValue)
}
int32
atomic_get_and_set(int32 *value, int32 newValue)
{
return _kern_atomic_get_and_set(value, newValue);
}
int32
atomic_test_and_set(int32 *value, int32 newValue, int32 testAgainst)
{