|
PAPI
5.1.0.2
|
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