1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2013 Huawei Ltd. 4*4882a593Smuzhiyun * Author: Jiang Liu <liuj97@gmail.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Based on arch/arm/include/asm/jump_label.h 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun #ifndef __ASM_JUMP_LABEL_H 9*4882a593Smuzhiyun #define __ASM_JUMP_LABEL_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <asm/insn.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE 17*4882a593Smuzhiyun arch_static_branch(struct static_key * key,bool branch)18*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch(struct static_key *key, 19*4882a593Smuzhiyun bool branch) 20*4882a593Smuzhiyun { 21*4882a593Smuzhiyun asm_volatile_goto( 22*4882a593Smuzhiyun "1: nop \n\t" 23*4882a593Smuzhiyun " .pushsection __jump_table, \"aw\" \n\t" 24*4882a593Smuzhiyun " .align 3 \n\t" 25*4882a593Smuzhiyun " .long 1b - ., %l[l_yes] - . \n\t" 26*4882a593Smuzhiyun " .quad %c0 - . \n\t" 27*4882a593Smuzhiyun " .popsection \n\t" 28*4882a593Smuzhiyun : : "i"(&((char *)key)[branch]) : : l_yes); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun return false; 31*4882a593Smuzhiyun l_yes: 32*4882a593Smuzhiyun return true; 33*4882a593Smuzhiyun } 34*4882a593Smuzhiyun arch_static_branch_jump(struct static_key * key,bool branch)35*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch_jump(struct static_key *key, 36*4882a593Smuzhiyun bool branch) 37*4882a593Smuzhiyun { 38*4882a593Smuzhiyun asm_volatile_goto( 39*4882a593Smuzhiyun "1: b %l[l_yes] \n\t" 40*4882a593Smuzhiyun " .pushsection __jump_table, \"aw\" \n\t" 41*4882a593Smuzhiyun " .align 3 \n\t" 42*4882a593Smuzhiyun " .long 1b - ., %l[l_yes] - . \n\t" 43*4882a593Smuzhiyun " .quad %c0 - . \n\t" 44*4882a593Smuzhiyun " .popsection \n\t" 45*4882a593Smuzhiyun : : "i"(&((char *)key)[branch]) : : l_yes); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun return false; 48*4882a593Smuzhiyun l_yes: 49*4882a593Smuzhiyun return true; 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 53*4882a593Smuzhiyun #endif /* __ASM_JUMP_LABEL_H */ 54