#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)
#define virtio_membar_producer() __membar("fence w,w")
#define virtio_membar_consumer() __membar("fence r,r")
#define virtio_membar_sync() __membar("fence rw,rw")
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");
}
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
#endif