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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [src/] [arch/] [arm/] [v6/] [mutex.S.ARM] - Diff between revs 2 and 6

Show entire file | Details | Blame | View Log

Rev 2 Rev 6
?rev1line?
?rev2line?
 
/*
 
 * ARM v5 Binary semaphore (mutex) implementation.
 
 *
 
 * Copyright (C) 2007 Bahadir Balban
 
 *
 
 */
 
 
 
#include INC_ARCH(asm.h)
 
 
 
/* Recap on swp:
 
 * swp rx, ry, [rz]
 
 * In one instruction:
 
 * 1) Stores the value in ry into location pointed by rz.
 
 * 2) Loads the value in the location of rz into rx.
 
 * By doing so, in one instruction one can attempt to lock
 
 * a word, and discover whether it was already locked.
 
 */
 
 
 
#define MUTEX_UNLOCKED  0
 
#define MUTEX_LOCKED    1
 
 
 
BEGIN_PROC(__spin_lock)
 
        mov     r1, #1
 
__spin:
 
        swp     r2, r1, [r0]
 
        cmp     r2, #0
 
        bne     __spin
 
        mov     pc, lr
 
END_PROC(__spin_lock)
 
 
 
BEGIN_PROC(__spin_unlock)
 
        mov     r1, #0
 
        swp     r2, r1, [r0]
 
        cmp     r2, #1          @ Debug check.
 
1:
 
        bne     1b
 
        mov     pc, lr
 
END_PROC(__spin_unlock)
 
 
 
 
 
/*
 
 * @r0: Address of mutex location.
 
 */
 
BEGIN_PROC(__mutex_lock)
 
        mov     r1, #1
 
        swp     r2, r1, [r0]
 
        cmp     r2, #0
 
        movne   r0, #0
 
        moveq   r0, #1
 
        mov     pc, lr
 
END_PROC(__mutex_lock)
 
 
 
/*
 
 * @r0: Address of mutex location.
 
 */
 
BEGIN_PROC(__mutex_unlock)
 
        mov     r1, #0
 
        swp     r2, r1, [r0]
 
        cmp     r2, #1
 
1:                              @ Debug check.
 
        bne     1b
 
        mov     pc, lr
 
END_PROC(__mutex_unlock)
 
 
 
/*
 
 * @r0: Address of mutex location.
 
 */
 
BEGIN_PROC(__mutex_inc)
 
        swp     r2, r1, [r0]
 
        mov     r1, #1
 
        swp     r2, r1, [r0]
 
        cmp     r2, #0
 
        movne   r0, #0
 
        moveq   r0, #1
 
        mov     pc, lr
 
END_PROC(__mutex_inc)
 
 
 
/*
 
 * @r0: Address of mutex location.
 
 */
 
BEGIN_PROC(__mutex_dec)
 
        mov     r1, #0
 
        swp     r2, r1, [r0]
 
        cmp     r2, #1
 
1:                              @ Debug check.
 
        bne     1b
 
        mov     pc, lr
 
END_PROC(__mutex_dec)
 
 
 
 

powered by: WebSVN 2.1.0

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