diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2013-10-19 15:48:54 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-19 19:45:35 -0400 |
commit | a8fab0744585c1ab61009bfc1a1958f28e1c864f (patch) | |
tree | fee8d9ecb58cbcb46465cf2f97c542cd70a85687 | |
parent | c4b2c0c5f647aa1093e8f9097a30c17ce0f94d4d (diff) |
x86/jump_label: expect default_nop if static_key gets enabled on boot-up
net_get_random_once(intrduced in the next patch) uses static_keys in
a way that they get enabled on boot-up instead of replaced with an
ideal_nop. So check for default_nop on initial enabling.
Other architectures don't check for this.
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Eric Dumazet <edumazet@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: x86@kernel.org
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/x86/kernel/jump_label.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c index ee11b7dfbfbb..26d5a55a2736 100644 --- a/arch/x86/kernel/jump_label.c +++ b/arch/x86/kernel/jump_label.c | |||
@@ -42,15 +42,27 @@ static void __jump_label_transform(struct jump_entry *entry, | |||
42 | int init) | 42 | int init) |
43 | { | 43 | { |
44 | union jump_code_union code; | 44 | union jump_code_union code; |
45 | const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP }; | ||
45 | const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5]; | 46 | const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5]; |
46 | 47 | ||
47 | if (type == JUMP_LABEL_ENABLE) { | 48 | if (type == JUMP_LABEL_ENABLE) { |
48 | /* | 49 | if (init) { |
49 | * We are enabling this jump label. If it is not a nop | 50 | /* |
50 | * then something must have gone wrong. | 51 | * Jump label is enabled for the first time. |
51 | */ | 52 | * So we expect a default_nop... |
52 | if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) != 0)) | 53 | */ |
53 | bug_at((void *)entry->code, __LINE__); | 54 | if (unlikely(memcmp((void *)entry->code, default_nop, 5) |
55 | != 0)) | ||
56 | bug_at((void *)entry->code, __LINE__); | ||
57 | } else { | ||
58 | /* | ||
59 | * ...otherwise expect an ideal_nop. Otherwise | ||
60 | * something went horribly wrong. | ||
61 | */ | ||
62 | if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) | ||
63 | != 0)) | ||
64 | bug_at((void *)entry->code, __LINE__); | ||
65 | } | ||
54 | 66 | ||
55 | code.jump = 0xe9; | 67 | code.jump = 0xe9; |
56 | code.offset = entry->target - | 68 | code.offset = entry->target - |
@@ -63,7 +75,6 @@ static void __jump_label_transform(struct jump_entry *entry, | |||
63 | * are converting the default nop to the ideal nop. | 75 | * are converting the default nop to the ideal nop. |
64 | */ | 76 | */ |
65 | if (init) { | 77 | if (init) { |
66 | const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP }; | ||
67 | if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0)) | 78 | if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0)) |
68 | bug_at((void *)entry->code, __LINE__); | 79 | bug_at((void *)entry->code, __LINE__); |
69 | } else { | 80 | } else { |