Atmosphere/exosphere/src/lock.h
Mat M c94cfe4898 lock: Use stdatomic.h (#56)
Provides the same assembly output while using the standardized interface

e.g.

0000000000000000 <set_priv_smc_in_progress>:
   0:   90000000    adrp    x0, 0 <set_priv_smc_in_progress>
   4:   91000000    add x0, x0, #0x0
   8:   52800022    mov w2, #0x1                    // #1
   c:   d503201f    nop
  10:   085ffc01    ldaxrb  w1, [x0]
  14:   08037c02    stxrb   w3, w2, [x0]
  18:   35ffffc3    cbnz    w3, 10 <set_priv_smc_in_progress+0x10>
  1c:   72001c3f    tst w1, #0xff
  20:   54ffff81    b.ne    10 <set_priv_smc_in_progress+0x10>  // b.any
  24:   d65f03c0    ret
2018-02-25 22:59:48 -08:00

26 lines
643 B
C

#ifndef EXOSPHERE_LOCK_H
#define EXOSPHERE_LOCK_H
#include <stdatomic.h>
#include <stdbool.h>
/* Simple atomics driver for Exosphere. */
/* Acquire a lock. */
static inline void lock_acquire(atomic_flag *flag) {
while (atomic_flag_test_and_set_explicit(flag, memory_order_acquire)) {
/* Wait to acquire lock. */
}
}
/* Release a lock. */
static inline void lock_release(atomic_flag *flag) {
atomic_flag_clear_explicit(flag, memory_order_release);
}
/* Try to acquire a lock. */
static inline bool lock_try_acquire(atomic_flag *flag) {
return atomic_flag_test_and_set_explicit(flag, memory_order_acquire);
}
#endif