19732cafdSJiang Liu /*
29732cafdSJiang Liu  * Copyright (C) 2013 Huawei Ltd.
39732cafdSJiang Liu  * Author: Jiang Liu <liuj97@gmail.com>
49732cafdSJiang Liu  *
59732cafdSJiang Liu  * Based on arch/arm/include/asm/jump_label.h
69732cafdSJiang Liu  *
79732cafdSJiang Liu  * This program is free software; you can redistribute it and/or modify
89732cafdSJiang Liu  * it under the terms of the GNU General Public License version 2 as
99732cafdSJiang Liu  * published by the Free Software Foundation.
109732cafdSJiang Liu  *
119732cafdSJiang Liu  * This program is distributed in the hope that it will be useful,
129732cafdSJiang Liu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
139732cafdSJiang Liu  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
149732cafdSJiang Liu  * GNU General Public License for more details.
159732cafdSJiang Liu  *
169732cafdSJiang Liu  * You should have received a copy of the GNU General Public License
179732cafdSJiang Liu  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
189732cafdSJiang Liu  */
199732cafdSJiang Liu #ifndef __ASM_JUMP_LABEL_H
209732cafdSJiang Liu #define __ASM_JUMP_LABEL_H
2155dd0df7SAnton Blanchard 
2255dd0df7SAnton Blanchard #ifndef __ASSEMBLY__
2355dd0df7SAnton Blanchard 
249732cafdSJiang Liu #include <linux/types.h>
259732cafdSJiang Liu #include <asm/insn.h>
269732cafdSJiang Liu 
279732cafdSJiang Liu #define JUMP_LABEL_NOP_SIZE		AARCH64_INSN_SIZE
289732cafdSJiang Liu 
299732cafdSJiang Liu static __always_inline bool arch_static_branch(struct static_key *key)
309732cafdSJiang Liu {
319732cafdSJiang Liu 	asm goto("1: nop\n\t"
329732cafdSJiang Liu 		 ".pushsection __jump_table,  \"aw\"\n\t"
339732cafdSJiang Liu 		 ".align 3\n\t"
349732cafdSJiang Liu 		 ".quad 1b, %l[l_yes], %c0\n\t"
359732cafdSJiang Liu 		 ".popsection\n\t"
369732cafdSJiang Liu 		 :  :  "i"(key) :  : l_yes);
379732cafdSJiang Liu 
389732cafdSJiang Liu 	return false;
399732cafdSJiang Liu l_yes:
409732cafdSJiang Liu 	return true;
419732cafdSJiang Liu }
429732cafdSJiang Liu 
439732cafdSJiang Liu typedef u64 jump_label_t;
449732cafdSJiang Liu 
459732cafdSJiang Liu struct jump_entry {
469732cafdSJiang Liu 	jump_label_t code;
479732cafdSJiang Liu 	jump_label_t target;
489732cafdSJiang Liu 	jump_label_t key;
499732cafdSJiang Liu };
509732cafdSJiang Liu 
5155dd0df7SAnton Blanchard #endif  /* __ASSEMBLY__ */
529732cafdSJiang Liu #endif	/* __ASM_JUMP_LABEL_H */
53