2014-01-07 22:17:13 +08:00
/*
* Copyright ( C ) 2013 Huawei Ltd .
* Author : Jiang Liu < liuj97 @ gmail . com >
*
* Based on arch / arm / include / asm / jump_label . h
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __ASM_JUMP_LABEL_H
# define __ASM_JUMP_LABEL_H
2015-04-09 13:51:30 +10:00
# ifndef __ASSEMBLY__
2014-01-07 22:17:13 +08:00
# include <linux/types.h>
# include <asm/insn.h>
# define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE
2015-07-24 15:09:55 +02:00
static __always_inline bool arch_static_branch ( struct static_key * key , bool branch )
2014-01-07 22:17:13 +08:00
{
2018-09-09 17:47:31 +02:00
asm_volatile_goto ( " 1: nop \n \t "
2014-01-07 22:17:13 +08:00
" .pushsection __jump_table, \" aw \" \n \t "
" .align 3 \n \t "
" .quad 1b, %l[l_yes], %c0 \n \t "
" .popsection \n \t "
2015-07-24 15:09:55 +02:00
: : " i " ( & ( ( char * ) key ) [ branch ] ) : : l_yes ) ;
return false ;
l_yes :
return true ;
}
static __always_inline bool arch_static_branch_jump ( struct static_key * key , bool branch )
{
2018-09-09 17:47:31 +02:00
asm_volatile_goto ( " 1: b %l[l_yes] \n \t "
2015-07-24 15:09:55 +02:00
" .pushsection __jump_table, \" aw \" \n \t "
" .align 3 \n \t "
" .quad 1b, %l[l_yes], %c0 \n \t "
" .popsection \n \t "
: : " i " ( & ( ( char * ) key ) [ branch ] ) : : l_yes ) ;
2014-01-07 22:17:13 +08:00
return false ;
l_yes :
return true ;
}
typedef u64 jump_label_t ;
struct jump_entry {
jump_label_t code ;
jump_label_t target ;
jump_label_t key ;
} ;
2015-04-09 13:51:30 +10:00
# endif /* __ASSEMBLY__ */
2014-01-07 22:17:13 +08:00
# endif /* __ASM_JUMP_LABEL_H */