int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) { int err; BUILD_BUG_ON(AARCH64_INSN_SIZE != BREAK_INSTR_SIZE); err = aarch64_insn_read((void *)bpt->bpt_addr, (u32 *)bpt->saved_instr); if (err) return err; return aarch64_insn_write((void *)bpt->bpt_addr, (u32)AARCH64_BREAK_KGDB_DYN_DBG); }
int __kprobes aarch64_insn_patch_text_nosync(void *addr, u32 insn) { u32 *tp = addr; int ret; /* A64 instructions must be word aligned */ if ((uintptr_t)tp & 0x3) return -EINVAL; ret = aarch64_insn_write(tp, insn); if (ret == 0) flush_icache_range((uintptr_t)tp, (uintptr_t)tp + AARCH64_INSN_SIZE); return ret; }
int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) { return aarch64_insn_write((void *)bpt->bpt_addr, *(u32 *)bpt->saved_instr); }