xref: /linux/arch/arm/kernel/jump_label.c (revision e0bf6c5ca2d3281f231c5f0c9bf145e9513644de)
1 #include <linux/kernel.h>
2 #include <linux/jump_label.h>
3 #include <asm/patch.h>
4 #include <asm/insn.h>
5 
6 #ifdef HAVE_JUMP_LABEL
7 
8 static void __arch_jump_label_transform(struct jump_entry *entry,
9 					enum jump_label_type type,
10 					bool is_static)
11 {
12 	void *addr = (void *)entry->code;
13 	unsigned int insn;
14 
15 	if (type == JUMP_LABEL_ENABLE)
16 		insn = arm_gen_branch(entry->code, entry->target);
17 	else
18 		insn = arm_gen_nop();
19 
20 	if (is_static)
21 		__patch_text_early(addr, insn);
22 	else
23 		patch_text(addr, insn);
24 }
25 
26 void arch_jump_label_transform(struct jump_entry *entry,
27 			       enum jump_label_type type)
28 {
29 	__arch_jump_label_transform(entry, type, false);
30 }
31 
32 void arch_jump_label_transform_static(struct jump_entry *entry,
33 				      enum jump_label_type type)
34 {
35 	__arch_jump_label_transform(entry, type, true);
36 }
37 
38 #endif
39