Subversion Repositories HelenOS-historic

Rev

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

Rev 111 Rev 115
Line 29... Line 29...
29
#ifndef __ia32_ATOMIC_H__
29
#ifndef __ia32_ATOMIC_H__
30
#define __ia32_ATOMIC_H__
30
#define __ia32_ATOMIC_H__
31
 
31
 
32
#include <arch/types.h>
32
#include <arch/types.h>
33
 
33
 
34
extern void atomic_inc(volatile int *val);
34
static inline void atomic_inc(volatile int *val) {
-
 
35
#ifdef __SMP__
-
 
36
    __asm__ volatile ("lock incl (%0)\n" : : "r" (val));
-
 
37
#else
-
 
38
    __asm__ volatile ("incl (%0)\n" : : "r" (val));
-
 
39
#endif /* __SMP__ */
-
 
40
}
-
 
41
 
35
extern void atomic_dec(volatile int *val);
42
static inline void atomic_dec(volatile int *val) {
-
 
43
#ifdef __SMP__
-
 
44
    __asm__ volatile ("lock decl (%0)\n" : : "r" (val));
-
 
45
#else
-
 
46
    __asm__ volatile ("decl (%0)\n" : : "r" (val));
-
 
47
#endif /* __SMP__ */
-
 
48
}
-
 
49
 
-
 
50
static inline int test_and_set(int *val) {
-
 
51
    int v;
-
 
52
   
-
 
53
    __asm__ volatile (
-
 
54
        "movl $1, %0\n"
-
 
55
        "xchgl %0, (%1)\n"
-
 
56
        : "=r" (v)
-
 
57
        : "r" (val)
-
 
58
    );
-
 
59
   
-
 
60
    return v;
-
 
61
}
-
 
62
 
36
 
63
 
37
extern int test_and_set(int *val);
-
 
38
extern void spinlock_arch(int *val);
64
extern void spinlock_arch(int *val);
39
 
65
 
40
#endif
66
#endif