1 /* 2 * jump label x86 support 3 * 4 * Copyright (C) 2009 Jason Baron <jbaron@redhat.com> 5 * 6 */ 7 #include <linux/jump_label.h> 8 #include <linux/memory.h> 9 #include <linux/uaccess.h> 10 #include <linux/module.h> 11 #include <linux/list.h> 12 #include <linux/jhash.h> 13 #include <linux/cpu.h> 14 #include <asm/kprobes.h> 15 #include <asm/alternative.h> 16 17 #ifdef HAVE_JUMP_LABEL 18 19 union jump_code_union { 20 char code[JUMP_LABEL_NOP_SIZE]; 21 struct { 22 char jump; 23 int offset; 24 } __attribute__((packed)); 25 }; 26 27 void arch_jump_label_transform(struct jump_entry *entry, 28 enum jump_label_type type) 29 { 30 union jump_code_union code; 31 32 if (type == JUMP_LABEL_ENABLE) { 33 code.jump = 0xe9; 34 code.offset = entry->target - 35 (entry->code + JUMP_LABEL_NOP_SIZE); 36 } else 37 memcpy(&code, ideal_nop5, JUMP_LABEL_NOP_SIZE); 38 get_online_cpus(); 39 mutex_lock(&text_mutex); 40 text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE); 41 mutex_unlock(&text_mutex); 42 put_online_cpus(); 43 } 44 45 void arch_jump_label_text_poke_early(jump_label_t addr) 46 { 47 text_poke_early((void *)addr, ideal_nop5, JUMP_LABEL_NOP_SIZE); 48 } 49 50 #endif 51