xref: /kvm-unit-tests/lib/x86/asm/barrier.h (revision c865f654ffe4c5955038aaf74f702ba62f3eb014)
1*c865f654SCornelia Huck #ifndef _ASMX86_BARRIER_H_
2*c865f654SCornelia Huck #define _ASMX86_BARRIER_H_
38226c540SAlexander Gordeev /*
48226c540SAlexander Gordeev  * Copyright (C) 2016, Red Hat Inc, Alexander Gordeev <agordeev@redhat.com>
58226c540SAlexander Gordeev  *
68226c540SAlexander Gordeev  * This work is licensed under the terms of the GNU LGPL, version 2.
78226c540SAlexander Gordeev  */
88226c540SAlexander Gordeev 
98226c540SAlexander Gordeev #define mb()	asm volatile("mfence":::"memory")
108226c540SAlexander Gordeev #define rmb()	asm volatile("lfence":::"memory")
118226c540SAlexander Gordeev #define wmb()	asm volatile("sfence":::"memory")
128226c540SAlexander Gordeev 
1353776986SRoman Kagan #define smp_rmb()	barrier()
1453776986SRoman Kagan #define smp_wmb()	barrier()
1553776986SRoman Kagan 
16d77d128fSPeter Xu /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
rep_nop(void)17d77d128fSPeter Xu static inline void rep_nop(void)
18d77d128fSPeter Xu {
19d77d128fSPeter Xu 	asm volatile("rep; nop" ::: "memory");
20d77d128fSPeter Xu }
21d77d128fSPeter Xu 
cpu_relax(void)22d77d128fSPeter Xu static inline void cpu_relax(void)
23d77d128fSPeter Xu {
24d77d128fSPeter Xu 	rep_nop();
25d77d128fSPeter Xu }
26d77d128fSPeter Xu 
278226c540SAlexander Gordeev #endif
28