Changeset 6b781c0 in mainline for kernel/arch/arm32/include/atomic.h


Ignore:
Timestamp:
2007-06-08T15:02:49Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c03ee1c
Parents:
3ee8a075
Message:

Merge arm32 into trunk.

File:
1 edited

Legend:

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

    r3ee8a075 r6b781c0  
    11/*
    2  * Copyright (c) 2005 Ondrej Palkovsky
     2 * Copyright (c) 2007 Michal Kebrt
    33 * All rights reserved.
    44 *
     
    3030 * @{
    3131 */
    32 /** @file
     32/** @file
     33 *  @brief Atomic operations.
    3334 */
    3435
     
    3637#define KERN_arm32_ATOMIC_H_
    3738
    38 #define atomic_inc(x)   ((void) atomic_add(x, 1))
    39 #define atomic_dec(x)   ((void) atomic_add(x, -1))
    40 
    41 #define atomic_postinc(x) (atomic_add(x, 1) - 1)
    42 #define atomic_postdec(x) (atomic_add(x, -1) + 1)
    43 
    44 #define atomic_preinc(x) atomic_add(x, 1)
    45 #define atomic_predec(x) atomic_add(x, -1)
    46 
    47 /* Atomic addition of immediate value.
     39/** Atomic addition.
    4840 *
    49  * @param val Memory location to which will be the immediate value added.
    50  * @param i Signed immediate that will be added to *val.
     41 * @param val Where to add.
     42 * @param i   Value to be added.
    5143 *
    5244 * @return Value after addition.
     
    5446static inline long atomic_add(atomic_t *val, int i)
    5547{
    56         /* TODO */
    57         return (val->count += i);
     48        int ret;
     49        volatile long *mem = &(val->count);
     50
     51        asm volatile (
     52        "1:\n"
     53                "ldr r2, [%1]       \n"
     54                "add r3, r2, %2     \n"
     55                "str r3, %0         \n"
     56                "swp r3, r3, [%1]   \n"
     57                "cmp r3, r2         \n"
     58                "bne 1b             \n"
     59
     60                : "=m" (ret)
     61                : "r" (mem), "r" (i)
     62                : "r3", "r2"
     63        );
     64
     65        return ret;
     66}
     67
     68/** Atomic increment.
     69 *
     70 * @param val Variable to be incremented.
     71 */
     72static inline void atomic_inc(atomic_t *val)
     73{
     74        atomic_add(val, 1);
     75}
     76
     77/** Atomic decrement.
     78 *
     79 * @param val Variable to be decremented.
     80 */
     81static inline void atomic_dec(atomic_t *val) {
     82        atomic_add(val, -1);
     83}
     84
     85/** Atomic pre-increment.
     86 *
     87 * @param val Variable to be incremented.
     88 * @return    Value after incrementation.
     89 */
     90static inline long atomic_preinc(atomic_t *val)
     91{
     92        return atomic_add(val, 1);
     93}
     94
     95/** Atomic pre-decrement.
     96 *
     97 * @param val Variable to be decremented.
     98 * @return    Value after decrementation.
     99 */
     100static inline long atomic_predec(atomic_t *val)
     101{
     102        return atomic_add(val, -1);
     103}
     104
     105/** Atomic post-increment.
     106 *
     107 * @param val Variable to be incremented.
     108 * @return    Value before incrementation.
     109 */
     110static inline long atomic_postinc(atomic_t *val)
     111{
     112        return atomic_add(val, 1) - 1;
     113}
     114
     115/** Atomic post-decrement.
     116 *
     117 * @param val Variable to be decremented.
     118 * @return    Value before decrementation.
     119 */
     120static inline long atomic_postdec(atomic_t *val)
     121{
     122        return atomic_add(val, -1) + 1;
    58123}
    59124
Note: See TracChangeset for help on using the changeset viewer.