1#ifndef _ASM_X86_JUMP_LABEL_H 2#define _ASM_X86_JUMP_LABEL_H 3 4#ifndef __ASSEMBLY__ 5 6#include <linux/stringify.h> 7#include <linux/types.h> 8#include <asm/nops.h> 9#include <asm/asm.h> 10 11#define JUMP_LABEL_NOP_SIZE 5 12 13#ifdef CONFIG_X86_64 14# define STATIC_KEY_INIT_NOP P6_NOP5_ATOMIC 15#else 16# define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC 17#endif 18 19static __always_inline bool arch_static_branch(struct static_key *key) 20{ 21 asm_volatile_goto("1:" 22 ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t" 23 ".pushsection __jump_table, \"aw\" \n\t" 24 _ASM_ALIGN "\n\t" 25 _ASM_PTR "1b, %l[l_yes], %c0 \n\t" 26 ".popsection \n\t" 27 : : "i" (key) : : l_yes); 28 return false; 29l_yes: 30 return true; 31} 32 33#ifdef CONFIG_X86_64 34typedef u64 jump_label_t; 35#else 36typedef u32 jump_label_t; 37#endif 38 39struct jump_entry { 40 jump_label_t code; 41 jump_label_t target; 42 jump_label_t key; 43}; 44 45#endif /* __ASSEMBLY__ */ 46#endif 47