19732cafd9dc0206479be919baf0067239f0a63caJiang Liu/* 29732cafd9dc0206479be919baf0067239f0a63caJiang Liu * Copyright (C) 2013 Huawei Ltd. 39732cafd9dc0206479be919baf0067239f0a63caJiang Liu * Author: Jiang Liu <liuj97@gmail.com> 49732cafd9dc0206479be919baf0067239f0a63caJiang Liu * 59732cafd9dc0206479be919baf0067239f0a63caJiang Liu * Based on arch/arm/kernel/jump_label.c 69732cafd9dc0206479be919baf0067239f0a63caJiang Liu * 79732cafd9dc0206479be919baf0067239f0a63caJiang Liu * This program is free software; you can redistribute it and/or modify 89732cafd9dc0206479be919baf0067239f0a63caJiang Liu * it under the terms of the GNU General Public License version 2 as 99732cafd9dc0206479be919baf0067239f0a63caJiang Liu * published by the Free Software Foundation. 109732cafd9dc0206479be919baf0067239f0a63caJiang Liu * 119732cafd9dc0206479be919baf0067239f0a63caJiang Liu * This program is distributed in the hope that it will be useful, 129732cafd9dc0206479be919baf0067239f0a63caJiang Liu * but WITHOUT ANY WARRANTY; without even the implied warranty of 139732cafd9dc0206479be919baf0067239f0a63caJiang Liu * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 149732cafd9dc0206479be919baf0067239f0a63caJiang Liu * GNU General Public License for more details. 159732cafd9dc0206479be919baf0067239f0a63caJiang Liu * 169732cafd9dc0206479be919baf0067239f0a63caJiang Liu * You should have received a copy of the GNU General Public License 179732cafd9dc0206479be919baf0067239f0a63caJiang Liu * along with this program. If not, see <http://www.gnu.org/licenses/>. 189732cafd9dc0206479be919baf0067239f0a63caJiang Liu */ 199732cafd9dc0206479be919baf0067239f0a63caJiang Liu#include <linux/kernel.h> 209732cafd9dc0206479be919baf0067239f0a63caJiang Liu#include <linux/jump_label.h> 219732cafd9dc0206479be919baf0067239f0a63caJiang Liu#include <asm/insn.h> 229732cafd9dc0206479be919baf0067239f0a63caJiang Liu 239732cafd9dc0206479be919baf0067239f0a63caJiang Liu#ifdef HAVE_JUMP_LABEL 249732cafd9dc0206479be919baf0067239f0a63caJiang Liu 25a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutlandvoid arch_jump_label_transform(struct jump_entry *entry, 26a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland enum jump_label_type type) 279732cafd9dc0206479be919baf0067239f0a63caJiang Liu{ 289732cafd9dc0206479be919baf0067239f0a63caJiang Liu void *addr = (void *)entry->code; 299732cafd9dc0206479be919baf0067239f0a63caJiang Liu u32 insn; 309732cafd9dc0206479be919baf0067239f0a63caJiang Liu 319732cafd9dc0206479be919baf0067239f0a63caJiang Liu if (type == JUMP_LABEL_ENABLE) { 329732cafd9dc0206479be919baf0067239f0a63caJiang Liu insn = aarch64_insn_gen_branch_imm(entry->code, 339732cafd9dc0206479be919baf0067239f0a63caJiang Liu entry->target, 349732cafd9dc0206479be919baf0067239f0a63caJiang Liu AARCH64_INSN_BRANCH_NOLINK); 359732cafd9dc0206479be919baf0067239f0a63caJiang Liu } else { 369732cafd9dc0206479be919baf0067239f0a63caJiang Liu insn = aarch64_insn_gen_nop(); 379732cafd9dc0206479be919baf0067239f0a63caJiang Liu } 389732cafd9dc0206479be919baf0067239f0a63caJiang Liu 39a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland aarch64_insn_patch_text(&addr, &insn, 1); 409732cafd9dc0206479be919baf0067239f0a63caJiang Liu} 419732cafd9dc0206479be919baf0067239f0a63caJiang Liu 429732cafd9dc0206479be919baf0067239f0a63caJiang Liuvoid arch_jump_label_transform_static(struct jump_entry *entry, 439732cafd9dc0206479be919baf0067239f0a63caJiang Liu enum jump_label_type type) 449732cafd9dc0206479be919baf0067239f0a63caJiang Liu{ 45a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland /* 46a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland * We use the architected A64 NOP in arch_static_branch, so there's no 47a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland * need to patch an identical A64 NOP over the top of it here. The core 48a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland * will call arch_jump_label_transform from a module notifier if the 49a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland * NOP needs to be replaced by a branch. 50a4a8d5398c9325f6b952c90e35d7af13f8c33f6fMark Rutland */ 519732cafd9dc0206479be919baf0067239f0a63caJiang Liu} 529732cafd9dc0206479be919baf0067239f0a63caJiang Liu 539732cafd9dc0206479be919baf0067239f0a63caJiang Liu#endif /* HAVE_JUMP_LABEL */ 54