Blame view

arch/x86/kernel/jump_label.c 1.32 KB
d9f5ab7b1   Jason Baron   jump label: x86 s...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  /*
   * jump label x86 support
   *
   * Copyright (C) 2009 Jason Baron <jbaron@redhat.com>
   *
   */
  #include <linux/jump_label.h>
  #include <linux/memory.h>
  #include <linux/uaccess.h>
  #include <linux/module.h>
  #include <linux/list.h>
  #include <linux/jhash.h>
  #include <linux/cpu.h>
  #include <asm/kprobes.h>
  #include <asm/alternative.h>
  
  #ifdef HAVE_JUMP_LABEL
  
  union jump_code_union {
  	char code[JUMP_LABEL_NOP_SIZE];
  	struct {
  		char jump;
  		int offset;
  	} __attribute__((packed));
  };
e71a5be15   Jeremy Fitzhardinge   x86/jump_label: a...
26
27
28
  static void __jump_label_transform(struct jump_entry *entry,
  				   enum jump_label_type type,
  				   void *(*poker)(void *, const void *, size_t))
d9f5ab7b1   Jason Baron   jump label: x86 s...
29
30
31
32
33
34
35
36
  {
  	union jump_code_union code;
  
  	if (type == JUMP_LABEL_ENABLE) {
  		code.jump = 0xe9;
  		code.offset = entry->target -
  				(entry->code + JUMP_LABEL_NOP_SIZE);
  	} else
dc326fca2   H. Peter Anvin   x86, cpu: Clean u...
37
  		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
e71a5be15   Jeremy Fitzhardinge   x86/jump_label: a...
38
39
40
41
42
43
44
  
  	(*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
  }
  
  void arch_jump_label_transform(struct jump_entry *entry,
  			       enum jump_label_type type)
  {
d9f5ab7b1   Jason Baron   jump label: x86 s...
45
46
  	get_online_cpus();
  	mutex_lock(&text_mutex);
e71a5be15   Jeremy Fitzhardinge   x86/jump_label: a...
47
  	__jump_label_transform(entry, type, text_poke_smp);
d9f5ab7b1   Jason Baron   jump label: x86 s...
48
49
50
  	mutex_unlock(&text_mutex);
  	put_online_cpus();
  }
9cdbe1cba   Peter Zijlstra   jump_label, x86: ...
51
  __init_or_module void arch_jump_label_transform_static(struct jump_entry *entry,
e71a5be15   Jeremy Fitzhardinge   x86/jump_label: a...
52
53
54
55
  				      enum jump_label_type type)
  {
  	__jump_label_transform(entry, type, text_poke_early);
  }
d9f5ab7b1   Jason Baron   jump label: x86 s...
56
  #endif