mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

If we're going to provide the encoding for 'pause' in cpu_relax() anyway, then we can drop the toolchain checks and just always use it. The advantage of doing this is that other code that need pause don't need to also define it (yes, another use is coming). Add the definition to insn-def.h since it's an instruction definition and also because insn-def.h doesn't include much, so it's safe to include from asm/vdso/processor.h without concern for circular dependencies. Signed-off-by: Andrew Jones <ajones@ventanamicro.com> Link: https://lore.kernel.org/r/20240426100820.14762-9-ajones@ventanamicro.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
28 lines
578 B
C
28 lines
578 B
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
#ifndef __ASM_VDSO_PROCESSOR_H
|
|
#define __ASM_VDSO_PROCESSOR_H
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <asm/barrier.h>
|
|
#include <asm/insn-def.h>
|
|
|
|
static inline void cpu_relax(void)
|
|
{
|
|
#ifdef __riscv_muldiv
|
|
int dummy;
|
|
/* In lieu of a halt instruction, induce a long-latency stall. */
|
|
__asm__ __volatile__ ("div %0, %0, zero" : "=r" (dummy));
|
|
#endif
|
|
|
|
/*
|
|
* Reduce instruction retirement.
|
|
* This assumes the PC changes.
|
|
*/
|
|
__asm__ __volatile__ (RISCV_PAUSE);
|
|
barrier();
|
|
}
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* __ASM_VDSO_PROCESSOR_H */
|