1 // SPDX-License-Identifier: GPL-2.0-only !! 1 // SPDX-License-Identifier: GPL-2.0 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> 2 #include <linux/kernel.h> >> 3 #include <linux/types.h> >> 4 #include <linux/mutex.h> >> 5 #include <linux/cpu.h> >> 6 9 #include <linux/jump_label.h> 7 #include <linux/jump_label.h> 10 #include <linux/smp.h> !! 8 #include <linux/memory.h> 11 #include <asm/insn.h> !! 9 12 #include <asm/patching.h> !! 10 #include <asm/cacheflush.h> 13 11 14 bool arch_jump_label_transform_queue(struct ju !! 12 void arch_jump_label_transform(struct jump_entry *entry, 15 enum jump !! 13 enum jump_label_type type) 16 { 14 { 17 void *addr = (void *)jump_entry_code(e !! 15 u32 *insn = (u32 *) (unsigned long) entry->code; 18 u32 insn; !! 16 u32 val; 19 17 20 if (type == JUMP_LABEL_JMP) { 18 if (type == JUMP_LABEL_JMP) { 21 insn = aarch64_insn_gen_branch !! 19 s32 off = (s32)entry->target - (s32)entry->code; 22 !! 20 bool use_v9_branch = false; 23 !! 21 >> 22 BUG_ON(off & 3); >> 23 >> 24 #ifdef CONFIG_SPARC64 >> 25 if (off <= 0xfffff && off >= -0x100000) >> 26 use_v9_branch = true; >> 27 #endif >> 28 if (use_v9_branch) { >> 29 /* WDISP19 - target is . + immed << 2 */ >> 30 /* ba,pt %xcc, . + off */ >> 31 val = 0x10680000 | (((u32) off >> 2) & 0x7ffff); >> 32 } else { >> 33 /* WDISP22 - target is . + immed << 2 */ >> 34 BUG_ON(off > 0x7fffff); >> 35 BUG_ON(off < -0x800000); >> 36 /* ba . + off */ >> 37 val = 0x10800000 | (((u32) off >> 2) & 0x3fffff); >> 38 } 24 } else { 39 } else { 25 insn = aarch64_insn_gen_nop(); !! 40 val = 0x01000000; 26 } 41 } 27 42 28 aarch64_insn_patch_text_nosync(addr, i !! 43 mutex_lock(&text_mutex); 29 return true; !! 44 *insn = val; 30 } !! 45 flushi(insn); 31 !! 46 mutex_unlock(&text_mutex); 32 void arch_jump_label_transform_apply(void) << 33 { << 34 kick_all_cpus_sync(); << 35 } 47 } 36 48
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.