|
Packit |
857059 |
/* BEGIN_ICS_COPYRIGHT2 ****************************************
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Copyright (c) 2015-2017, Intel Corporation
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Redistribution and use in source and binary forms, with or without
|
|
Packit |
857059 |
modification, are permitted provided that the following conditions are met:
|
|
Packit |
857059 |
|
|
Packit |
857059 |
* Redistributions of source code must retain the above copyright notice,
|
|
Packit |
857059 |
this list of conditions and the following disclaimer.
|
|
Packit |
857059 |
* Redistributions in binary form must reproduce the above copyright
|
|
Packit |
857059 |
notice, this list of conditions and the following disclaimer in the
|
|
Packit |
857059 |
documentation and/or other materials provided with the distribution.
|
|
Packit |
857059 |
* Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
857059 |
may be used to endorse or promote products derived from this software
|
|
Packit |
857059 |
without specific prior written permission.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
857059 |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
857059 |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit |
857059 |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit |
857059 |
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit |
857059 |
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit |
857059 |
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit |
857059 |
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
857059 |
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
857059 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
** END_ICS_COPYRIGHT2 ****************************************/
|
|
Packit |
857059 |
|
|
Packit |
857059 |
/* [ICS VERSION STRING: unknown] */
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#ifndef _IBA_PUBLIC_ISPINLOCK_OSD_H
|
|
Packit |
857059 |
#define _IBA_PUBLIC_ISPINLOCK_OSD_H
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#include "iba/public/datatypes.h"
|
|
Packit |
857059 |
#include <pthread.h>
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#ifdef __cplusplus
|
|
Packit |
857059 |
extern "C" {
|
|
Packit |
857059 |
#endif
|
|
Packit |
857059 |
|
|
Packit |
857059 |
typedef struct _SPIN_LOCK
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
/* No publically accessible members. */
|
|
Packit |
857059 |
pthread_mutex_t sp_lock;
|
|
Packit |
857059 |
} SPIN_LOCK;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
typedef struct _SPIN_RW_LOCK
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
/* No publically accessible members. */
|
|
Packit |
857059 |
pthread_mutex_t rw_lock;
|
|
Packit |
857059 |
} SPIN_RW_LOCK;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
typedef uint32 ATOMIC_UINT;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline uint32 AtomicRead(const volatile ATOMIC_UINT *pValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return *pValue;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline void AtomicWrite(volatile ATOMIC_UINT *pValue,
|
|
Packit |
857059 |
uint32 newValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
*pValue = newValue;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline ATOMIC_UINT AtomicExchange(volatile ATOMIC_UINT *pValue,
|
|
Packit |
857059 |
uint32 newValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return __sync_lock_test_and_set(pValue,newValue);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline boolean AtomicCompareStore(volatile ATOMIC_UINT *pValue,
|
|
Packit |
857059 |
ATOMIC_UINT oldValue,
|
|
Packit |
857059 |
ATOMIC_UINT newValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return __sync_bool_compare_and_swap(pValue, oldValue, newValue);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline ATOMIC_UINT AtomicAdd(ATOMIC_UINT *pValue,
|
|
Packit |
857059 |
ATOMIC_UINT add)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return __sync_add_and_fetch(pValue, add);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline void AtomicAddVoid(ATOMIC_UINT *pValue, ATOMIC_UINT add)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
(void)AtomicAdd(pValue, add);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline ATOMIC_UINT AtomicSubtract(ATOMIC_UINT *pValue,
|
|
Packit |
857059 |
ATOMIC_UINT sub)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return __sync_sub_and_fetch(pValue, sub);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline void AtomicSubtractVoid(ATOMIC_UINT *pValue, uint32 sub)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
(void)AtomicSubtract(pValue, sub);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline ATOMIC_UINT AtomicIncrement(ATOMIC_UINT *pValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return AtomicAdd(pValue, 1);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline void AtomicIncrementVoid(ATOMIC_UINT *pValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
AtomicAddVoid(pValue, 1);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline ATOMIC_UINT AtomicDecrement(ATOMIC_UINT *pValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
return AtomicSubtract(pValue, 1);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static inline void AtomicDecrementVoid(ATOMIC_UINT *pValue)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
AtomicSubtractVoid(pValue, 1);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
/* for user mode barriers we always use the SMP safe versions */
|
|
Packit |
857059 |
#if defined(__i386__) || defined(__i686__) || defined(__IA32__)
|
|
Packit |
857059 |
/* Some non intel clones support out of order store. be conservative */
|
|
Packit |
857059 |
static _inline void IoBarrierRead(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierReadWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory"); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuBarrierRead(void) {IoBarrierRead(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierWrite(void) {IoBarrierWrite(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierReadWrite(void) {IoBarrierReadWrite(); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuPrefetch(void *addr)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
asm volatile("prefetchnta (%0)" :: "r" (addr));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
#elif defined(__x86_64__) || defined(__X64_64__)
|
|
Packit |
857059 |
static _inline void IoBarrierRead(void) { asm volatile("lfence":::"memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierWrite(void) { asm volatile("sfence":::"memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierReadWrite(void){asm volatile("mfence":::"memory");}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuBarrierRead(void) {IoBarrierRead(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierWrite(void) {IoBarrierWrite(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierReadWrite(void) {IoBarrierReadWrite(); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuPrefetch(void *addr)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)addr));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
#elif defined(__ia64__) || defined(__IA64__)
|
|
Packit |
857059 |
static _inline void IoBarrierRead(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("mf" ::: "memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("mf" ::: "memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierReadWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("mf" ::: "memory"); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuBarrierRead(void) {IoBarrierRead(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierWrite(void) {IoBarrierWrite(); }
|
|
Packit |
857059 |
static _inline void CpuBarrierReadWrite(void) {IoBarrierReadWrite(); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuPrefetch(void *addr)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
asm volatile("lfetch [%0]" :: "r" (addr));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
#elif defined(__ppc__) || defined(__PPC__)
|
|
Packit |
857059 |
static _inline void IoBarrierRead(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("eieio" : : : "memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("eieio" : : : "memory"); }
|
|
Packit |
857059 |
static _inline void IoBarrierReadWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("eieio" : : : "memory"); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuBarrierRead(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("isync" : : : "memory"); }
|
|
Packit |
857059 |
static _inline void CpuBarrierWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("eieio" : : : "memory"); }
|
|
Packit |
857059 |
static _inline void CpuBarrierReadWrite(void)
|
|
Packit |
857059 |
{ __asm__ __volatile__ ("isync" : : : "memory"); }
|
|
Packit |
857059 |
|
|
Packit |
857059 |
static _inline void CpuPrefetch(void *addr)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
asm volatile("dcbt 0,%0" :: "r" (addr));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
#else
|
|
Packit |
857059 |
#error "Unsupported CPU type"
|
|
Packit |
857059 |
#endif
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#ifdef __cplusplus
|
|
Packit |
857059 |
};
|
|
Packit |
857059 |
#endif
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#endif /* _IBA_PUBLIC_ISPINLOCK_OSD_H */
|