40 lines
		
	
	
	
		
			802 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			40 lines
		
	
	
	
		
			802 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include <linux/kernel.h>
 | ||
|  | #include <linux/jump_label.h>
 | ||
|  | 
 | ||
|  | #include "insn.h"
 | ||
|  | #include "patch.h"
 | ||
|  | 
 | ||
|  | #ifdef HAVE_JUMP_LABEL
 | ||
|  | 
 | ||
|  | static void __arch_jump_label_transform(struct jump_entry *entry, | ||
|  | 					enum jump_label_type type, | ||
|  | 					bool is_static) | ||
|  | { | ||
|  | 	void *addr = (void *)entry->code; | ||
|  | 	unsigned int insn; | ||
|  | 
 | ||
|  | 	if (type == JUMP_LABEL_ENABLE) | ||
|  | 		insn = arm_gen_branch(entry->code, entry->target); | ||
|  | 	else | ||
|  | 		insn = arm_gen_nop(); | ||
|  | 
 | ||
|  | 	if (is_static) | ||
|  | 		__patch_text(addr, insn); | ||
|  | 	else | ||
|  | 		patch_text(addr, insn); | ||
|  | } | ||
|  | 
 | ||
|  | void arch_jump_label_transform(struct jump_entry *entry, | ||
|  | 			       enum jump_label_type type) | ||
|  | { | ||
|  | 	__arch_jump_label_transform(entry, type, false); | ||
|  | } | ||
|  | 
 | ||
|  | void arch_jump_label_transform_static(struct jump_entry *entry, | ||
|  | 				      enum jump_label_type type) | ||
|  | { | ||
|  | 	__arch_jump_label_transform(entry, type, true); | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |