lib: htif: add TSA annotations

Add Thread Safety Analysis (TSA) annotations for the HTIF driver
implementation.

This requires annotating the tohost/fromhost and htif_console_buf
globals to indicate that they are protected by htif_lock.
htif_system_reset() can be excluded since it is only called under
special circumstances from sbi_system_reset(), when all other harts
have been stopped.

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-10-carlos.lopezr4096@gmail.com
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Carlos López
2026-09-16 09:48:30 +05:30
committed by Anup Patel
parent f5fd674f18
commit 1ba332872b
+18 -14
View File
@@ -46,22 +46,25 @@
#define PK_SYS_write 64 #define PK_SYS_write 64
volatile uint64_t tohost __attribute__((section(".htif")));
volatile uint64_t fromhost __attribute__((section(".htif")));
static uint64_t *htif_fromhost = NULL;
static uint64_t *htif_tohost = NULL;
static bool htif_custom = false;
static int htif_console_buf;
static spinlock_t htif_lock = SPIN_LOCK_INITIALIZER; static spinlock_t htif_lock = SPIN_LOCK_INITIALIZER;
static inline uint64_t __read_tohost(void) volatile uint64_t tohost
__attribute__((section(".htif"))) GUARDED_BY(&htif_lock);
volatile uint64_t fromhost
__attribute__((section(".htif"))) GUARDED_BY(&htif_lock);
static uint64_t *htif_fromhost PT_GUARDED_BY(&htif_lock) = NULL;
static uint64_t *htif_tohost PT_GUARDED_BY(&htif_lock) = NULL;
static bool htif_custom = false;
static int htif_console_buf GUARDED_BY(&htif_lock);
static inline uint64_t __read_tohost(void) MUST_HOLD(&htif_lock)
{ {
return (htif_custom) ? *htif_tohost : tohost; return (htif_custom) ? *htif_tohost : tohost;
} }
static inline void __write_tohost(uint64_t val) static inline void __write_tohost(uint64_t val) MUST_HOLD(&htif_lock)
{ {
if (htif_custom) if (htif_custom)
*htif_tohost = val; *htif_tohost = val;
@@ -69,12 +72,12 @@ static inline void __write_tohost(uint64_t val)
tohost = val; tohost = val;
} }
static inline uint64_t __read_fromhost(void) static inline uint64_t __read_fromhost(void) MUST_HOLD(&htif_lock)
{ {
return (htif_custom) ? *htif_fromhost : fromhost; return (htif_custom) ? *htif_fromhost : fromhost;
} }
static inline void __write_fromhost(uint64_t val) static inline void __write_fromhost(uint64_t val) MUST_HOLD(&htif_lock)
{ {
if (htif_custom) if (htif_custom)
*htif_fromhost = val; *htif_fromhost = val;
@@ -82,7 +85,7 @@ static inline void __write_fromhost(uint64_t val)
fromhost = val; fromhost = val;
} }
static void __check_fromhost() static void __check_fromhost() MUST_HOLD(&htif_lock)
{ {
uint64_t fh = __read_fromhost(); uint64_t fh = __read_fromhost();
if (!fh) if (!fh)
@@ -104,6 +107,7 @@ static void __check_fromhost()
} }
static void __set_tohost(uint64_t dev, uint64_t cmd, uint64_t data) static void __set_tohost(uint64_t dev, uint64_t cmd, uint64_t data)
MUST_HOLD(&htif_lock)
{ {
while (__read_tohost()) while (__read_tohost())
__check_fromhost(); __check_fromhost();
@@ -217,7 +221,7 @@ static int htif_system_reset_check(u32 type, u32 reason)
return 1; return 1;
} }
static void htif_system_reset(u32 type, u32 reason) static void htif_system_reset(u32 type, u32 reason) NO_THREAD_SAFETY_ANALYSIS
{ {
while (1) { while (1) {
__write_fromhost(0); __write_fromhost(0);