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()

File:
1 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
Note: See TracChangeset for help on using the changeset viewer.