#ifndef _VAX_LOCK_H_
#define _VAX_LOCK_H_
#include <sys/param.h>
#ifdef _KERNEL
#ifdef _KERNEL_OPT
#include "opt_multiprocessor.h"
#include <machine/intr.h>
#endif
#include <machine/cpu.h>
#endif
static __inline int
__SIMPLELOCK_LOCKED_P(const __cpu_simple_lock_t *__ptr)
{
return *__ptr == __SIMPLELOCK_LOCKED;
}
static __inline int
__SIMPLELOCK_UNLOCKED_P(const __cpu_simple_lock_t *__ptr)
{
return *__ptr == __SIMPLELOCK_UNLOCKED;
}
static __inline void
__cpu_simple_lock_clear(__cpu_simple_lock_t *__ptr)
{
*__ptr = __SIMPLELOCK_UNLOCKED;
}
static __inline void
__cpu_simple_lock_set(__cpu_simple_lock_t *__ptr)
{
*__ptr = __SIMPLELOCK_LOCKED;
}
static __inline void __cpu_simple_lock_init(__cpu_simple_lock_t *);
static __inline void
__cpu_simple_lock_init(__cpu_simple_lock_t *__alp)
{
*__alp = __SIMPLELOCK_UNLOCKED;
}
static __inline int __cpu_simple_lock_try(__cpu_simple_lock_t *);
static __inline int
__cpu_simple_lock_try(__cpu_simple_lock_t *__alp)
{
int ret;
#ifdef _HARDKERNEL
__asm __volatile ("movl %1,%%r1;jsb Slocktry;movl %%r0,%0"
: "=&r"(ret)
: "g"(__alp)
: "r0","r1","cc","memory");
#else
__asm __volatile ("clrl %0;bbssi $0,%1,1f;incl %0;1:"
: "=&r"(ret)
: "m"(*__alp)
: "cc", "memory");
#endif
return ret;
}
static __inline void __cpu_simple_lock(__cpu_simple_lock_t *);
static __inline void
__cpu_simple_lock(__cpu_simple_lock_t *__alp)
{
#if defined(_HARDKERNEL) && defined(MULTIPROCESSOR)
struct cpu_info * const __ci = curcpu();
while (__cpu_simple_lock_try(__alp) == 0) {
#define VAX_LOCK_CHECKS ((1 << IPI_SEND_CNCHAR) | (1 << IPI_DDB))
if (__ci->ci_ipimsgs & VAX_LOCK_CHECKS) {
cpu_handle_ipi();
}
}
#else
__asm __volatile ("1:bbssi $0,%0,1b"
:
: "m"(*__alp)
: "cc", "memory");
#endif
}
static __inline void __cpu_simple_unlock(__cpu_simple_lock_t *);
static __inline void
__cpu_simple_unlock(__cpu_simple_lock_t *__alp)
{
#ifdef _HARDKERNEL
__asm __volatile ("movl %0,%%r1;jsb Sunlock"
:
: "g"(__alp)
: "r1","cc","memory");
#else
__asm __volatile ("bbcci $0,%0,1f;1:"
:
: "m"(*__alp)
: "cc", "memory");
#endif
}
#if defined(MULTIPROCESSOR)
#define SPINLOCK_SPIN_HOOK \
do { \
struct cpu_info * const __ci = curcpu(); \
\
if (__ci->ci_ipimsgs != 0) { \
\
cpu_handle_ipi(); \
} \
} while (0)
#endif
#endif