diff --git a/include/sbi/riscv_locks.h b/include/sbi/riscv_locks.h index 38d9cbeb..a0a34c04 100644 --- a/include/sbi/riscv_locks.h +++ b/include/sbi/riscv_locks.h @@ -20,7 +20,7 @@ typedef struct { u16 owner; u16 next; #endif -} __aligned(4) spinlock_t; +} __aligned(4) CAPABILITY("spinlock") spinlock_t; #define __SPIN_LOCK_UNLOCKED \ (spinlock_t) { 0, 0 } @@ -36,10 +36,10 @@ typedef struct { bool spin_lock_check(spinlock_t *lock); -bool spin_trylock(spinlock_t *lock); +bool spin_trylock(spinlock_t *lock) TRY_ACQUIRE(true, *lock); -void spin_lock(spinlock_t *lock); +void spin_lock(spinlock_t *lock) ACQUIRE(*lock) MUST_NOT_HOLD(*lock); -void spin_unlock(spinlock_t *lock); +void spin_unlock(spinlock_t *lock) RELEASE(*lock); #endif diff --git a/lib/sbi/riscv_locks.c b/lib/sbi/riscv_locks.c index e253b1b7..fa624a94 100644 --- a/lib/sbi/riscv_locks.c +++ b/lib/sbi/riscv_locks.c @@ -45,7 +45,7 @@ bool spin_trylock(spinlock_t *lock) return l0 == 0; } -void spin_lock(spinlock_t *lock) +void spin_lock(spinlock_t *lock) NO_THREAD_SAFETY_ANALYSIS { unsigned long inc = 1u << TICKET_SHIFT; unsigned long mask = 0xffffu; @@ -84,7 +84,7 @@ void spin_lock(spinlock_t *lock) : "memory"); } -void spin_unlock(spinlock_t *lock) +void spin_unlock(spinlock_t *lock) NO_THREAD_SAFETY_ANALYSIS { __smp_store_release(&lock->owner, lock->owner + 1); }