PAPI  5.1.0.2
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 rmb() asm volatile ("sync" : : : "memory")
00009 
00010 #elif defined (__s390__)
00011 #define rmb() asm volatile("bcr 15,0" ::: "memory")
00012 
00013 #elif defined (__sh__)
00014 #if defined(__SH4A__) || defined(__SH5__)
00015 #define rmb()          asm volatile("synco" ::: "memory")
00016 #else
00017 #define rmb()          asm volatile("" ::: "memory")
00018 #endif
00019 
00020 #elif defined (__hppa__)
00021 #define rmb()           asm volatile("" ::: "memory")
00022 
00023 #elif defined (__sparc__)
00024 #define rmb()           asm volatile("":::"memory")
00025 
00026 #elif defined (__alpha__)
00027 #define rmb()           asm volatile("mb" ::: "memory")
00028 
00029 #elif defined(__ia64__)
00030 #define rmb()           asm volatile ("mf" ::: "memory")
00031 
00032 #elif defined(__arm__)
00033 /*
00034  * Use the __kuser_memory_barrier helper in the CPU helper page. See
00035  * arch/arm/kernel/entry-armv.S in the kernel source for details.
00036  */
00037 #define rmb()           ((void(*)(void))0xffff0fa0)()
00038 
00039 #elif defined(__aarch64__)
00040 #define rmb()           asm volatile("dmb ld" ::: "memory")
00041 
00042 #elif defined(__mips__)
00043 #define rmb()           asm volatile(                                   \
00044                                 ".set   mips2\n\t"                      \
00045                                 "sync\n\t"                              \
00046                                 ".set   mips0"                          \
00047                 : /* no output */                       \
00048                 : /* no input */                        \
00049                 : "memory")
00050 
00051 #elif defined(__i386__)
00052 #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory")
00053 
00054 #elif defined(__x86_64)
00055 
00056 #if defined(__KNC__)
00057 #define rmb() __sync_synchronize()
00058 
00059 #else
00060 #define rmb() asm volatile("lfence":::"memory")
00061 #endif
00062 
00063 #else
00064 #error Need to define rmb for this architecture!
00065 #error See the kernel source directory: tools/perf/perf.h file
00066 #endif
00067 
00068 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines