Commit f4fcbf2e authored by Naveen N Rao's avatar Naveen N Rao Committed by Michael Ellerman

powerpc/ftrace: Refactor ftrace_modify_code()

Split up ftrace_modify_code() into a few helpers for future use. Also
update error messages accordingly.
Signed-off-by: default avatarNaveen N Rao <naveen@kernel.org>
Reviewed-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/a8daa49712b44ff539e6c22a2ea649a540386798.1687166935.git.naveen@kernel.org
parent bad90aa5
...@@ -50,32 +50,39 @@ ftrace_call_replace(unsigned long ip, unsigned long addr, int link) ...@@ -50,32 +50,39 @@ ftrace_call_replace(unsigned long ip, unsigned long addr, int link)
return op; return op;
} }
static inline int static inline int ftrace_read_inst(unsigned long ip, ppc_inst_t *op)
ftrace_modify_code(unsigned long ip, ppc_inst_t old, ppc_inst_t new)
{ {
ppc_inst_t replaced; if (copy_inst_from_kernel_nofault(op, (void *)ip)) {
pr_err("0x%lx: fetching instruction failed\n", ip);
return -EFAULT;
}
/* return 0;
* Note: }
* We are paranoid about modifying text, as if a bug was to happen, it
* could cause us to read or write to someplace that could cause harm.
* Carefully read and modify the code with probe_kernel_*(), and make
* sure what we read is what we expected it to be before modifying it.
*/
/* read the text we want to modify */ static inline int ftrace_validate_inst(unsigned long ip, ppc_inst_t inst)
if (copy_inst_from_kernel_nofault(&replaced, (void *)ip)) {
return -EFAULT; ppc_inst_t op;
int ret;
/* Make sure it is what we expect it to be */ ret = ftrace_read_inst(ip, &op);
if (!ppc_inst_equal(replaced, old)) { if (!ret && !ppc_inst_equal(op, inst)) {
pr_err("%p: replaced (%08lx) != old (%08lx)", (void *)ip, pr_err("0x%lx: expected (%08lx) != found (%08lx)\n",
ppc_inst_as_ulong(replaced), ppc_inst_as_ulong(old)); ip, ppc_inst_as_ulong(inst), ppc_inst_as_ulong(op));
return -EINVAL; ret = -EINVAL;
} }
/* replace the text with the new text */ return ret;
return patch_instruction((u32 *)ip, new); }
static inline int ftrace_modify_code(unsigned long ip, ppc_inst_t old, ppc_inst_t new)
{
int ret = ftrace_validate_inst(ip, old);
if (!ret)
ret = patch_instruction((u32 *)ip, new);
return ret;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment