|
PAPI
5.0.1.0
|
00001 #ifndef _MB_H 00002 #define _MB_H 00003 00004 /* These definitions are not yet in distros, so I have cut and pasted just 00005 the needed definitions in here */ 00006 00007 #ifdef __powerpc__ 00008 #define mb() __asm__ __volatile__ ("sync" : : : "memory") 00009 #define rmb() __asm__ __volatile__ ("sync" : : : "memory") 00010 #define wmb() __asm__ __volatile__ ("sync" : : : "memory") 00011 00012 #elif defined(__mips__) 00013 #define mb() __asm__ __volatile__ ("sync" : : : "memory") 00014 #define rmb() __asm__ __volatile__ ("sync" : : : "memory") 00015 #define wmb() __asm__ __volatile__ ("sync" : : : "memory") 00016 00017 #elif defined(__arm__) 00018 #define rmb() __sync_synchronize() 00019 #define mb() rmb() 00020 #define wmb() rmb() 00021 00022 #elif defined(__ia64__) 00023 #define ia64_mf() __asm__ __volatile__ ("mf" ::: "memory") 00024 #define mb() ia64_mf() 00025 #define rmb() mb() 00026 #define wmb() mb() 00027 00028 #elif defined(__x86_64__) || defined(__i386__) 00029 #ifdef CONFIG_X86_32 00030 /* 00031 * Some non-Intel clones support out of order store. wmb() ceases to be a 00032 * nop for these. 00033 */ 00034 #define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2) 00035 #define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2) 00036 #define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM) 00037 #else 00038 #define mb() asm volatile("mfence":::"memory") 00039 #define rmb() asm volatile("lfence":::"memory") 00040 #define wmb() asm volatile("sfence" ::: "memory") 00041 #endif 00042 00043 #else 00044 #error Need to define mb and rmb for this architecture! 00045 #error See the kernel source directory: arch/<arch>/include/asm/system.h file 00046 #endif 00047 00048 #endif