root/arch/sparc/include/asm/vdso/processor.h
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _ASM_SPARC_VDSO_PROCESSOR_H
#define _ASM_SPARC_VDSO_PROCESSOR_H

#include <linux/compiler.h>

#if defined(__arch64__)

/* Please see the commentary in asm/backoff.h for a description of
 * what these instructions are doing and how they have been chosen.
 * To make a long story short, we are trying to yield the current cpu
 * strand during busy loops.
 */
#ifdef  BUILD_VDSO
#define cpu_relax()     asm volatile("\n99:\n\t"                        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     ::: "memory")
#else /* ! BUILD_VDSO */
#define cpu_relax()     asm volatile("\n99:\n\t"                        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     "rd        %%ccr, %%g0\n\t"        \
                                     ".section  .pause_3insn_patch,\"ax\"\n\t"\
                                     ".word     99b\n\t"                \
                                     "wr        %%g0, 128, %%asr27\n\t" \
                                     "nop\n\t"                          \
                                     "nop\n\t"                          \
                                     ".previous"                        \
                                     ::: "memory")
#endif /* BUILD_VDSO */

#else /* ! __arch64__ */

#define cpu_relax()     barrier()

#endif /* __arch64__ */

#endif /* _ASM_SPARC_VDSO_PROCESSOR_H */