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#define arch_jump_label_transform_static arch_jump_label_transform 12 13#ifndef __ASSEMBLY__ 14 15#include <linux/types.h> 16#include <asm/isa-rev.h> 17 18struct module; 19extern void jump_label_apply_nops(struct module *mod); 20 21#define JUMP_LABEL_NOP_SIZE 4 22 23#ifdef CONFIG_64BIT 24#define WORD_INSN ".dword" 25#else 26#define WORD_INSN ".word" 27#endif 28 29#ifdef CONFIG_CPU_MICROMIPS 30# define B_INSN "b32" 31# define J_INSN "j32" 32#elif MIPS_ISA_REV >= 6 33# define B_INSN "bc" 34# define J_INSN "bc" 35#else 36# define B_INSN "b" 37# define J_INSN "j" 38#endif 39 40static __always_inline bool arch_static_branch(struct static_key *key, bool branch) 41{ 42 asm goto("1:\t" B_INSN " 2f\n\t" 43 "2:\t.insn\n\t" 44 ".pushsection __jump_table, \"aw\"\n\t" 45 WORD_INSN " 1b, %l[l_yes], %0\n\t" 46 ".popsection\n\t" 47 : : "i" (&((char *)key)[branch]) : : l_yes); 48 49 return false; 50l_yes: 51 return true; 52} 53 54static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch) 55{ 56 asm goto("1:\t" J_INSN " %l[l_yes]\n\t" 57 ".pushsection __jump_table, \"aw\"\n\t" 58 WORD_INSN " 1b, %l[l_yes], %0\n\t" 59 ".popsection\n\t" 60 : : "i" (&((char *)key)[branch]) : : l_yes); 61 62 return false; 63l_yes: 64 return true; 65} 66 67#ifdef CONFIG_64BIT 68typedef u64 jump_label_t; 69#else 70typedef u32 jump_label_t; 71#endif 72 73struct jump_entry { 74 jump_label_t code; 75 jump_label_t target; 76 jump_label_t key; 77}; 78 79#endif /* __ASSEMBLY__ */ 80#endif /* _ASM_MIPS_JUMP_LABEL_H */ 81