root/arch/x86/include/asm/jump_label.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. arch_static_branch
  2. arch_static_branch_jump

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _ASM_X86_JUMP_LABEL_H
   3 #define _ASM_X86_JUMP_LABEL_H
   4 
   5 #define HAVE_JUMP_LABEL_BATCH
   6 
   7 #define JUMP_LABEL_NOP_SIZE 5
   8 
   9 #ifdef CONFIG_X86_64
  10 # define STATIC_KEY_INIT_NOP P6_NOP5_ATOMIC
  11 #else
  12 # define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC
  13 #endif
  14 
  15 #include <asm/asm.h>
  16 #include <asm/nops.h>
  17 
  18 #ifndef __ASSEMBLY__
  19 
  20 #include <linux/stringify.h>
  21 #include <linux/types.h>
  22 
  23 static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
  24 {
  25         asm_volatile_goto("1:"
  26                 ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
  27                 ".pushsection __jump_table,  \"aw\" \n\t"
  28                 _ASM_ALIGN "\n\t"
  29                 ".long 1b - ., %l[l_yes] - . \n\t"
  30                 _ASM_PTR "%c0 + %c1 - .\n\t"
  31                 ".popsection \n\t"
  32                 : :  "i" (key), "i" (branch) : : l_yes);
  33 
  34         return false;
  35 l_yes:
  36         return true;
  37 }
  38 
  39 static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
  40 {
  41         asm_volatile_goto("1:"
  42                 ".byte 0xe9\n\t .long %l[l_yes] - 2f\n\t"
  43                 "2:\n\t"
  44                 ".pushsection __jump_table,  \"aw\" \n\t"
  45                 _ASM_ALIGN "\n\t"
  46                 ".long 1b - ., %l[l_yes] - . \n\t"
  47                 _ASM_PTR "%c0 + %c1 - .\n\t"
  48                 ".popsection \n\t"
  49                 : :  "i" (key), "i" (branch) : : l_yes);
  50 
  51         return false;
  52 l_yes:
  53         return true;
  54 }
  55 
  56 #else   /* __ASSEMBLY__ */
  57 
  58 .macro STATIC_JUMP_IF_TRUE target, key, def
  59 .Lstatic_jump_\@:
  60         .if \def
  61         /* Equivalent to "jmp.d32 \target" */
  62         .byte           0xe9
  63         .long           \target - .Lstatic_jump_after_\@
  64 .Lstatic_jump_after_\@:
  65         .else
  66         .byte           STATIC_KEY_INIT_NOP
  67         .endif
  68         .pushsection __jump_table, "aw"
  69         _ASM_ALIGN
  70         .long           .Lstatic_jump_\@ - ., \target - .
  71         _ASM_PTR        \key - .
  72         .popsection
  73 .endm
  74 
  75 .macro STATIC_JUMP_IF_FALSE target, key, def
  76 .Lstatic_jump_\@:
  77         .if \def
  78         .byte           STATIC_KEY_INIT_NOP
  79         .else
  80         /* Equivalent to "jmp.d32 \target" */
  81         .byte           0xe9
  82         .long           \target - .Lstatic_jump_after_\@
  83 .Lstatic_jump_after_\@:
  84         .endif
  85         .pushsection __jump_table, "aw"
  86         _ASM_ALIGN
  87         .long           .Lstatic_jump_\@ - ., \target - .
  88         _ASM_PTR        \key + 1 - .
  89         .popsection
  90 .endm
  91 
  92 #endif  /* __ASSEMBLY__ */
  93 
  94 #endif

/* [<][>][^][v][top][bottom][index][help] */