1 #include <linux/kernel.h> 2 #include <linux/types.h> 3 #include <linux/mutex.h> 4 #include <linux/cpu.h> 5 6 #include <linux/jump_label.h> 7 #include <linux/memory.h> 8 9 #include <asm/cacheflush.h> 10 11 #ifdef HAVE_JUMP_LABEL 12 13 void arch_jump_label_transform(struct jump_entry *entry, 14 enum jump_label_type type) 15 { 16 u32 val; 17 u32 *insn = (u32 *) (unsigned long) entry->code; 18 19 if (type == JUMP_LABEL_JMP) { 20 s32 off = (s32)entry->target - (s32)entry->code; 21 22 #ifdef CONFIG_SPARC64 23 /* ba,pt %xcc, . + (off << 2) */ 24 val = 0x10680000 | ((u32) off >> 2); 25 #else 26 /* ba . + (off << 2) */ 27 val = 0x10800000 | ((u32) off >> 2); 28 #endif 29 } else { 30 val = 0x01000000; 31 } 32 33 get_online_cpus(); 34 mutex_lock(&text_mutex); 35 *insn = val; 36 flushi(insn); 37 mutex_unlock(&text_mutex); 38 put_online_cpus(); 39 } 40 41 #endif 42