mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2026-09-20 23:31:43 +01:00
Add Thread Safety Analysis (TSA) annotations for spinlock APIs, allowing
the compiler to reason about lock acquisition and release.
Annotations have a different meaning if used in header declarations vs C
file implementations. In header declarations, they specify the semantics
of the given function, meaning that we must specify that the spinlock
functions acquire and release a lock ("capability" in clang terms).
In function implementations, attributes affect the function body and
callers in the same translation unit; since the spinlock functions
contain inline assembly, they must be excluded from analysis.
Signed-off-by: Carlos López <carlos.lopezr4096@gmail.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Link: https://lore.kernel.org/r/20260909162322.29778-4-carlos.lopezr4096@gmail.com
Signed-off-by: Anup Patel <anup@brainfault.org>
46 lines
944 B
C
46 lines
944 B
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2019 Western Digital Corporation or its affiliates.
|
|
* Copyright (c) 2021 Christoph Müllner <cmuellner@linux.com>
|
|
*/
|
|
|
|
#ifndef __RISCV_LOCKS_H__
|
|
#define __RISCV_LOCKS_H__
|
|
|
|
#include <sbi/sbi_types.h>
|
|
|
|
#define TICKET_SHIFT 16
|
|
|
|
typedef struct {
|
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
u16 next;
|
|
u16 owner;
|
|
#else
|
|
u16 owner;
|
|
u16 next;
|
|
#endif
|
|
} __aligned(4) CAPABILITY("spinlock") spinlock_t;
|
|
|
|
#define __SPIN_LOCK_UNLOCKED \
|
|
(spinlock_t) { 0, 0 }
|
|
|
|
#define SPIN_LOCK_INIT(x) \
|
|
x = __SPIN_LOCK_UNLOCKED
|
|
|
|
#define SPIN_LOCK_INITIALIZER \
|
|
__SPIN_LOCK_UNLOCKED
|
|
|
|
#define DEFINE_SPIN_LOCK(x) \
|
|
spinlock_t SPIN_LOCK_INIT(x)
|
|
|
|
bool spin_lock_check(spinlock_t *lock);
|
|
|
|
bool spin_trylock(spinlock_t *lock) TRY_ACQUIRE(true, *lock);
|
|
|
|
void spin_lock(spinlock_t *lock) ACQUIRE(*lock) MUST_NOT_HOLD(*lock);
|
|
|
|
void spin_unlock(spinlock_t *lock) RELEASE(*lock);
|
|
|
|
#endif
|