| Rabin Vincent | 09f05d8 | 2012-02-18 17:52:41 +0100 | [diff] [blame] | 1 | #include <linux/kernel.h> | 
 | 2 | #include <linux/jump_label.h> | 
 | 3 |  | 
 | 4 | #include "insn.h" | 
 | 5 | #include "patch.h" | 
 | 6 |  | 
 | 7 | #ifdef HAVE_JUMP_LABEL | 
 | 8 |  | 
 | 9 | static void __arch_jump_label_transform(struct jump_entry *entry, | 
 | 10 | 					enum jump_label_type type, | 
 | 11 | 					bool is_static) | 
 | 12 | { | 
 | 13 | 	void *addr = (void *)entry->code; | 
 | 14 | 	unsigned int insn; | 
 | 15 |  | 
 | 16 | 	if (type == JUMP_LABEL_ENABLE) | 
 | 17 | 		insn = arm_gen_branch(entry->code, entry->target); | 
 | 18 | 	else | 
 | 19 | 		insn = arm_gen_nop(); | 
 | 20 |  | 
 | 21 | 	if (is_static) | 
 | 22 | 		__patch_text(addr, insn); | 
 | 23 | 	else | 
 | 24 | 		patch_text(addr, insn); | 
 | 25 | } | 
 | 26 |  | 
 | 27 | void arch_jump_label_transform(struct jump_entry *entry, | 
 | 28 | 			       enum jump_label_type type) | 
 | 29 | { | 
 | 30 | 	__arch_jump_label_transform(entry, type, false); | 
 | 31 | } | 
 | 32 |  | 
 | 33 | void arch_jump_label_transform_static(struct jump_entry *entry, | 
 | 34 | 				      enum jump_label_type type) | 
 | 35 | { | 
 | 36 | 	__arch_jump_label_transform(entry, type, true); | 
 | 37 | } | 
 | 38 |  | 
 | 39 | #endif |