Files
zig/lib/libc/include/riscv64-openbsd-none/machine/atomic.h
T
Alex Rønne Petersen 66d97267c7 libc: add openbsd 7.8 headers
This excludes all headers in /usr/include/dev because that directory is bonkers
huge (18M). We can add these on an as-needed basis.
2026-01-05 14:52:48 +01:00

50 lines
1.1 KiB
C
Vendored

/* $OpenBSD: atomic.h,v 1.5 2024/01/24 12:25:50 jca Exp $ */
/* Public Domain */
#ifndef _MACHINE_ATOMIC_H_
#define _MACHINE_ATOMIC_H_
#define __membar(_f) do {__asm volatile(_f ::: "memory"); } while (0)
#define membar_enter() __membar("fence w,rw")
#define membar_exit() __membar("fence rw,w")
#define membar_producer() __membar("fence w,w")
#define membar_consumer() __membar("fence r,r")
#define membar_sync() __membar("fence rw,rw")
#if defined(_KERNEL)
/* virtio needs MP membars even on SP kernels */
#define virtio_membar_producer() __membar("fence w,w")
#define virtio_membar_consumer() __membar("fence r,r")
#define virtio_membar_sync() __membar("fence rw,rw")
/*
* Set bits
* *p = *p | v
*/
static inline void
atomic_setbits_int(volatile unsigned int *p, unsigned int v)
{
__asm volatile("amoor.w zero, %1, %0"
: "+A" (*p)
: "r" (v)
: "memory");
}
/*
* Clear bits
* *p = *p & (~v)
*/
static inline void
atomic_clearbits_int(volatile unsigned int *p, unsigned int v)
{
__asm volatile("amoand.w zero, %1, %0"
: "+A" (*p)
: "r" (~v)
: "memory");
}
#endif /* defined(_KERNEL) */
#endif /* _MACHINE_ATOMIC_H_ */