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 13void 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