Subversion Repositories HelenOS-historic

Rev

Rev 1000 | Rev 1024 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1000 Rev 1001
Line 29... Line 29...
29
#ifndef __ppc32_ATOMIC_H__
29
#ifndef __ppc32_ATOMIC_H__
30
#define __ppc32_ATOMIC_H__
30
#define __ppc32_ATOMIC_H__
31
 
31
 
32
#include <arch/types.h>
32
#include <arch/types.h>
33
 
33
 
34
#define atomic_inc_pre(x) (atomic_inc(x) - 1)
-
 
35
#define atomic_dec_pre(x) (atomic_dec(x) + 1)
-
 
36
 
-
 
37
#define atomic_inc_post(x) atomic_inc(x)
-
 
38
#define atomic_dec_post(x) atomic_dec(x)
-
 
39
 
-
 
40
typedef struct { volatile __u32 count; } atomic_t;
34
typedef struct { volatile __u32 count; } atomic_t;
41
 
35
 
42
static inline void atomic_inc(atomic_t *val) {
36
static inline void atomic_inc(atomic_t *val)
-
 
37
{
43
    __u32 tmp;
38
    __u32 tmp;
44
 
39
 
45
    asm __volatile__ (
40
    asm __volatile__ (
46
        "1:\n"
41
        "1:\n"
47
        "lwarx %0, 0, %2\n"
42
        "lwarx %0, 0, %2\n"
Line 51... Line 46...
51
        : "=&r" (tmp), "=m" (val->count)
46
        : "=&r" (tmp), "=m" (val->count)
52
        : "r" (&val->count), "m" (val->count)
47
        : "r" (&val->count), "m" (val->count)
53
        : "cc");
48
        : "cc");
54
}
49
}
55
 
50
 
56
static inline void atomic_dec(atomic_t *val) {
51
static inline void atomic_dec(atomic_t *val)
-
 
52
{
57
    __u32 tmp;
53
    __u32 tmp;
58
 
54
 
59
    asm __volatile__(
55
    asm __volatile__(
60
        "1:\n"
56
        "1:\n"
61
        "lwarx %0, 0, %2\n"
57
        "lwarx %0, 0, %2\n"
Line 65... Line 61...
65
        : "=&r" (tmp), "=m" (val->count)
61
        : "=&r" (tmp), "=m" (val->count)
66
        : "r" (&val->count), "m" (val->count)
62
        : "r" (&val->count), "m" (val->count)
67
        : "cc");
63
        : "cc");
68
}
64
}
69
 
65
 
-
 
66
static inline __u32 atomic_inc_pre(atomic_t *val)
-
 
67
{
-
 
68
    atomic_inc(val);
-
 
69
    return val->count - 1;
-
 
70
}
-
 
71
 
-
 
72
static inline __u32 atomic_dec_pre(atomic_t *val)
-
 
73
{
-
 
74
    atomic_dec(val);
-
 
75
    return val->count + 1;
-
 
76
}
-
 
77
 
-
 
78
static inline __u32 atomic_inc_post(atomic_t *val)
-
 
79
{
-
 
80
    atomic_inc(val);
-
 
81
    return val->count;
-
 
82
}
-
 
83
 
-
 
84
static inline __u32 atomic_dec_post(atomic_t *val)
-
 
85
{
-
 
86
    atomic_dec(val);
-
 
87
    return val->count;
-
 
88
}
-
 
89
 
70
static inline void atomic_set(atomic_t *val, __u32 i)
90
static inline void atomic_set(atomic_t *val, __u32 i)
71
{
91
{
72
    val->count = i;
92
    val->count = i;
73
}
93
}
74
 
94