Changeset 0fad93a in mainline


Ignore:
Timestamp:
2006-02-21T13:18:41Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c2942d8
Parents:
6f8a426
Message:

Add atomic_add() operation for sparc64.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/include/atomic.h

    r6f8a426 r0fad93a  
    3434typedef struct { volatile __u64 count; } atomic_t;
    3535
    36 /*
    37  * TODO: these are just placeholders for real implementations of atomic_inc and atomic_dec.
    38  * WARNING: the following functions cause the code to be preemption-unsafe !!!
     36/** Atomic add operation.
     37 *
     38 * Use atomic compare and swap operation to atomically add signed value.
     39 *
     40 * @param val Atomic variable.
     41 * @param i Signed value to be added.
     42 *
     43 * @return Value of the atomic variable as it existed before addition.
    3944 */
     45static inline count_t atomic_add(atomic_t *val, int i)
     46{
     47        __u64 a, b;
     48        volatile __u64 x = (__u64) &val->count;
     49
     50        __asm__ volatile (
     51                "0:\n"
     52                "ldx %0, %1\n"
     53                "add %1, %3, %2\n"
     54                "casx %0, %1, %2\n"
     55                "cmp %1, %2\n"
     56                "bne 0b\n"
     57                "nop\n"
     58                : "=m" (*((__u64 *)x)), "=r" (a), "=r" (b)
     59                : "r" (i)
     60        );
     61
     62        return a;
     63}
    4064
    4165static inline void atomic_inc(atomic_t *val)
    4266{
    43         val->count++;
     67        (void) atomic_add(val, 1);
    4468}
    4569
    4670static inline void atomic_dec(atomic_t *val)
    4771{
    48         val->count--;
     72        (void) atomic_add(val, -1);
    4973}
    5074
Note: See TracChangeset for help on using the changeset viewer.