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