Message ID | 1460050358-25025-6-git-send-email-cota@braap.org |
---|---|
State | New |
Headers | show |
On 04/07/2016 10:32 AM, Emilio G. Cota wrote: > Taken from the linux kernel. > > Signed-off-by: Emilio G. Cota <cota@braap.org> > --- > include/qemu/processor.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > create mode 100644 include/qemu/processor.h Reviewed-by: Richard Henderson <rth@twiddle.net> > +#if defined(__i386__) || defined(__x86_64__) > +#define cpu_relax() asm volatile("rep; nop" ::: "memory") > +#endif Not that it matters much, but for the record there's an ICC inspired builtin in <xmmintrin.h> for this: _mm_pause(). But so long as we're always using gcc or clang, that's probably just an extra dependency to worry about. r~
diff --git a/include/qemu/processor.h b/include/qemu/processor.h new file mode 100644 index 0000000..675a00a --- /dev/null +++ b/include/qemu/processor.h @@ -0,0 +1,28 @@ +#ifndef QEMU_PROCESSOR_H +#define QEMU_PROCESSOR_H + +#include "qemu/atomic.h" + +#if defined(__i386__) || defined(__x86_64__) +#define cpu_relax() asm volatile("rep; nop" ::: "memory") +#endif + +#ifdef __ia64__ +#define cpu_relax() asm volatile("hint @pause" ::: "memory") +#endif + +#ifdef __aarch64__ +#define cpu_relax() asm volatile("yield" ::: "memory") +#endif + +#if defined(__powerpc64__) +/* set Hardware Multi-Threading (HMT) priority to low; then back to medium */ +#define cpu_relax() asm volatile("or 1, 1, 1;" + "or 2, 2, 2;" ::: "memory") +#endif + +#ifndef cpu_relax +#define cpu_relax() barrier() +#endif + +#endif /* QEMU_PROCESSOR_H */
Taken from the linux kernel. Signed-off-by: Emilio G. Cota <cota@braap.org> --- include/qemu/processor.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 include/qemu/processor.h