Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e71a5be1 authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge
Browse files

x86/jump_label: add arch_jump_label_transform_static()



This allows jump-label entries to be cheaply updated on code which is
not yet live.

Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: default avatarJason Baron <jbaron@redhat.com>
Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
parent 61f42183
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -24,8 +24,9 @@ union jump_code_union {
	} __attribute__((packed));
};

void arch_jump_label_transform(struct jump_entry *entry,
			       enum jump_label_type type)
static void __jump_label_transform(struct jump_entry *entry,
				   enum jump_label_type type,
				   void *(*poker)(void *, const void *, size_t))
{
	union jump_code_union code;

@@ -35,11 +36,24 @@ void arch_jump_label_transform(struct jump_entry *entry,
				(entry->code + JUMP_LABEL_NOP_SIZE);
	} else
		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);

	(*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
}

void arch_jump_label_transform(struct jump_entry *entry,
			       enum jump_label_type type)
{
	get_online_cpus();
	mutex_lock(&text_mutex);
	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
	__jump_label_transform(entry, type, text_poke_smp);
	mutex_unlock(&text_mutex);
	put_online_cpus();
}

void arch_jump_label_transform_static(struct jump_entry *entry,
				      enum jump_label_type type)
{
	__jump_label_transform(entry, type, text_poke_early);
}

#endif