Commit a8fab074 authored by Hannes Frederic Sowa's avatar Hannes Frederic Sowa Committed by David S. Miller

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: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c4b2c0c5
...@@ -42,15 +42,27 @@ static void __jump_label_transform(struct jump_entry *entry, ...@@ -42,15 +42,27 @@ static void __jump_label_transform(struct jump_entry *entry,
int init) int init)
{ {
union jump_code_union code; union jump_code_union code;
const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5]; const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
if (type == JUMP_LABEL_ENABLE) { if (type == JUMP_LABEL_ENABLE) {
/* if (init) {
* We are enabling this jump label. If it is not a nop /*
* then something must have gone wrong. * Jump label is enabled for the first time.
*/ * So we expect a default_nop...
if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) != 0)) */
bug_at((void *)entry->code, __LINE__); if (unlikely(memcmp((void *)entry->code, default_nop, 5)
!= 0))
bug_at((void *)entry->code, __LINE__);
} else {
/*
* ...otherwise expect an ideal_nop. Otherwise
* something went horribly wrong.
*/
if (unlikely(memcmp((void *)entry->code, ideal_nop, 5)
!= 0))
bug_at((void *)entry->code, __LINE__);
}
code.jump = 0xe9; code.jump = 0xe9;
code.offset = entry->target - code.offset = entry->target -
...@@ -63,7 +75,6 @@ static void __jump_label_transform(struct jump_entry *entry, ...@@ -63,7 +75,6 @@ static void __jump_label_transform(struct jump_entry *entry,
* are converting the default nop to the ideal nop. * are converting the default nop to the ideal nop.
*/ */
if (init) { if (init) {
const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0)) if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0))
bug_at((void *)entry->code, __LINE__); bug_at((void *)entry->code, __LINE__);
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment