|
@@ -38,10 +38,10 @@ static int jump_label_cmp(const void *a, const void *b)
|
|
|
const struct jump_entry *jea = a;
|
|
|
const struct jump_entry *jeb = b;
|
|
|
|
|
|
- if (jea->key < jeb->key)
|
|
|
+ if (jump_entry_key(jea) < jump_entry_key(jeb))
|
|
|
return -1;
|
|
|
|
|
|
- if (jea->key > jeb->key)
|
|
|
+ if (jump_entry_key(jea) > jump_entry_key(jeb))
|
|
|
return 1;
|
|
|
|
|
|
return 0;
|
|
@@ -261,8 +261,8 @@ EXPORT_SYMBOL_GPL(jump_label_rate_limit);
|
|
|
|
|
|
static int addr_conflict(struct jump_entry *entry, void *start, void *end)
|
|
|
{
|
|
|
- if (entry->code <= (unsigned long)end &&
|
|
|
- entry->code + JUMP_LABEL_NOP_SIZE > (unsigned long)start)
|
|
|
+ if (jump_entry_code(entry) <= (unsigned long)end &&
|
|
|
+ jump_entry_code(entry) + JUMP_LABEL_NOP_SIZE > (unsigned long)start)
|
|
|
return 1;
|
|
|
|
|
|
return 0;
|
|
@@ -321,16 +321,6 @@ static inline void static_key_set_linked(struct static_key *key)
|
|
|
key->type |= JUMP_TYPE_LINKED;
|
|
|
}
|
|
|
|
|
|
-static inline struct static_key *jump_entry_key(struct jump_entry *entry)
|
|
|
-{
|
|
|
- return (struct static_key *)((unsigned long)entry->key & ~1UL);
|
|
|
-}
|
|
|
-
|
|
|
-static bool jump_entry_branch(struct jump_entry *entry)
|
|
|
-{
|
|
|
- return (unsigned long)entry->key & 1UL;
|
|
|
-}
|
|
|
-
|
|
|
/***
|
|
|
* A 'struct static_key' uses a union such that it either points directly
|
|
|
* to a table of 'struct jump_entry' or to a linked list of modules which in
|
|
@@ -355,7 +345,7 @@ static enum jump_label_type jump_label_type(struct jump_entry *entry)
|
|
|
{
|
|
|
struct static_key *key = jump_entry_key(entry);
|
|
|
bool enabled = static_key_enabled(key);
|
|
|
- bool branch = jump_entry_branch(entry);
|
|
|
+ bool branch = jump_entry_is_branch(entry);
|
|
|
|
|
|
/* See the comment in linux/jump_label.h */
|
|
|
return enabled ^ branch;
|
|
@@ -370,12 +360,12 @@ static void __jump_label_update(struct static_key *key,
|
|
|
* An entry->code of 0 indicates an entry which has been
|
|
|
* disabled because it was in an init text area.
|
|
|
*/
|
|
|
- if (entry->code) {
|
|
|
- if (kernel_text_address(entry->code))
|
|
|
+ if (!jump_entry_is_init(entry)) {
|
|
|
+ if (kernel_text_address(jump_entry_code(entry)))
|
|
|
arch_jump_label_transform(entry, jump_label_type(entry));
|
|
|
else
|
|
|
WARN_ONCE(1, "can't patch jump_label at %pS",
|
|
|
- (void *)(unsigned long)entry->code);
|
|
|
+ (void *)jump_entry_code(entry));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -430,8 +420,8 @@ void __init jump_label_invalidate_initmem(void)
|
|
|
struct jump_entry *iter;
|
|
|
|
|
|
for (iter = iter_start; iter < iter_stop; iter++) {
|
|
|
- if (init_section_contains((void *)(unsigned long)iter->code, 1))
|
|
|
- iter->code = 0;
|
|
|
+ if (init_section_contains((void *)jump_entry_code(iter), 1))
|
|
|
+ jump_entry_set_init(iter);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -441,7 +431,7 @@ static enum jump_label_type jump_label_init_type(struct jump_entry *entry)
|
|
|
{
|
|
|
struct static_key *key = jump_entry_key(entry);
|
|
|
bool type = static_key_type(key);
|
|
|
- bool branch = jump_entry_branch(entry);
|
|
|
+ bool branch = jump_entry_is_branch(entry);
|
|
|
|
|
|
/* See the comment in linux/jump_label.h */
|
|
|
return type ^ branch;
|
|
@@ -565,7 +555,7 @@ static int jump_label_add_module(struct module *mod)
|
|
|
continue;
|
|
|
|
|
|
key = iterk;
|
|
|
- if (within_module(iter->key, mod)) {
|
|
|
+ if (within_module((unsigned long)key, mod)) {
|
|
|
static_key_set_entries(key, iter);
|
|
|
continue;
|
|
|
}
|
|
@@ -615,7 +605,7 @@ static void jump_label_del_module(struct module *mod)
|
|
|
|
|
|
key = jump_entry_key(iter);
|
|
|
|
|
|
- if (within_module(iter->key, mod))
|
|
|
+ if (within_module((unsigned long)key, mod))
|
|
|
continue;
|
|
|
|
|
|
/* No memory during module load */
|
|
@@ -659,8 +649,8 @@ static void jump_label_invalidate_module_init(struct module *mod)
|
|
|
struct jump_entry *iter;
|
|
|
|
|
|
for (iter = iter_start; iter < iter_stop; iter++) {
|
|
|
- if (within_module_init(iter->code, mod))
|
|
|
- iter->code = 0;
|
|
|
+ if (within_module_init(jump_entry_code(iter), mod))
|
|
|
+ jump_entry_set_init(iter);
|
|
|
}
|
|
|
}
|
|
|
|