PAPI  5.0.1.0
mb.h
Go to the documentation of this file.
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
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines