1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_PARISC_JUMP_LABEL_H 3*4882a593Smuzhiyun #define _ASM_PARISC_JUMP_LABEL_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <linux/types.h> 8*4882a593Smuzhiyun #include <asm/assembly.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define JUMP_LABEL_NOP_SIZE 4 11*4882a593Smuzhiyun arch_static_branch(struct static_key * key,bool branch)12*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch(struct static_key *key, bool branch) 13*4882a593Smuzhiyun { 14*4882a593Smuzhiyun asm_volatile_goto("1:\n\t" 15*4882a593Smuzhiyun "nop\n\t" 16*4882a593Smuzhiyun ".pushsection __jump_table, \"aw\"\n\t" 17*4882a593Smuzhiyun ".word 1b - ., %l[l_yes] - .\n\t" 18*4882a593Smuzhiyun __stringify(ASM_ULONG_INSN) " %c0 - .\n\t" 19*4882a593Smuzhiyun ".popsection\n\t" 20*4882a593Smuzhiyun : : "i" (&((char *)key)[branch]) : : l_yes); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun return false; 23*4882a593Smuzhiyun l_yes: 24*4882a593Smuzhiyun return true; 25*4882a593Smuzhiyun } 26*4882a593Smuzhiyun arch_static_branch_jump(struct static_key * key,bool branch)27*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun asm_volatile_goto("1:\n\t" 30*4882a593Smuzhiyun "b,n %l[l_yes]\n\t" 31*4882a593Smuzhiyun ".pushsection __jump_table, \"aw\"\n\t" 32*4882a593Smuzhiyun ".word 1b - ., %l[l_yes] - .\n\t" 33*4882a593Smuzhiyun __stringify(ASM_ULONG_INSN) " %c0 - .\n\t" 34*4882a593Smuzhiyun ".popsection\n\t" 35*4882a593Smuzhiyun : : "i" (&((char *)key)[branch]) : : l_yes); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun return false; 38*4882a593Smuzhiyun l_yes: 39*4882a593Smuzhiyun return true; 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 43*4882a593Smuzhiyun #endif 44