Skip to content

Commit

Permalink
s390/ftrace: simplify enabling/disabling of ftrace_graph_caller
Browse files Browse the repository at this point in the history
We can simply patch the mask field within the branch relative on
condition instruction at the beginning of the ftrace_graph_caller
code block.
This makes the logic even simpler and we get rid of the displacement
calculation.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Heiko Carstens authored and Martin Schwidefsky committed Oct 9, 2014
1 parent 53255c9 commit 0cccdda
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 15 deletions.
22 changes: 9 additions & 13 deletions arch/s390/kernel/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,28 +138,24 @@ unsigned long __kprobes prepare_ftrace_return(unsigned long parent,

/*
* Patch the kernel code at ftrace_graph_caller location. The instruction
* there is branch relative and save to prepare_ftrace_return. To disable
* the call to prepare_ftrace_return we patch the bras offset to point
* directly after the instructions. To enable the call we calculate
* the original offset to prepare_ftrace_return and put it back.
* there is branch relative on condition. To enable the ftrace graph code
* block, we simply patch the mask field of the instruction to zero and
* turn the instruction into a nop.
* To disable the ftrace graph code the mask field will be patched to
* all ones, which turns the instruction into an unconditional branch.
*/

int ftrace_enable_ftrace_graph_caller(void)
{
static unsigned short offset = 0x0002;
u8 op = 0x04; /* set mask field to zero */

return probe_kernel_write((void *) ftrace_graph_caller + 2,
&offset, sizeof(offset));
return probe_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
}

int ftrace_disable_ftrace_graph_caller(void)
{
unsigned short offset;
u8 op = 0xf4; /* set mask field to all ones */

offset = ((void *) &ftrace_graph_caller_end -
(void *) ftrace_graph_caller) / 2;
return probe_kernel_write((void *) ftrace_graph_caller + 2,
&offset, sizeof(offset));
return probe_kernel_write(__va(ftrace_graph_caller)+1, &op, sizeof(op));
}

#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
3 changes: 1 addition & 2 deletions arch/s390/kernel/mcount.S
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,7 @@ ENTRY(ftrace_caller)
basr %r14,%r1
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
# The j instruction gets runtime patched to a nop instruction.
# See ftrace_enable_ftrace_graph_caller. The patched instruction is:
# j .+4
# See ftrace_enable_ftrace_graph_caller.
ENTRY(ftrace_graph_caller)
j ftrace_graph_caller_end
lg %r2,(STACK_PTREGS_GPRS+14*8)(%r15)
Expand Down

0 comments on commit 0cccdda

Please sign in to comment.