Re: [RFC][PATCH 1/2] x86: Allow breakpoints to emulate call functions

From: Steven Rostedt
Date: Mon May 06 2019 - 21:35:14 EST


On Mon, 6 May 2019 21:04:16 -0400
Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:

> static int add_breakpoints(struct dyn_ftrace *rec, int enable)
> {
> unsigned long ftrace_addr;
> int ret;
>
> ftrace_addr = ftrace_get_addr_curr(rec);
>
> ret = ftrace_test_record(rec, enable);
>
> switch (ret) {
> case FTRACE_UPDATE_IGNORE:
> return 0;
>
> case FTRACE_UPDATE_MAKE_CALL:
> /* converting nop to call */
> return add_brk_on_nop(rec);
>
> case FTRACE_UPDATE_MODIFY_CALL:

The FTRACE_UPDATE_MODIFY_CALL is the case where we switch from calling
one trampoline to calling another. As you can plainly see from this
switch statement, we treat it the same as converting to a nop. That's
the bug we are trying to fix. It shouldn't be treated as a nop. It
should be treated as a call to the old or new function. Either is fine,
but it must be one or the other, not a nop.

-- Steve


> case FTRACE_UPDATE_MAKE_NOP:
> /* converting a call to a nop */
> return add_brk_on_call(rec, ftrace_addr);
> }
> return 0;
> }