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