OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [src/] [arch/] [arm/] [v6/] [mutex.S.ARM] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 drasko
/*
2
 * ARM v5 Binary semaphore (mutex) implementation.
3
 *
4
 * Copyright (C) 2007 Bahadir Balban
5
 *
6
 */
7
 
8
#include INC_ARCH(asm.h)
9
 
10
/* Recap on swp:
11
 * swp rx, ry, [rz]
12
 * In one instruction:
13
 * 1) Stores the value in ry into location pointed by rz.
14
 * 2) Loads the value in the location of rz into rx.
15
 * By doing so, in one instruction one can attempt to lock
16
 * a word, and discover whether it was already locked.
17
 */
18
 
19
#define MUTEX_UNLOCKED  0
20
#define MUTEX_LOCKED    1
21
 
22
BEGIN_PROC(__spin_lock)
23
        mov     r1, #1
24
__spin:
25
        swp     r2, r1, [r0]
26
        cmp     r2, #0
27
        bne     __spin
28
        mov     pc, lr
29
END_PROC(__spin_lock)
30
 
31
BEGIN_PROC(__spin_unlock)
32
        mov     r1, #0
33
        swp     r2, r1, [r0]
34
        cmp     r2, #1          @ Debug check.
35
1:
36
        bne     1b
37
        mov     pc, lr
38
END_PROC(__spin_unlock)
39
 
40
 
41
/*
42
 * @r0: Address of mutex location.
43
 */
44
BEGIN_PROC(__mutex_lock)
45
        mov     r1, #1
46
        swp     r2, r1, [r0]
47
        cmp     r2, #0
48
        movne   r0, #0
49
        moveq   r0, #1
50
        mov     pc, lr
51
END_PROC(__mutex_lock)
52
 
53
/*
54
 * @r0: Address of mutex location.
55
 */
56
BEGIN_PROC(__mutex_unlock)
57
        mov     r1, #0
58
        swp     r2, r1, [r0]
59
        cmp     r2, #1
60
1:                              @ Debug check.
61
        bne     1b
62
        mov     pc, lr
63
END_PROC(__mutex_unlock)
64
 
65
/*
66
 * @r0: Address of mutex location.
67
 */
68
BEGIN_PROC(__mutex_inc)
69
        swp     r2, r1, [r0]
70
        mov     r1, #1
71
        swp     r2, r1, [r0]
72
        cmp     r2, #0
73
        movne   r0, #0
74
        moveq   r0, #1
75
        mov     pc, lr
76
END_PROC(__mutex_inc)
77
 
78
/*
79
 * @r0: Address of mutex location.
80
 */
81
BEGIN_PROC(__mutex_dec)
82
        mov     r1, #0
83
        swp     r2, r1, [r0]
84
        cmp     r2, #1
85
1:                              @ Debug check.
86
        bne     1b
87
        mov     pc, lr
88
END_PROC(__mutex_dec)
89
 
90
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.