Lines Matching +full:no +full:- +full:pc +full:- +full:write
1 // SPDX-License-Identifier: GPL-2.0-only
15 #include <asm/debug-monitors.h>
48 FREGS_OFFSET("pc", pc),
55 if (!strcmp(roff->name, name)) in ftrace_regs_query_register_offset()
56 return roff->offset; in ftrace_regs_query_register_offset()
59 return -EINVAL; in ftrace_regs_query_register_offset()
67 * instruction, and no adjustment is necessary. in ftrace_call_adjust()
73 * When using patchable-function-entry without pre-function NOPS, addr in ftrace_call_adjust()
83 * addr-04: BTI C in ftrace_call_adjust()
95 * When using patchable-function-entry with pre-function NOPs, addr is in ftrace_call_adjust()
96 * the address of the first pre-function NOP. in ftrace_call_adjust()
98 * Starting from an 8-byte aligned base, the compiler has either in ftrace_call_adjust()
120 WARN_RATELIMIT(1, "Misaligned patch-site %pS\n", in ftrace_call_adjust()
135 WARN_RATELIMIT(1, "unexpected insn in patch-site %pS: 0x%08x\n", in ftrace_call_adjust()
150 static int ftrace_modify_code(unsigned long pc, u32 old, u32 new, in ftrace_modify_code() argument
158 * could cause us to read or write to someplace that could cause harm. in ftrace_modify_code()
164 if (aarch64_insn_read((void *)pc, &replaced)) in ftrace_modify_code()
165 return -EFAULT; in ftrace_modify_code()
168 return -EINVAL; in ftrace_modify_code()
170 if (aarch64_insn_patch_text_nosync((void *)pc, new)) in ftrace_modify_code()
171 return -EPERM; in ftrace_modify_code()
181 unsigned long pc; in ftrace_update_ftrace_func() local
191 pc = (unsigned long)ftrace_call; in ftrace_update_ftrace_func()
192 new = aarch64_insn_gen_branch_imm(pc, (unsigned long)func, in ftrace_update_ftrace_func()
195 return ftrace_modify_code(pc, 0, new, false); in ftrace_update_ftrace_func()
201 struct plt_entry *plt = mod->arch.ftrace_trampolines; in get_ftrace_plt()
209 static bool reachable_by_bl(unsigned long addr, unsigned long pc) in reachable_by_bl() argument
211 long offset = (long)addr - (long)pc; in reachable_by_bl()
213 return offset >= -SZ_128M && offset < SZ_128M; in reachable_by_bl()
229 unsigned long pc = rec->ip; in ftrace_find_callable_addr() local
235 * through ops->direct_call. in ftrace_find_callable_addr()
237 if (*addr != FTRACE_ADDR && !reachable_by_bl(*addr, pc)) in ftrace_find_callable_addr()
242 * as-is and branch to that directly. in ftrace_find_callable_addr()
244 if (reachable_by_bl(*addr, pc)) in ftrace_find_callable_addr()
250 * only when module PLT support is built-in. in ftrace_find_callable_addr()
257 * dealing with an out-of-range condition, we can assume it in ftrace_find_callable_addr()
266 mod = __module_text_address(pc); in ftrace_find_callable_addr()
275 pr_err("ftrace: no module PLT for %ps\n", (void *)*addr); in ftrace_find_callable_addr()
288 if (rec->flags & FTRACE_FL_CALL_OPS_EN) { in arm64_rec_get_ops()
302 unsigned long literal = ALIGN_DOWN(rec->ip - 12, 8); in ftrace_rec_set_ops()
326 unsigned long pc = rec->ip; in ftrace_make_call() local
335 return -EINVAL; in ftrace_make_call()
338 new = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK); in ftrace_make_call()
340 return ftrace_modify_code(pc, old, new, true); in ftrace_make_call()
347 unsigned long pc = rec->ip; in ftrace_modify_call() local
356 return -EINVAL; in ftrace_modify_call()
358 return -EINVAL; in ftrace_modify_call()
360 old = aarch64_insn_gen_branch_imm(pc, old_addr, in ftrace_modify_call()
362 new = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK); in ftrace_modify_call()
364 return ftrace_modify_code(pc, old, new, true); in ftrace_modify_call()
371 * All instrumented functions follow the AAPCS, so x0-x8 and x19-x30 are live,
372 * and x9-x18 are free for our use.
374 * At runtime we want to be able to swing a single NOP <-> BL to enable or
380 * +----------+------------+------------+
388 * Note: ftrace_process_locs() has pre-adjusted rec->ip to be the address of
393 unsigned long pc = rec->ip - AARCH64_INSN_SIZE; in ftrace_init_nop() local
405 return ftrace_modify_code(pc, old, new, true); in ftrace_init_nop()
415 unsigned long pc = rec->ip; in ftrace_make_nop() local
435 return aarch64_insn_patch_text_nosync((void *)pc, new); in ftrace_make_nop()
438 return -EINVAL; in ftrace_make_nop()
440 old = aarch64_insn_gen_branch_imm(pc, addr, AARCH64_INSN_BRANCH_LINK); in ftrace_make_nop()
442 return ftrace_modify_code(pc, old, new, true); in ftrace_make_nop()
464 if (unlikely(atomic_read(¤t->tracing_graph_pause))) in prepare_ftrace_return()
469 * No protection against faulting at *parent, which may be seen in prepare_ftrace_return()
484 prepare_ftrace_return(ip, &fregs->lr, fregs->fp); in ftrace_graph_func()
493 unsigned long pc = (unsigned long)&ftrace_graph_call; in ftrace_modify_graph_caller() local
496 branch = aarch64_insn_gen_branch_imm(pc, in ftrace_modify_graph_caller()
502 return ftrace_modify_code(pc, nop, branch, true); in ftrace_modify_graph_caller()
504 return ftrace_modify_code(pc, branch, nop, true); in ftrace_modify_graph_caller()