mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-10-04 00:27:08 +02:00
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
26 lines
643 B
C
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 |