blob: 307c00eb7e776139c03f3c9340e52d9c2d7e480c [file] [log] [blame]
#pragma once
/* Full CPU memory barrier */
#define mb() ({ asm volatile("mfence" ::: "memory"); })
/* Compiler memory barrier (optimization barrier) */
#define cmb() ({ asm volatile("" ::: "memory"); })
/* Partial CPU memory barriers */
#define rmb() cmb()
#define wmb() cmb()
#define wrmb() mb()
#define rwmb() cmb()
/* Forced barriers, used for string ops, SSE ops, dealing with hardware, or
* other places where you avoid 'normal' x86 read/writes (like having an IPI
* beat a write) */
#define mb_f() ({ asm volatile("mfence" ::: "memory"); })
#define rmb_f() ({ asm volatile("lfence" ::: "memory"); })
#define wmb_f() ({ asm volatile("sfence" ::: "memory"); })
#define wrmb_f() mb_f()
#define rwmb_f() mb_f()
/* Bus memory barriers */
#define bus_wmb() cmb()
#define bus_rmb() asm volatile("lock; addl $0,0(%%rsp)" : : : "memory")