at v6.0 36 lines 830 B view raw
1/* SPDX-License-Identifier: GPL-2.0-only */ 2#ifndef __ASM_VDSO_PROCESSOR_H 3#define __ASM_VDSO_PROCESSOR_H 4 5#ifndef __ASSEMBLY__ 6 7#include <linux/jump_label.h> 8#include <asm/barrier.h> 9#include <asm/hwcap.h> 10 11static inline void cpu_relax(void) 12{ 13 if (!static_branch_likely(&riscv_isa_ext_keys[RISCV_ISA_EXT_KEY_ZIHINTPAUSE])) { 14#ifdef __riscv_muldiv 15 int dummy; 16 /* In lieu of a halt instruction, induce a long-latency stall. */ 17 __asm__ __volatile__ ("div %0, %0, zero" : "=r" (dummy)); 18#endif 19 } else { 20 /* 21 * Reduce instruction retirement. 22 * This assumes the PC changes. 23 */ 24#ifdef __riscv_zihintpause 25 __asm__ __volatile__ ("pause"); 26#else 27 /* Encoding of the pause instruction */ 28 __asm__ __volatile__ (".4byte 0x100000F"); 29#endif 30 } 31 barrier(); 32} 33 34#endif /* __ASSEMBLY__ */ 35 36#endif /* __ASM_VDSO_PROCESSOR_H */