KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as
it eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
arm64 makes use of GCC -fpatchable-function-entry=2 option to insert
two nops. When the function is traced, the first nop will be modified
to the LR saver, then the second nop to "bl <ftrace-entry>". We need
to allow kprobe on any of these two instructions.
patch1 uses ftrace_location() when [dis]arming probes.
patch2 introduces FTRACE_IP_EXTENSION to let ftrace_location()
recognise these two instructions as being part of ftrace
patch3 implement the KPROBES_ON_FTRACE for arm64
Changes since v6:
- add patch1 and patch2
- fix the automatic offset as pointed out by Masami
Changes since v5:
- rebase v5.5-rc1
- collect Acked-by and Reviewed-by tags
Changes since v4:
- correct reg->pc: probed on foo, then pre_handler see foo+0x4, while
post_handler see foo+0x8
Changes since v3:
- move kprobe_lookup_name() and arch_kprobe_on_func_entry to ftrace.c since
we only want to choose the ftrace entry for KPROBES_ON_FTRACE.
- only choose ftrace entry if (addr && !offset)
Changes since v2:
- remove patch1, make it a single cleanup patch
- remove "This patch" in the change log
- implement arm64's kprobe_lookup_name() and arch_kprobe_on_func_entry instead
of patching the common kprobes code
Changes since v1:
- make the kprobes/x86: use instruction_pointer and instruction_pointer_set
as patch1
- add Masami's ACK to patch1
- add some description about KPROBES_ON_FTRACE and why we need it on
arm64
- correct the log before the patch
- remove the consolidation patch, make it as TODO
- only adjust kprobe's addr when KPROBE_FLAG_FTRACE is set
- if KPROBES_ON_FTRACE, ftrace_call_adjust() the kprobe's addr before
calling ftrace_location()
- update the kprobes-on-ftrace/arch-support.txt in doc
Jisheng Zhang (2):
ftrace: introduce FTRACE_IP_EXTENSION
arm64: implement KPROBES_ON_FTRACE
Naveen N. Rao (1):
kprobes/ftrace: Use ftrace_location() when [dis]arming probes
.../debug/kprobes-on-ftrace/arch-support.txt | 2 +-
arch/arm64/Kconfig | 1 +
arch/arm64/include/asm/ftrace.h | 1 +
arch/arm64/kernel/probes/Makefile | 1 +
arch/arm64/kernel/probes/ftrace.c | 78 +++++++++++++++++++
include/linux/ftrace.h | 4 +
kernel/kprobes.c | 8 +-
kernel/trace/ftrace.c | 2 +-
8 files changed, 92 insertions(+), 5 deletions(-)
create mode 100644 arch/arm64/kernel/probes/ftrace.c
--
2.24.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Ftrace location could include more than a single instruction in case
of some architectures (powerpc64, for now). In this case, kprobe is
permitted on any of those instructions, and uses ftrace infrastructure
for functioning.
However, [dis]arm_kprobe_ftrace() uses the kprobe address when setting
up ftrace filter IP. This won't work if the address points to any
instruction apart from the one that has a branch to _mcount(). To
resolve this, have [dis]arm_kprobe_ftrace() use ftrace_function() to
identify the filter IP.
Signed-off-by: Naveen N. Rao <redacted>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
---
kernel/kprobes.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
@@ -986,9 +986,10 @@ static int prepare_kprobe(struct kprobe *p)staticint__arm_kprobe_ftrace(structkprobe*p,structftrace_ops*ops,int*cnt){+unsignedlongftrace_ip=ftrace_location((unsignedlong)p->addr);intret=0;-ret=ftrace_set_filter_ip(ops,(unsignedlong)p->addr,0,0);+ret=ftrace_set_filter_ip(ops,ftrace_ip,0,0);if(ret){pr_debug("Failed to arm kprobe-ftrace at %pS (%d)\n",p->addr,ret);
On some architectures, the DYNAMIC_FTRACE_WITH_REGS is implemented by
gcc's -fpatchable-function-entry option. Take arm64 for example, arm64
makes use of GCC -fpatchable-function-entry=2 option to insert two
nops. When the function is traced, the first nop will be modified to
the LR saver, then the second nop to "bl <ftrace-entry>". we need to
update ftrace_location() to recognise these two instructions as being
part of ftrace. To do this, we introduce FTRACE_IP_EXTENSION to let
ftrace_location search IP, IP + FTRACE_IP_EXTENSION range.
Signed-off-by: Jisheng Zhang <redacted>
Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
include/linux/ftrace.h | 4 ++++
kernel/trace/ftrace.c | 2 +-
2 files changed, 5 insertions(+), 1 deletion(-)
@@ -1590,7 +1590,7 @@ unsigned long ftrace_location_range(unsigned long start, unsigned long end)*/unsignedlongftrace_location(unsignedlongip){-returnftrace_location_range(ip,ip);+returnftrace_location_range(ip,ip+FTRACE_IP_EXTENSION);}/**
--
2.24.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as it
eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
Tested on berlin arm64 platform.
~ # mount -t debugfs debugfs /sys/kernel/debug/
~ # cd /sys/kernel/debug/
/sys/kernel/debug # echo 'p _do_fork' > tracing/kprobe_events
before the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009fe28 k _do_fork+0x0 [DISABLED]
after the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009ff54 k _do_fork+0x0 [DISABLED][FTRACE]
Signed-off-by: Jisheng Zhang <redacted>
---
.../debug/kprobes-on-ftrace/arch-support.txt | 2 +-
arch/arm64/Kconfig | 1 +
arch/arm64/include/asm/ftrace.h | 1 +
arch/arm64/kernel/probes/Makefile | 1 +
arch/arm64/kernel/probes/ftrace.c | 78 +++++++++++++++++++
5 files changed, 82 insertions(+), 1 deletion(-)
create mode 100644 arch/arm64/kernel/probes/ftrace.c
@@ -0,0 +1,78 @@+// SPDX-License-Identifier: GPL-2.0-or-later+/*+*DynamicFtracebasedKprobesOptimization+*+*Copyright(C)HitachiLtd.,2012+*Copyright(C)2019JishengZhang<jszhang@kernel.org>+*SynapticsIncorporated+*/++#include<linux/kprobes.h>++/*+*Inarm64FTRACE_WITH_REGSimplementation,wepatchtwonopinstructions:+*thelrsaverandblftrace-entry.Boththeseinstructionsareclaimed+*byftraceandweshouldallowprobingoneitherinstruction.+*/+intarch_check_ftrace_location(structkprobe*p)+{+if(ftrace_location((unsignedlong)p->addr))+p->flags|=KPROBE_FLAG_FTRACE;+return0;+}++/* Ftrace callback handler for kprobes -- called under preepmt disabed */+voidkprobe_ftrace_handler(unsignedlongip,unsignedlongparent_ip,+structftrace_ops*ops,structpt_regs*regs)+{+boollr_saver=false;+structkprobe*p;+structkprobe_ctlblk*kcb;++/* Preempt is disabled by ftrace */+p=get_kprobe((kprobe_opcode_t*)ip);+if(!p){+p=get_kprobe((kprobe_opcode_t*)(ip-MCOUNT_INSN_SIZE));+if(unlikely(!p)||kprobe_disabled(p))+return;+lr_saver=true;+}++kcb=get_kprobe_ctlblk();+if(kprobe_running()){+kprobes_inc_nmissed_count(p);+}else{+unsignedlongorig_ip=instruction_pointer(regs);++if(lr_saver)+ip-=MCOUNT_INSN_SIZE;+instruction_pointer_set(regs,ip);+__this_cpu_write(current_kprobe,p);+kcb->kprobe_status=KPROBE_HIT_ACTIVE;+if(!p->pre_handler||!p->pre_handler(p,regs)){+/*+*Emulatesinglestep(andalsorecoverregs->pc)+*asifthereisanop+*/+instruction_pointer_set(regs,+(unsignedlong)p->addr+MCOUNT_INSN_SIZE);+if(unlikely(p->post_handler)){+kcb->kprobe_status=KPROBE_HIT_SSDONE;+p->post_handler(p,regs,0);+}+instruction_pointer_set(regs,orig_ip);+}+/*+*Ifpre_handlerreturns!0,itchangesregs->pc.Wehaveto+*skipemulatingpost_handler.+*/+__this_cpu_write(current_kprobe,NULL);+}+}+NOKPROBE_SYMBOL(kprobe_ftrace_handler);++intarch_prepare_kprobe_ftrace(structkprobe*p)+{+p->ainsn.api.insn=NULL;+return0;+}
--
2.24.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Wed, 25 Dec 2019 09:42:07 +0000 Jisheng Zhang wrote:
oops, I missed "From: Naveen N. Rao [off-list ref]"
I will take care this point when posting new version.
quoted hunk
Ftrace location could include more than a single instruction in case
of some architectures (powerpc64, for now). In this case, kprobe is
permitted on any of those instructions, and uses ftrace infrastructure
for functioning.
However, [dis]arm_kprobe_ftrace() uses the kprobe address when setting
up ftrace filter IP. This won't work if the address points to any
instruction apart from the one that has a branch to _mcount(). To
resolve this, have [dis]arm_kprobe_ftrace() use ftrace_function() to
identify the filter IP.
Signed-off-by: Naveen N. Rao <redacted>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
---
kernel/kprobes.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
@@ -986,9 +986,10 @@ static int prepare_kprobe(struct kprobe *p)staticint__arm_kprobe_ftrace(structkprobe*p,structftrace_ops*ops,int*cnt){+unsignedlongftrace_ip=ftrace_location((unsignedlong)p->addr);intret=0;-ret=ftrace_set_filter_ip(ops,(unsignedlong)p->addr,0,0);+ret=ftrace_set_filter_ip(ops,ftrace_ip,0,0);if(ret){pr_debug("Failed to arm kprobe-ftrace at %pS (%d)\n",p->addr,ret);
On Wed, 25 Dec 2019 09:42:52 +0000
Jisheng Zhang [off-list ref] wrote:
On some architectures, the DYNAMIC_FTRACE_WITH_REGS is implemented by
gcc's -fpatchable-function-entry option. Take arm64 for example, arm64
makes use of GCC -fpatchable-function-entry=2 option to insert two
nops. When the function is traced, the first nop will be modified to
the LR saver, then the second nop to "bl <ftrace-entry>". we need to
update ftrace_location() to recognise these two instructions as being
part of ftrace. To do this, we introduce FTRACE_IP_EXTENSION to let
ftrace_location search IP, IP + FTRACE_IP_EXTENSION range.
Looks good to me.
Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Thanks!
@@ -1590,7 +1590,7 @@ unsigned long ftrace_location_range(unsigned long start, unsigned long end)*/unsignedlongftrace_location(unsignedlongip){-returnftrace_location_range(ip,ip);+returnftrace_location_range(ip,ip+FTRACE_IP_EXTENSION);}/**
Hi Jisheng,
On Wed, 25 Dec 2019 09:44:21 +0000
Jisheng Zhang [off-list ref] wrote:
KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as it
eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
Tested on berlin arm64 platform.
~ # mount -t debugfs debugfs /sys/kernel/debug/
~ # cd /sys/kernel/debug/
/sys/kernel/debug # echo 'p _do_fork' > tracing/kprobe_events
before the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009fe28 k _do_fork+0x0 [DISABLED]
after the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009ff54 k _do_fork+0x0 [DISABLED][FTRACE]
What happens if user puts a probe on _do_fork+4?
Is that return -EILSEQ correctly?
Hi
On Thu, 26 Dec 2019 11:57:07 +0900 Masami Hiramatsu wrote:
Hi Jisheng,
On Wed, 25 Dec 2019 09:44:21 +0000
Jisheng Zhang [off-list ref] wrote:
quoted
KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as it
eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
Tested on berlin arm64 platform.
~ # mount -t debugfs debugfs /sys/kernel/debug/
~ # cd /sys/kernel/debug/
/sys/kernel/debug # echo 'p _do_fork' > tracing/kprobe_events
before the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009fe28 k _do_fork+0x0 [DISABLED]
after the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009ff54 k _do_fork+0x0 [DISABLED][FTRACE]
What happens if user puts a probe on _do_fork+4?
Is that return -EILSEQ correctly?
No, the 2nd bl ftrace-entry must not be probed.
The pair of lr-saver and bl ftrace-entry is tightly coupled. You can not
decouple it.
This is the key. different viewing of this results in different implementation.
I'm just wondering why are the two instructions considered as coupled. I think
here we met similar situation as powerpc: https://lkml.org/lkml/2019/6/18/646
the "mflr r0" equals to lr-saver here, branch to _mcount equals to bl ftrace-entry
could you please kindly comment more?
Thanks in advance
On Thu, 26 Dec 2019 03:18:07 +0000 Jisheng Zhang wrote:
Hi
On Thu, 26 Dec 2019 11:57:07 +0900 Masami Hiramatsu wrote:
quoted
Hi Jisheng,
On Wed, 25 Dec 2019 09:44:21 +0000
Jisheng Zhang [off-list ref] wrote:
quoted
KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as it
eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
Tested on berlin arm64 platform.
~ # mount -t debugfs debugfs /sys/kernel/debug/
~ # cd /sys/kernel/debug/
/sys/kernel/debug # echo 'p _do_fork' > tracing/kprobe_events
before the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009fe28 k _do_fork+0x0 [DISABLED]
after the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009ff54 k _do_fork+0x0 [DISABLED][FTRACE]
What happens if user puts a probe on _do_fork+4?
Is that return -EILSEQ correctly?
No, the 2nd bl ftrace-entry must not be probed.
The pair of lr-saver and bl ftrace-entry is tightly coupled. You can not
decouple it.
This is the key. different viewing of this results in different implementation.
I'm just wondering why are the two instructions considered as coupled. I think
here we met similar situation as powerpc: https://lkml.org/lkml/2019/6/18/646
the "mflr r0" equals to lr-saver here, branch to _mcount equals to bl ftrace-entry
could you please kindly comment more?
Thanks in advance
hmm, I think I may get some part of your opinion. In v7 implementation:
if probe on func+4, that's bl ftrace-entry, similar as mcount call on
other architectures, we allow this probe as normal.
if probe on func+0, the first param ip in kprobe_ftrace_handler() points
to func+4(this is adjusted by ftrace), regs->ip points to func+8, so in
kprobe_ftrace_handler() we modify regs->ip to func+0 to call kprobe
pre handler, then modify regs->ip to func+8 to call kprobe post handler.
As can be seen, the first two instructions are considered as a virtual
mcount call. From this point of view, lr saver and the bl <ftrace-entry>
is coupled.
If we split patch3 into two:
one to support kprobes func+4
the second to support kprobe on func+0
it would be much clearer.
Then the key here is whether we could allow both kprobes on func+0 and func+4
Thanks
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
On Thu, 26 Dec 2019 04:25:24 +0000
Jisheng Zhang [off-list ref] wrote:
quoted
quoted
quoted
+/*
+ * In arm64 FTRACE_WITH_REGS implementation, we patch two nop instructions:
+ * the lr saver and bl ftrace-entry. Both these instructions are claimed
+ * by ftrace and we should allow probing on either instruction.
No, the 2nd bl ftrace-entry must not be probed.
The pair of lr-saver and bl ftrace-entry is tightly coupled. You can not
decouple it.
This is the key. different viewing of this results in different implementation.
I'm just wondering why are the two instructions considered as coupled. I think
here we met similar situation as powerpc: https://lkml.org/lkml/2019/6/18/646
the "mflr r0" equals to lr-saver here, branch to _mcount equals to bl ftrace-entry
could you please kindly comment more?
Thanks in advance
hmm, I think I may get some part of your opinion. In v7 implementation:
if probe on func+4, that's bl ftrace-entry, similar as mcount call on
other architectures, we allow this probe as normal.
if probe on func+0, the first param ip in kprobe_ftrace_handler() points
to func+4(this is adjusted by ftrace), regs->ip points to func+8, so in
kprobe_ftrace_handler() we modify regs->ip to func+0 to call kprobe
pre handler, then modify regs->ip to func+8 to call kprobe post handler.
As can be seen, the first two instructions are considered as a virtual
mcount call. From this point of view, lr saver and the bl <ftrace-entry>
is coupled.
Yes, this is good. But probing on func+4 is meaningless. Both func+0 and
func+4 call a handler with same pt_regs. And it should have the stack
pointer which is NOT modified by lr-saver and regs->lr must point original
call address. (ftrace regs caller must do this fixup for supporting live
patching correctly)
And in this case, func+4 has fake pt_regs because it skips lr-saver's
effects.
And even if you fixed up the pt_regs, there is another problem of what
user expects on the target instructions.
As you know, dynamic ftrace will fill the instruction with NOP (2 NOPs
in arm64), in this case, maybe pt_regs are same except pc on func+0 and
func+4. But if ftrace already enabled on the function, user will see
there are lr-saver and bl, oops. In this case we have to change pt_regs
between func+0 and func+4. So it depends on the current mode.
However, IMHO, it is not worth to pay such simulation cost. No one want
to probe such simulated intermediate address. It is easy to expect the
result from the code. Moreover, the func+4 will not appear on debuginfo
because those 2 special insturctions are just appended by the compiler,
not generated by the code.
So I don't think we need to support func+4. We only need func+0, or func+8
(this must be same as func+0 except regs->pc anyway)
Thank you,
If we split patch3 into two:
one to support kprobes func+4
the second to support kprobe on func+0
it would be much clearer.
Then the key here is whether we could allow both kprobes on func+0 and func+4
Thanks
From: Steven Rostedt <rostedt@goodmis.org> Date: 2020-01-08 00:05:52
On Wed, 25 Dec 2019 09:42:52 +0000
Jisheng Zhang [off-list ref] wrote:
On some architectures, the DYNAMIC_FTRACE_WITH_REGS is implemented by
gcc's -fpatchable-function-entry option. Take arm64 for example, arm64
makes use of GCC -fpatchable-function-entry=2 option to insert two
nops. When the function is traced, the first nop will be modified to
the LR saver, then the second nop to "bl <ftrace-entry>". we need to
update ftrace_location() to recognise these two instructions as being
part of ftrace. To do this, we introduce FTRACE_IP_EXTENSION to let
ftrace_location search IP, IP + FTRACE_IP_EXTENSION range.
Signed-off-by: Jisheng Zhang <redacted>
Suggested-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
You can also add:
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
and when Masami is happy with your patches, it should go through the
tip tree.
Thanks!
-- Steve
@@ -1590,7 +1590,7 @@ unsigned long ftrace_location_range(unsigned long start, unsigned long end)*/unsignedlongftrace_location(unsignedlongip){-returnftrace_location_range(ip,ip);+returnftrace_location_range(ip,ip+FTRACE_IP_EXTENSION);}/**
From: Mark Rutland <mark.rutland@arm.com> Date: 2020-02-28 15:32:05
Hi,
This has been on my list to review for a while. Given Masami's comments,
I was waiting for a new version -- is there any plan to respin this?
Otherwise, I have some comments below.
On Wed, Dec 25, 2019 at 09:44:21AM +0000, Jisheng Zhang wrote:
KPROBES_ON_FTRACE avoids much of the overhead with regular kprobes as it
eliminates the need for a trap, as well as the need to emulate or
single-step instructions.
Where does this overhead matter?
Tested on berlin arm64 platform.
~ # mount -t debugfs debugfs /sys/kernel/debug/
~ # cd /sys/kernel/debug/
/sys/kernel/debug # echo 'p _do_fork' > tracing/kprobe_events
before the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009fe28 k _do_fork+0x0 [DISABLED]
after the patch:
/sys/kernel/debug # cat kprobes/list
ffffff801009ff54 k _do_fork+0x0 [DISABLED][FTRACE]
Just to check, how is the kprobe addresss expected to relate to the
function address? For any of {mcount, mfentry, patchable-function-entry}
there are some number of instructions prior to the call instruction.
Does the user have to provide that address?
How does this work on other architectures?
@@ -20,6 +20,7 @@/* The BL at the callsite's adjusted rec->ip */#define MCOUNT_INSN_SIZE AARCH64_INSN_SIZE+#define FTRACE_IP_EXTENSION MCOUNT_INSN_SIZE
I'm confused by what exactly this is meant to represent. At runtime our
rec->ip is always the BL, so what exactly is this attempting to account
for?
How does this work when using mcount rather than
patchable-function-entry?
Hi Jisheng,
Would you be still working on this series?
If you are still want to put a probe on func+4, it is OK if you can
completely emulate the 1st instruction. (lr save on the stack and
change the regs->sp)
Thank you,
On Thu, 26 Dec 2019 18:26:07 +0900
Masami Hiramatsu [off-list ref] wrote:
On Thu, 26 Dec 2019 04:25:24 +0000
Jisheng Zhang [off-list ref] wrote:
quoted
quoted
quoted
quoted
+/*
+ * In arm64 FTRACE_WITH_REGS implementation, we patch two nop instructions:
+ * the lr saver and bl ftrace-entry. Both these instructions are claimed
+ * by ftrace and we should allow probing on either instruction.
No, the 2nd bl ftrace-entry must not be probed.
The pair of lr-saver and bl ftrace-entry is tightly coupled. You can not
decouple it.
This is the key. different viewing of this results in different implementation.
I'm just wondering why are the two instructions considered as coupled. I think
here we met similar situation as powerpc: https://lkml.org/lkml/2019/6/18/646
the "mflr r0" equals to lr-saver here, branch to _mcount equals to bl ftrace-entry
could you please kindly comment more?
Thanks in advance
hmm, I think I may get some part of your opinion. In v7 implementation:
if probe on func+4, that's bl ftrace-entry, similar as mcount call on
other architectures, we allow this probe as normal.
if probe on func+0, the first param ip in kprobe_ftrace_handler() points
to func+4(this is adjusted by ftrace), regs->ip points to func+8, so in
kprobe_ftrace_handler() we modify regs->ip to func+0 to call kprobe
pre handler, then modify regs->ip to func+8 to call kprobe post handler.
As can be seen, the first two instructions are considered as a virtual
mcount call. From this point of view, lr saver and the bl <ftrace-entry>
is coupled.
Yes, this is good. But probing on func+4 is meaningless. Both func+0 and
func+4 call a handler with same pt_regs. And it should have the stack
pointer which is NOT modified by lr-saver and regs->lr must point original
call address. (ftrace regs caller must do this fixup for supporting live
patching correctly)
And in this case, func+4 has fake pt_regs because it skips lr-saver's
effects.
And even if you fixed up the pt_regs, there is another problem of what
user expects on the target instructions.
As you know, dynamic ftrace will fill the instruction with NOP (2 NOPs
in arm64), in this case, maybe pt_regs are same except pc on func+0 and
func+4. But if ftrace already enabled on the function, user will see
there are lr-saver and bl, oops. In this case we have to change pt_regs
between func+0 and func+4. So it depends on the current mode.
However, IMHO, it is not worth to pay such simulation cost. No one want
to probe such simulated intermediate address. It is easy to expect the
result from the code. Moreover, the func+4 will not appear on debuginfo
because those 2 special insturctions are just appended by the compiler,
not generated by the code.
So I don't think we need to support func+4. We only need func+0, or func+8
(this must be same as func+0 except regs->pc anyway)
Thank you,
quoted
If we split patch3 into two:
one to support kprobes func+4
the second to support kprobe on func+0
it would be much clearer.
Then the key here is whether we could allow both kprobes on func+0 and func+4
Thanks
On Tue, 21 Jul 2020 22:24:55 +0900 Masami Hiramatsu wrote:
Hi Jisheng,
Hi,
Would you be still working on this series?
I will rebase the implementation on the latest code, then try to address
your comments and Mark's comments. I will send out patches in this weekend.
If you are still want to put a probe on func+4, it is OK if you can
completely emulate the 1st instruction. (lr save on the stack and
change the regs->sp)
On Tue, 21 Jul 2020 22:24:55 +0900 Masami Hiramatsu wrote:
quoted
Hi Jisheng,
Hi,
quoted
Would you be still working on this series?
I will rebase the implementation on the latest code, then try to address
your comments and Mark's comments. I will send out patches in this weekend.
quoted
If you are still want to put a probe on func+4, it is OK if you can
completely emulate the 1st instruction. (lr save on the stack and
change the regs->sp)
Will check which is the better solution.
Thanks Jisheng!
What I'm considering is the consistency of pre_handler()@addr and
post_handler()@addr+4. Also, whether the value of regs (and stacks) is
same as the user expected.
Thank you,
--
Masami Hiramatsu [off-list ref]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel