diff options
-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 { |