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