2011-06-29 19:16:59 +00:00
# ifndef _ASM_POWERPC_JUMP_LABEL_H
# define _ASM_POWERPC_JUMP_LABEL_H
/*
* Copyright 2010 Michael Ellerman , IBM Corp .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2014-07-03 15:52:03 +10:00
# ifndef __ASSEMBLY__
2011-06-29 19:16:59 +00:00
# include <linux/types.h>
# include <asm/feature-fixups.h>
2016-08-03 13:46:24 -07:00
# include <asm/asm-compat.h>
2011-06-29 19:16:59 +00:00
# define JUMP_ENTRY_TYPE stringify_in_c(FTR_ENTRY_LONG)
# define JUMP_LABEL_NOP_SIZE 4
2015-07-24 15:09:55 +02:00
static __always_inline bool arch_static_branch ( struct static_key * key , bool branch )
2011-06-29 19:16:59 +00:00
{
2013-10-10 10:16:30 +02:00
asm_volatile_goto ( " 1: \n \t "
2016-07-27 15:35:55 +10:00
" nop # arch_static_branch \n \t "
2011-06-29 19:16:59 +00:00
" .pushsection __jump_table, \" aw \" \n \t "
JUMP_ENTRY_TYPE " 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 )
{
asm_volatile_goto ( " 1: \n \t "
2016-07-27 15:35:55 +10:00
" b %l[l_yes] # arch_static_branch_jump \n \t "
2015-07-24 15:09:55 +02:00
" .pushsection __jump_table, \" aw \" \n \t "
JUMP_ENTRY_TYPE " 1b, %l[l_yes], %c0 \n \t "
" .popsection \n \t "
: : " i " ( & ( ( char * ) key ) [ branch ] ) : : l_yes ) ;
2011-06-29 19:16:59 +00:00
return false ;
l_yes :
return true ;
}
# ifdef CONFIG_PPC64
typedef u64 jump_label_t ;
# else
typedef u32 jump_label_t ;
# endif
struct jump_entry {
jump_label_t code ;
jump_label_t target ;
jump_label_t key ;
} ;
2014-07-03 15:52:03 +10:00
# else
# define ARCH_STATIC_BRANCH(LABEL, KEY) \
1098 : nop ; \
. pushsection __jump_table , " aw " ; \
FTR_ENTRY_LONG 1098 b , LABEL , KEY ; \
. popsection
# endif
2011-06-29 19:16:59 +00:00
# endif /* _ASM_POWERPC_JUMP_LABEL_H */