linux/arch/mips/include/asm/jump_label.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (c) 2010 Cavium Networks, Inc.
   7 */
   8#ifndef _ASM_MIPS_JUMP_LABEL_H
   9#define _ASM_MIPS_JUMP_LABEL_H
  10
  11#ifndef __ASSEMBLY__
  12
  13#include <linux/types.h>
  14
  15#define JUMP_LABEL_NOP_SIZE 4
  16
  17#ifdef CONFIG_64BIT
  18#define WORD_INSN ".dword"
  19#else
  20#define WORD_INSN ".word"
  21#endif
  22
  23#ifdef CONFIG_CPU_MICROMIPS
  24#define NOP_INSN "nop32"
  25#else
  26#define NOP_INSN "nop"
  27#endif
  28
  29static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
  30{
  31        asm_volatile_goto("1:\t" NOP_INSN "\n\t"
  32                "nop\n\t"
  33                ".pushsection __jump_table,  \"aw\"\n\t"
  34                WORD_INSN " 1b, %l[l_yes], %0\n\t"
  35                ".popsection\n\t"
  36                : :  "i" (&((char *)key)[branch]) : : l_yes);
  37
  38        return false;
  39l_yes:
  40        return true;
  41}
  42
  43static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
  44{
  45        asm_volatile_goto("1:\tj %l[l_yes]\n\t"
  46                "nop\n\t"
  47                ".pushsection __jump_table,  \"aw\"\n\t"
  48                WORD_INSN " 1b, %l[l_yes], %0\n\t"
  49                ".popsection\n\t"
  50                : :  "i" (&((char *)key)[branch]) : : l_yes);
  51
  52        return false;
  53l_yes:
  54        return true;
  55}
  56
  57#ifdef CONFIG_64BIT
  58typedef u64 jump_label_t;
  59#else
  60typedef u32 jump_label_t;
  61#endif
  62
  63struct jump_entry {
  64        jump_label_t code;
  65        jump_label_t target;
  66        jump_label_t key;
  67};
  68
  69#endif  /* __ASSEMBLY__ */
  70#endif /* _ASM_MIPS_JUMP_LABEL_H */
  71