linux/arch/arm64/kernel/jump_label.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2013 Huawei Ltd.
   4 * Author: Jiang Liu <liuj97@gmail.com>
   5 *
   6 * Based on arch/arm/kernel/jump_label.c
   7 */
   8#include <linux/kernel.h>
   9#include <linux/jump_label.h>
  10#include <asm/insn.h>
  11#include <asm/patching.h>
  12
  13void arch_jump_label_transform(struct jump_entry *entry,
  14                               enum jump_label_type type)
  15{
  16        void *addr = (void *)jump_entry_code(entry);
  17        u32 insn;
  18
  19        if (type == JUMP_LABEL_JMP) {
  20                insn = aarch64_insn_gen_branch_imm(jump_entry_code(entry),
  21                                                   jump_entry_target(entry),
  22                                                   AARCH64_INSN_BRANCH_NOLINK);
  23        } else {
  24                insn = aarch64_insn_gen_nop();
  25        }
  26
  27        aarch64_insn_patch_text_nosync(addr, insn);
  28}
  29
  30void arch_jump_label_transform_static(struct jump_entry *entry,
  31                                      enum jump_label_type type)
  32{
  33        /*
  34         * We use the architected A64 NOP in arch_static_branch, so there's no
  35         * need to patch an identical A64 NOP over the top of it here. The core
  36         * will call arch_jump_label_transform from a module notifier if the
  37         * NOP needs to be replaced by a branch.
  38         */
  39}
  40