19732cafdSJiang Liu /* 29732cafdSJiang Liu * Copyright (C) 2013 Huawei Ltd. 39732cafdSJiang Liu * Author: Jiang Liu <liuj97@gmail.com> 49732cafdSJiang Liu * 59732cafdSJiang Liu * Based on arch/arm/include/asm/jump_label.h 69732cafdSJiang Liu * 79732cafdSJiang Liu * This program is free software; you can redistribute it and/or modify 89732cafdSJiang Liu * it under the terms of the GNU General Public License version 2 as 99732cafdSJiang Liu * published by the Free Software Foundation. 109732cafdSJiang Liu * 119732cafdSJiang Liu * This program is distributed in the hope that it will be useful, 129732cafdSJiang Liu * but WITHOUT ANY WARRANTY; without even the implied warranty of 139732cafdSJiang Liu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 149732cafdSJiang Liu * GNU General Public License for more details. 159732cafdSJiang Liu * 169732cafdSJiang Liu * You should have received a copy of the GNU General Public License 179732cafdSJiang Liu * along with this program. If not, see <http://www.gnu.org/licenses/>. 189732cafdSJiang Liu */ 199732cafdSJiang Liu #ifndef __ASM_JUMP_LABEL_H 209732cafdSJiang Liu #define __ASM_JUMP_LABEL_H 2155dd0df7SAnton Blanchard 2255dd0df7SAnton Blanchard #ifndef __ASSEMBLY__ 2355dd0df7SAnton Blanchard 249732cafdSJiang Liu #include <linux/types.h> 259732cafdSJiang Liu #include <asm/insn.h> 269732cafdSJiang Liu 279732cafdSJiang Liu #define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE 289732cafdSJiang Liu 299732cafdSJiang Liu static __always_inline bool arch_static_branch(struct static_key *key) 309732cafdSJiang Liu { 319732cafdSJiang Liu asm goto("1: nop\n\t" 329732cafdSJiang Liu ".pushsection __jump_table, \"aw\"\n\t" 339732cafdSJiang Liu ".align 3\n\t" 349732cafdSJiang Liu ".quad 1b, %l[l_yes], %c0\n\t" 359732cafdSJiang Liu ".popsection\n\t" 369732cafdSJiang Liu : : "i"(key) : : l_yes); 379732cafdSJiang Liu 389732cafdSJiang Liu return false; 399732cafdSJiang Liu l_yes: 409732cafdSJiang Liu return true; 419732cafdSJiang Liu } 429732cafdSJiang Liu 439732cafdSJiang Liu typedef u64 jump_label_t; 449732cafdSJiang Liu 459732cafdSJiang Liu struct jump_entry { 469732cafdSJiang Liu jump_label_t code; 479732cafdSJiang Liu jump_label_t target; 489732cafdSJiang Liu jump_label_t key; 499732cafdSJiang Liu }; 509732cafdSJiang Liu 5155dd0df7SAnton Blanchard #endif /* __ASSEMBLY__ */ 529732cafdSJiang Liu #endif /* __ASM_JUMP_LABEL_H */ 53