Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/include/atomic.h

    re762b43 r7a0359b  
    3737#define KERN_arm32_ATOMIC_H_
    3838
     39#include <arch/asm.h>
     40#include <trace.h>
     41
    3942/** Atomic addition.
    4043 *
     
    4548 *
    4649 */
    47 static inline long atomic_add(atomic_t *val, int i)
     50NO_TRACE static inline atomic_count_t atomic_add(atomic_t *val,
     51    atomic_count_t i)
    4852{
    49         int ret;
    50         volatile long *mem = &(val->count);
    51        
    52         asm volatile (
    53                 "1:\n"
    54                         "ldr r2, [%[mem]]\n"
    55                         "add r3, r2, %[i]\n"
    56                         "str r3, %[ret]\n"
    57                         "swp r3, r3, [%[mem]]\n"
    58                         "cmp r3, r2\n"
    59                         "bne 1b\n"
    60                 : [ret] "=m" (ret)
    61                 : [mem] "r" (mem), [i] "r" (i)
    62                 : "r3", "r2"
    63         );
     53        /*
     54         * This implementation is for UP pre-ARMv6 systems where we do not have
     55         * the LDREX and STREX instructions.
     56         */
     57        ipl_t ipl = interrupts_disable();
     58        val->count += i;
     59        atomic_count_t ret = val->count;
     60        interrupts_restore(ipl);
    6461       
    6562        return ret;
     
    6966 *
    7067 * @param val Variable to be incremented.
     68 *
    7169 */
    72 static inline void atomic_inc(atomic_t *val)
     70NO_TRACE static inline void atomic_inc(atomic_t *val)
    7371{
    7472        atomic_add(val, 1);
     
    7876 *
    7977 * @param val Variable to be decremented.
     78 *
    8079 */
    81 static inline void atomic_dec(atomic_t *val) {
     80NO_TRACE static inline void atomic_dec(atomic_t *val) {
    8281        atomic_add(val, -1);
    8382}
     
    8786 * @param val Variable to be incremented.
    8887 * @return    Value after incrementation.
     88 *
    8989 */
    90 static inline long atomic_preinc(atomic_t *val)
     90NO_TRACE static inline atomic_count_t atomic_preinc(atomic_t *val)
    9191{
    9292        return atomic_add(val, 1);
     
    9797 * @param val Variable to be decremented.
    9898 * @return    Value after decrementation.
     99 *
    99100 */
    100 static inline long atomic_predec(atomic_t *val)
     101NO_TRACE static inline atomic_count_t atomic_predec(atomic_t *val)
    101102{
    102103        return atomic_add(val, -1);
     
    107108 * @param val Variable to be incremented.
    108109 * @return    Value before incrementation.
     110 *
    109111 */
    110 static inline long atomic_postinc(atomic_t *val)
     112NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val)
    111113{
    112114        return atomic_add(val, 1) - 1;
     
    117119 * @param val Variable to be decremented.
    118120 * @return    Value before decrementation.
     121 *
    119122 */
    120 static inline long atomic_postdec(atomic_t *val)
     123NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val)
    121124{
    122125        return atomic_add(val, -1) + 1;
Note: See TracChangeset for help on using the changeset viewer.