* [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() @ 2008-03-16 8:21 Yakov Lerner 2008-03-17 5:19 ` Ananth N Mavinakayanahalli 2008-03-21 11:08 ` Ingo Molnar 0 siblings, 2 replies; 11+ messages in thread From: Yakov Lerner @ 2008-03-16 8:21 UTC (permalink / raw) To: prasanna, ananth, anil.s.keshavamurthy, davem, linux-kernel, iler.ml I was trying to get the address of instruction to be executed next after the kprobed instruction. But regs->eip in post_handler() contains value which is useless to the user. It's pre-corrected value. This value is difficult to use without access to resume_execution(), which is not exported anyway. I moved the invocation of post_handler() to *after* resume_execution(). Now regs->eip contains meaningful value in post_handler(). I do not think this change breaks any backward-compatibility. To make meaning of the old value, post_handler() would need access to resume_execution() which is not exported. I have difficulty to believe that previous, uncorrected, regs->eip can be meaningfully used in post_handler(). Signed-off-by: Yakov Lerner <iler.ml@gmail.com> --- arch/x86/kernel/kprobes.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c index 34a5912..60392e2 100644 --- a/arch/x86/kernel/kprobes.c +++ b/arch/x86/kernel/kprobes.c @@ -858,15 +858,15 @@ static int __kprobes post_kprobe_handler(struct pt_regs *regs) if (!cur) return 0; + resume_execution(cur, regs, kcb); + regs->flags |= kcb->kprobe_saved_flags; + trace_hardirqs_fixup_flags(regs->flags); + if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { kcb->kprobe_status = KPROBE_HIT_SSDONE; cur->post_handler(cur, regs, 0); } - resume_execution(cur, regs, kcb); - regs->flags |= kcb->kprobe_saved_flags; - trace_hardirqs_fixup_flags(regs->flags); - /* Restore back the original saved kprobes variables and continue. */ if (kcb->kprobe_status == KPROBE_REENTER) { restore_previous_kprobe(kcb); -- 1.5.4.4 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-16 8:21 [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() Yakov Lerner @ 2008-03-17 5:19 ` Ananth N Mavinakayanahalli 2008-03-17 10:59 ` Yakov Lerner 2008-03-21 11:08 ` Ingo Molnar 1 sibling, 1 reply; 11+ messages in thread From: Ananth N Mavinakayanahalli @ 2008-03-17 5:19 UTC (permalink / raw) To: Yakov Lerner; +Cc: prasanna, anil.s.keshavamurthy, davem, linux-kernel On Sun, Mar 16, 2008 at 03:21:21AM -0500, Yakov Lerner wrote: > > I was trying to get the address of instruction to be executed > next after the kprobed instruction. But regs->eip in post_handler() > contains value which is useless to the user. It's pre-corrected value. > This value is difficult to use without access to resume_execution(), which > is not exported anyway. > I moved the invocation of post_handler() to *after* resume_execution(). > Now regs->eip contains meaningful value in post_handler(). > > I do not think this change breaks any backward-compatibility. > To make meaning of the old value, post_handler() would need access to > resume_execution() which is not exported. I have difficulty to believe > that previous, uncorrected, regs->eip can be meaningfully used in > post_handler(). resume_execution() exists not just for the program counter fixups after out-of-line singlestepping, but is also as an insurance to put the program counter back to the correct address in case the user's post_handler() mucks around with it. That isn't possible with this change :-( Ananth ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-17 5:19 ` Ananth N Mavinakayanahalli @ 2008-03-17 10:59 ` Yakov Lerner 2008-03-17 12:39 ` Ananth N Mavinakayanahalli 0 siblings, 1 reply; 11+ messages in thread From: Yakov Lerner @ 2008-03-17 10:59 UTC (permalink / raw) To: ananth; +Cc: prasanna, anil.s.keshavamurthy, davem, linux-kernel On Mon, Mar 17, 2008 at 7:19 AM, Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote: > On Sun, Mar 16, 2008 at 03:21:21AM -0500, Yakov Lerner wrote: > > > > I was trying to get the address of instruction to be executed > > next after the kprobed instruction. But regs->eip in post_handler() > > contains value which is useless to the user. It's pre-corrected value. > > This value is difficult to use without access to resume_execution(), which > > is not exported anyway. > > I moved the invocation of post_handler() to *after* resume_execution(). > > Now regs->eip contains meaningful value in post_handler(). > > > > I do not think this change breaks any backward-compatibility. > > To make meaning of the old value, post_handler() would need access to > > resume_execution() which is not exported. I have difficulty to believe > > that previous, uncorrected, regs->eip can be meaningfully used in > > post_handler(). > > resume_execution() exists not just for the program counter fixups after > out-of-line singlestepping, but is also as an insurance to put the > program counter back to the correct address in case the user's > post_handler() mucks around with it. That isn't possible with this > change :-( I see your point. This can be prevented by saving and restoring regs->ip around the post_handler() call, no ? Current code is beautiful. Saving and restoring regs->ip would make this place look ugly. Otoh, if the post_handler() wants to crash the kernel, it can do it in thousand ways, not just by trashing regs->ip, no ? Yakov ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-17 10:59 ` Yakov Lerner @ 2008-03-17 12:39 ` Ananth N Mavinakayanahalli 2008-03-17 22:17 ` Masami Hiramatsu 0 siblings, 1 reply; 11+ messages in thread From: Ananth N Mavinakayanahalli @ 2008-03-17 12:39 UTC (permalink / raw) To: Yakov Lerner; +Cc: prasanna, anil.s.keshavamurthy, davem, linux-kernel On Mon, Mar 17, 2008 at 12:59:05PM +0200, Yakov Lerner wrote: > On Mon, Mar 17, 2008 at 7:19 AM, Ananth N Mavinakayanahalli > <ananth@in.ibm.com> wrote: > > On Sun, Mar 16, 2008 at 03:21:21AM -0500, Yakov Lerner wrote: > > > > > > I was trying to get the address of instruction to be executed > > > next after the kprobed instruction. But regs->eip in post_handler() > > > contains value which is useless to the user. It's pre-corrected value. > > > This value is difficult to use without access to resume_execution(), which > > > is not exported anyway. > > > I moved the invocation of post_handler() to *after* resume_execution(). > > > Now regs->eip contains meaningful value in post_handler(). > > > > > > I do not think this change breaks any backward-compatibility. > > > To make meaning of the old value, post_handler() would need access to > > > resume_execution() which is not exported. I have difficulty to believe > > > that previous, uncorrected, regs->eip can be meaningfully used in > > > post_handler(). > > > > resume_execution() exists not just for the program counter fixups after > > out-of-line singlestepping, but is also as an insurance to put the > > program counter back to the correct address in case the user's > > post_handler() mucks around with it. That isn't possible with this > > change :-( > > I see your point. This can be prevented by saving and restoring regs->ip > around the post_handler() call, no ? Current code is beautiful. Saving and > restoring regs->ip would make this place look ugly. > > Otoh, if the post_handler() wants to crash the kernel, it can do it > in thousand ways, not just by trashing regs->ip, no ? Of course, there still are other ways to shoot yourself in the foot with the post_handler(), but, atleast for cases we can control, we need to do the right thing. Ananth ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-17 12:39 ` Ananth N Mavinakayanahalli @ 2008-03-17 22:17 ` Masami Hiramatsu 2008-03-18 4:26 ` Ananth N Mavinakayanahalli 0 siblings, 1 reply; 11+ messages in thread From: Masami Hiramatsu @ 2008-03-17 22:17 UTC (permalink / raw) To: ananth; +Cc: Yakov Lerner, prasanna, anil.s.keshavamurthy, davem, linux-kernel Ananth N Mavinakayanahalli wrote: > On Mon, Mar 17, 2008 at 12:59:05PM +0200, Yakov Lerner wrote: >> On Mon, Mar 17, 2008 at 7:19 AM, Ananth N Mavinakayanahalli >> <ananth@in.ibm.com> wrote: >>> On Sun, Mar 16, 2008 at 03:21:21AM -0500, Yakov Lerner wrote: >>> > >>> > I was trying to get the address of instruction to be executed >>> > next after the kprobed instruction. But regs->eip in post_handler() >>> > contains value which is useless to the user. It's pre-corrected value. >>> > This value is difficult to use without access to resume_execution(), which >>> > is not exported anyway. >>> > I moved the invocation of post_handler() to *after* resume_execution(). >>> > Now regs->eip contains meaningful value in post_handler(). >>> > >>> > I do not think this change breaks any backward-compatibility. >>> > To make meaning of the old value, post_handler() would need access to >>> > resume_execution() which is not exported. I have difficulty to believe >>> > that previous, uncorrected, regs->eip can be meaningfully used in >>> > post_handler(). >>> >>> resume_execution() exists not just for the program counter fixups after >>> out-of-line singlestepping, but is also as an insurance to put the >>> program counter back to the correct address in case the user's >>> post_handler() mucks around with it. That isn't possible with this >>> change :-( >> I see your point. This can be prevented by saving and restoring regs->ip >> around the post_handler() call, no ? Current code is beautiful. Saving and >> restoring regs->ip would make this place look ugly. >> >> Otoh, if the post_handler() wants to crash the kernel, it can do it >> in thousand ways, not just by trashing regs->ip, no ? > > Of course, there still are other ways to shoot yourself in the foot with > the post_handler(), but, atleast for cases we can control, we need to do > the right thing. Ananth, I think we can not prevent it even if resume_execution() is called after post_handler, because resume_execution() refers reg->ip...:-( And Yakov, I think you might need to make a patchset against all arch which support kprobes, because this patch modifies expected behavior of kprobes only on x86. IMHO, Yakov's suggestion will be also good for resume_execution(), because it only has to clean up after expectable-single-stepping. (user code is unexpectable... we can not control all of that) Thanks, -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: mhiramat@redhat.com ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-17 22:17 ` Masami Hiramatsu @ 2008-03-18 4:26 ` Ananth N Mavinakayanahalli 0 siblings, 0 replies; 11+ messages in thread From: Ananth N Mavinakayanahalli @ 2008-03-18 4:26 UTC (permalink / raw) To: Masami Hiramatsu Cc: Yakov Lerner, prasanna, anil.s.keshavamurthy, davem, linux-kernel On Mon, Mar 17, 2008 at 06:17:21PM -0400, Masami Hiramatsu wrote: > Ananth N Mavinakayanahalli wrote: > > On Mon, Mar 17, 2008 at 12:59:05PM +0200, Yakov Lerner wrote: > >> On Mon, Mar 17, 2008 at 7:19 AM, Ananth N Mavinakayanahalli > >> <ananth@in.ibm.com> wrote: > >>> On Sun, Mar 16, 2008 at 03:21:21AM -0500, Yakov Lerner wrote: > >>> > > >>> > I was trying to get the address of instruction to be executed > >>> > next after the kprobed instruction. But regs->eip in post_handler() > >>> > contains value which is useless to the user. It's pre-corrected value. > >>> > This value is difficult to use without access to resume_execution(), which > >>> > is not exported anyway. > >>> > I moved the invocation of post_handler() to *after* resume_execution(). > >>> > Now regs->eip contains meaningful value in post_handler(). > >>> > > >>> > I do not think this change breaks any backward-compatibility. > >>> > To make meaning of the old value, post_handler() would need access to > >>> > resume_execution() which is not exported. I have difficulty to believe > >>> > that previous, uncorrected, regs->eip can be meaningfully used in > >>> > post_handler(). > >>> > >>> resume_execution() exists not just for the program counter fixups after > >>> out-of-line singlestepping, but is also as an insurance to put the > >>> program counter back to the correct address in case the user's > >>> post_handler() mucks around with it. That isn't possible with this > >>> change :-( > >> I see your point. This can be prevented by saving and restoring regs->ip > >> around the post_handler() call, no ? Current code is beautiful. Saving and > >> restoring regs->ip would make this place look ugly. > >> > >> Otoh, if the post_handler() wants to crash the kernel, it can do it > >> in thousand ways, not just by trashing regs->ip, no ? > > > > Of course, there still are other ways to shoot yourself in the foot with > > the post_handler(), but, atleast for cases we can control, we need to do > > the right thing. > > Ananth, I think we can not prevent it even if resume_execution() is called > after post_handler, because resume_execution() refers reg->ip...:-( OK, I see what you are referring to... though we use kp.addr and kp.ainsn.insn to start with, we'll need the knowledge of regs->ip at the end. > And Yakov, I think you might need to make a patchset against all arch which > support kprobes, because this patch modifies expected behavior of kprobes > only on x86. Agreed. > IMHO, Yakov's suggestion will be also good for resume_execution(), because > it only has to clean up after expectable-single-stepping. (user code is > unexpectable... we can not control all of that) Ananth ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-16 8:21 [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() Yakov Lerner 2008-03-17 5:19 ` Ananth N Mavinakayanahalli @ 2008-03-21 11:08 ` Ingo Molnar 2008-03-21 11:31 ` Ananth N Mavinakayanahalli 2008-03-21 23:18 ` Masami Hiramatsu 1 sibling, 2 replies; 11+ messages in thread From: Ingo Molnar @ 2008-03-21 11:08 UTC (permalink / raw) To: Yakov Lerner Cc: prasanna, ananth, anil.s.keshavamurthy, davem, linux-kernel, Masami Hiramatsu * Yakov Lerner <iler.ml@gmail.com> wrote: > I was trying to get the address of instruction to be executed next > after the kprobed instruction. But regs->eip in post_handler() > contains value which is useless to the user. It's pre-corrected value. > This value is difficult to use without access to resume_execution(), > which is not exported anyway. I moved the invocation of post_handler() > to *after* resume_execution(). Now regs->eip contains meaningful value > in post_handler(). > > I do not think this change breaks any backward-compatibility. To make > meaning of the old value, post_handler() would need access to > resume_execution() which is not exported. I have difficulty to > believe that previous, uncorrected, regs->eip can be meaningfully used > in post_handler(). thanks, i've added your patch to the .26 bucket of x86.git, but it would be nice to get an Ack/Nack from a kprobes person as well. Ingo ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-21 11:08 ` Ingo Molnar @ 2008-03-21 11:31 ` Ananth N Mavinakayanahalli 2008-03-21 14:32 ` Ingo Molnar 2008-03-21 23:18 ` Masami Hiramatsu 1 sibling, 1 reply; 11+ messages in thread From: Ananth N Mavinakayanahalli @ 2008-03-21 11:31 UTC (permalink / raw) To: Ingo Molnar Cc: Yakov Lerner, anil.s.keshavamurthy, davem, linux-kernel, Masami Hiramatsu On Fri, Mar 21, 2008 at 12:08:04PM +0100, Ingo Molnar wrote: > > * Yakov Lerner <iler.ml@gmail.com> wrote: > > > I was trying to get the address of instruction to be executed next > > after the kprobed instruction. But regs->eip in post_handler() > > contains value which is useless to the user. It's pre-corrected value. > > This value is difficult to use without access to resume_execution(), > > which is not exported anyway. I moved the invocation of post_handler() > > to *after* resume_execution(). Now regs->eip contains meaningful value > > in post_handler(). > > > > I do not think this change breaks any backward-compatibility. To make > > meaning of the old value, post_handler() would need access to > > resume_execution() which is not exported. I have difficulty to > > believe that previous, uncorrected, regs->eip can be meaningfully used > > in post_handler(). > > thanks, i've added your patch to the .26 bucket of x86.git, but it would > be nice to get an Ack/Nack from a kprobes person as well. Ingo, I've tested Yakov's more comprehensive patch on powerpc too. This has my ack. Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-21 11:31 ` Ananth N Mavinakayanahalli @ 2008-03-21 14:32 ` Ingo Molnar 2008-03-21 14:51 ` Ananth N Mavinakayanahalli 0 siblings, 1 reply; 11+ messages in thread From: Ingo Molnar @ 2008-03-21 14:32 UTC (permalink / raw) To: Ananth N Mavinakayanahalli Cc: Yakov Lerner, anil.s.keshavamurthy, davem, linux-kernel, Masami Hiramatsu * Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote: > > thanks, i've added your patch to the .26 bucket of x86.git, but it > > would be nice to get an Ack/Nack from a kprobes person as well. > > Ingo, > > I've tested Yakov's more comprehensive patch on powerpc too. This has > my ack. > > Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> thanks, i've queued up the x86-only patch below for .26 merging. (that is all that is needed for x86, and no .25 urgency, right?) Ingo ------------------> Subject: x86, kprobes: correct post-eip value in post_hander() From: "Yakov Lerner" <iler.ml@gmail.com> Date: Sun, 16 Mar 2008 03:21:21 -0500 I was trying to get the address of instruction to be executed next after the kprobed instruction. But regs->eip in post_handler() contains value which is useless to the user. It's pre-corrected value. This value is difficult to use without access to resume_execution(), which is not exported anyway. I moved the invocation of post_handler() to *after* resume_execution(). Now regs->eip contains meaningful value in post_handler(). I do not think this change breaks any backward-compatibility. To make meaning of the old value, post_handler() would need access to resume_execution() which is not exported. I have difficulty to believe that previous, uncorrected, regs->eip can be meaningfully used in post_handler(). Signed-off-by: Yakov Lerner <iler.ml@gmail.com> Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> --- arch/x86/kernel/kprobes.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) Index: linux-x86.q/arch/x86/kernel/kprobes.c =================================================================== --- linux-x86.q.orig/arch/x86/kernel/kprobes.c +++ linux-x86.q/arch/x86/kernel/kprobes.c @@ -858,15 +858,15 @@ static int __kprobes post_kprobe_handler if (!cur) return 0; + resume_execution(cur, regs, kcb); + regs->flags |= kcb->kprobe_saved_flags; + trace_hardirqs_fixup_flags(regs->flags); + if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { kcb->kprobe_status = KPROBE_HIT_SSDONE; cur->post_handler(cur, regs, 0); } - resume_execution(cur, regs, kcb); - regs->flags |= kcb->kprobe_saved_flags; - trace_hardirqs_fixup_flags(regs->flags); - /* Restore back the original saved kprobes variables and continue. */ if (kcb->kprobe_status == KPROBE_REENTER) { restore_previous_kprobe(kcb); ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-21 14:32 ` Ingo Molnar @ 2008-03-21 14:51 ` Ananth N Mavinakayanahalli 0 siblings, 0 replies; 11+ messages in thread From: Ananth N Mavinakayanahalli @ 2008-03-21 14:51 UTC (permalink / raw) To: Ingo Molnar Cc: Yakov Lerner, anil.s.keshavamurthy, davem, linux-kernel, Masami Hiramatsu On Fri, Mar 21, 2008 at 03:32:29PM +0100, Ingo Molnar wrote: > > * Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote: > > > > thanks, i've added your patch to the .26 bucket of x86.git, but it > > > would be nice to get an Ack/Nack from a kprobes person as well. > > > > Ingo, > > > > I've tested Yakov's more comprehensive patch on powerpc too. This has > > my ack. > > > > Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> > > thanks, i've queued up the x86-only patch below for .26 merging. (that > is all that is needed for x86, and no .25 urgency, right?) Yup. This can wait for .26 Ananth ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() 2008-03-21 11:08 ` Ingo Molnar 2008-03-21 11:31 ` Ananth N Mavinakayanahalli @ 2008-03-21 23:18 ` Masami Hiramatsu 1 sibling, 0 replies; 11+ messages in thread From: Masami Hiramatsu @ 2008-03-21 23:18 UTC (permalink / raw) To: Ingo Molnar Cc: Yakov Lerner, prasanna, ananth, anil.s.keshavamurthy, davem, linux-kernel Ingo Molnar wrote: > * Yakov Lerner <iler.ml@gmail.com> wrote: > >> I was trying to get the address of instruction to be executed next >> after the kprobed instruction. But regs->eip in post_handler() >> contains value which is useless to the user. It's pre-corrected value. >> This value is difficult to use without access to resume_execution(), >> which is not exported anyway. I moved the invocation of post_handler() >> to *after* resume_execution(). Now regs->eip contains meaningful value >> in post_handler(). >> >> I do not think this change breaks any backward-compatibility. To make >> meaning of the old value, post_handler() would need access to >> resume_execution() which is not exported. I have difficulty to >> believe that previous, uncorrected, regs->eip can be meaningfully used >> in post_handler(). > > thanks, i've added your patch to the .26 bucket of x86.git, but it would > be nice to get an Ack/Nack from a kprobes person as well. > > Ingo Ingo, I also tested this on x86-64/x86/ia64. Acked-by: Masami Hiramatsu <mhiramat@redhat.com> Thanks, -- Masami Hiramatsu Software Engineer Hitachi Computer Products (America) Inc. Software Solutions Division e-mail: mhiramat@redhat.com ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2008-03-21 23:19 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-03-16 8:21 [PATCH] Subject: kprobes-x86: correct post-eip value in post_hander() Yakov Lerner 2008-03-17 5:19 ` Ananth N Mavinakayanahalli 2008-03-17 10:59 ` Yakov Lerner 2008-03-17 12:39 ` Ananth N Mavinakayanahalli 2008-03-17 22:17 ` Masami Hiramatsu 2008-03-18 4:26 ` Ananth N Mavinakayanahalli 2008-03-21 11:08 ` Ingo Molnar 2008-03-21 11:31 ` Ananth N Mavinakayanahalli 2008-03-21 14:32 ` Ingo Molnar 2008-03-21 14:51 ` Ananth N Mavinakayanahalli 2008-03-21 23:18 ` Masami Hiramatsu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox