Ignore:
Timestamp:
Jul 18, 2015, 3:18:32 PM (9 years ago)
Author:
alain
Message:

Introduce two new atomic read-the-write functions, that can be used
to set or reset a bit field in a shared 32 bits word:

_atomic_or()
_atpmic_and()

Location:
soft/giet_vm/giet_common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_common/kernel_locks.c

    r495 r632  
    2626        "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
    2727        "addu $13,   $11,    $12       \n"   /* $13 <= *ptr + increment  */
    28         "sc   $13,   0($10)            \n"   /* M[ptr] <= new            */
     28        "sc   $13,   0($10)            \n"   /* *ptr <= $12              */
    2929        "beqz $13,   1234b             \n"   /* retry if failure         */
    3030        "move %0,    $12               \n"   /* value <= *ptr if success */
     
    3434
    3535    return value;
     36}
     37
     38////////////////////////////////////
     39void _atomic_or( unsigned int* ptr,
     40                 unsigned int  mask )
     41{
     42    asm volatile (
     43        "1789:                         \n"
     44        "move $10,   %0                \n"   /* $10 <= ptr               */
     45        "move $11,   %1                \n"   /* $11 <= mask              */
     46        "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
     47        "or   $12,   $11,    $12       \n"   /* $12 <= *ptr | mask       */
     48        "sc   $12,   0($10)            \n"   /* *ptr <= $12              */
     49        "beqz $12,   1789b             \n"   /* retry if failure         */
     50        "nop                           \n" 
     51        :
     52        : "r" (ptr), "r" (mask)
     53        : "$10", "$11", "$12", "memory" );
     54}
     55
     56////////////////////////////////////
     57void _atomic_and( unsigned int* ptr,
     58                  unsigned int  mask )
     59{
     60    asm volatile (
     61        "1945:                         \n"
     62        "move $10,   %0                \n"   /* $10 <= ptr               */
     63        "move $11,   %1                \n"   /* $11 <= mask              */
     64        "ll   $12,   0($10)            \n"   /* $12 <= *ptr              */
     65        "and  $12,   $11,    $12       \n"   /* $13 <= *ptr & mask       */
     66        "sc   $12,   0($10)            \n"   /* *ptr <= new              */
     67        "beqz $12,   1945b             \n"   /* retry if failure         */
     68        "nop                           \n" 
     69        :
     70        : "r" (ptr), "r" (mask)
     71        : "$10", "$11", "$12", "memory" );
    3672}
    3773
  • soft/giet_vm/giet_common/kernel_locks.h

    r523 r632  
    1313
    1414#include "hard_config.h"
     15
     16
     17//////////////////////////////////////////////////////////////////////////////
     18//      Atomic access functions using LL/SC instructions
     19//////////////////////////////////////////////////////////////////////////////
     20
     21extern unsigned int _atomic_increment( unsigned int* ptr,
     22                                       int  increment );
     23
     24extern void _atomic_or( unsigned int* ptr,
     25                        unsigned int  mask );
     26
     27extern void _atomic_and( unsigned int* ptr,
     28                         unsigned int  mask );
    1529
    1630//////////////////////////////////////////////////////////////////////////////
     
    3852    unsigned int padding[14];    // for 64 bytes alignment
    3953} spin_lock_t;
    40 
    41 extern unsigned int _atomic_increment( unsigned int* ptr,
    42                                        int  increment );
    4354
    4455extern void _spin_lock_init( spin_lock_t* lock );
Note: See TracChangeset for help on using the changeset viewer.