109f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#include <linux/kernel.h>
209f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#include <linux/jump_label.h>
309f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
409f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#include "insn.h"
509f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#include "patch.h"
609f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
709f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#ifdef HAVE_JUMP_LABEL
809f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
909f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincentstatic void __arch_jump_label_transform(struct jump_entry *entry,
1009f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent					enum jump_label_type type,
1109f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent					bool is_static)
1209f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent{
1309f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	void *addr = (void *)entry->code;
1409f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	unsigned int insn;
1509f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
1609f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	if (type == JUMP_LABEL_ENABLE)
1709f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent		insn = arm_gen_branch(entry->code, entry->target);
1809f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	else
1909f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent		insn = arm_gen_nop();
2009f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
2109f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	if (is_static)
2219d1aa8c788ca1906cdc0917bc82cd4fe2ac1b8bRabin Vincent		__patch_text_early(addr, insn);
2309f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	else
2409f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent		patch_text(addr, insn);
2509f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent}
2609f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
2709f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincentvoid arch_jump_label_transform(struct jump_entry *entry,
2809f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent			       enum jump_label_type type)
2909f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent{
3009f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	__arch_jump_label_transform(entry, type, false);
3109f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent}
3209f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
3309f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincentvoid arch_jump_label_transform_static(struct jump_entry *entry,
3409f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent				      enum jump_label_type type)
3509f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent{
3609f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent	__arch_jump_label_transform(entry, type, true);
3709f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent}
3809f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent
3909f05d8529ff4aa92311c1a55ce35ac98cb59b8cRabin Vincent#endif
40