* [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step [not found] <20121203150438.7727.74924.stgit@suzukikp> @ 2012-12-03 15:07 ` Suzuki K. Poulose 2012-12-11 5:48 ` Suzuki K. Poulose 2012-12-03 15:08 ` [PATCH v2 2/4] powerpc: Move the single step enable code to a generic path Suzuki K. Poulose 1 sibling, 1 reply; 6+ messages in thread From: Suzuki K. Poulose @ 2012-12-03 15:07 UTC (permalink / raw) To: bigeasy, oleg, ananth, srikar Cc: peterz, linux-kernel, linuxppc-dev, anton, mingo From: Suzuki K. Poulose <suzuki@in.ibm.com> External/Decrement exceptions have lower priority than the Debug Exception. So, we don't have to disable the External interrupts before a single step. However, on BookE, Critical Input Exception(CE) has higher priority than a Debug Exception. Hence we mask them. Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Cc: Ananth N Mavinakaynahalli <ananth@in.ibm.com> Cc: Kumar Gala <galak@kernel.crashing.org> Cc: linuxppc-dev@ozlabs.org --- arch/powerpc/kernel/kprobes.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index e88c643..4901b34 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c @@ -104,13 +104,13 @@ void __kprobes arch_remove_kprobe(struct kprobe *p) static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) { - /* We turn off async exceptions to ensure that the single step will - * be for the instruction we have the kprobe on, if we dont its - * possible we'd get the single step reported for an exception handler - * like Decrementer or External Interrupt */ - regs->msr &= ~MSR_EE; regs->msr |= MSR_SINGLESTEP; #ifdef CONFIG_PPC_ADV_DEBUG_REGS + /* + * We turn off Critical Input Exception(CE) to ensure that the single + * step will be for the instruction we have the probe on; if we don't, + * it is possible we'd get the single step reported for CE. + */ regs->msr &= ~MSR_CE; mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM); #ifdef CONFIG_PPC_47x ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step 2012-12-03 15:07 ` [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step Suzuki K. Poulose @ 2012-12-11 5:48 ` Suzuki K. Poulose 2013-01-04 4:42 ` Benjamin Herrenschmidt 0 siblings, 1 reply; 6+ messages in thread From: Suzuki K. Poulose @ 2012-12-11 5:48 UTC (permalink / raw) To: benh, Kumar Gala Cc: srikar, peterz, bigeasy, oleg, linux-kernel, linuxppc-dev, Suzuki K. Poulose, anton, mingo On 12/03/2012 08:37 PM, Suzuki K. Poulose wrote: > From: Suzuki K. Poulose <suzuki@in.ibm.com> > > External/Decrement exceptions have lower priority than the Debug Exception. > So, we don't have to disable the External interrupts before a single step. > However, on BookE, Critical Input Exception(CE) has higher priority than a > Debug Exception. Hence we mask them. > > Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > Cc: Ananth N Mavinakaynahalli <ananth@in.ibm.com> > Cc: Kumar Gala <galak@kernel.crashing.org> > Cc: linuxppc-dev@ozlabs.org > --- > arch/powerpc/kernel/kprobes.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c > index e88c643..4901b34 100644 > --- a/arch/powerpc/kernel/kprobes.c > +++ b/arch/powerpc/kernel/kprobes.c > @@ -104,13 +104,13 @@ void __kprobes arch_remove_kprobe(struct kprobe *p) > > static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) > { > - /* We turn off async exceptions to ensure that the single step will > - * be for the instruction we have the kprobe on, if we dont its > - * possible we'd get the single step reported for an exception handler > - * like Decrementer or External Interrupt */ > - regs->msr &= ~MSR_EE; > regs->msr |= MSR_SINGLESTEP; > #ifdef CONFIG_PPC_ADV_DEBUG_REGS > + /* > + * We turn off Critical Input Exception(CE) to ensure that the single > + * step will be for the instruction we have the probe on; if we don't, > + * it is possible we'd get the single step reported for CE. > + */ > regs->msr &= ~MSR_CE; > mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM); > #ifdef CONFIG_PPC_47x > Ben, Kumar, Could you please review this patch ? Thanks Suzuki ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step 2012-12-11 5:48 ` Suzuki K. Poulose @ 2013-01-04 4:42 ` Benjamin Herrenschmidt 2013-01-07 12:03 ` Sebastian Andrzej Siewior 0 siblings, 1 reply; 6+ messages in thread From: Benjamin Herrenschmidt @ 2013-01-04 4:42 UTC (permalink / raw) To: Suzuki K. Poulose Cc: srikar, peterz, linux-kernel, bigeasy, oleg, linuxppc-dev, anton, mingo On Tue, 2012-12-11 at 11:18 +0530, Suzuki K. Poulose wrote: > On 12/03/2012 08:37 PM, Suzuki K. Poulose wrote: > > From: Suzuki K. Poulose <suzuki@in.ibm.com> > > > > External/Decrement exceptions have lower priority than the Debug Exception. > > So, we don't have to disable the External interrupts before a single step. > > However, on BookE, Critical Input Exception(CE) has higher priority than a > > Debug Exception. Hence we mask them. I'm not sure about that one ... >From memory, 4xx has that interesting issue which is that if you have single step enabled and an interrupt (of *any kind* occurs), the processor *will* step into the first instruction of the interrupt handler. (In fact, some silicons have a bug where it can even be the *second* instruction of the handler, which can be problematic when the first one is a branch). This is why you may notice that whole business we have in the handling of debug/crit interrupts where we try to figure out if that happened, and return with DE off if it did. Now, the above mentioned workaround means we might not need to disable EE indeed. However, in any case, I don't see what your patch fixes or improves, nor do I understand what you mean by "it is possible we'd get the single step reported for CE". Please explain in more details and describe the problematic scenario. Cheers, Ben. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step 2013-01-04 4:42 ` Benjamin Herrenschmidt @ 2013-01-07 12:03 ` Sebastian Andrzej Siewior 0 siblings, 0 replies; 6+ messages in thread From: Sebastian Andrzej Siewior @ 2013-01-07 12:03 UTC (permalink / raw) To: Benjamin Herrenschmidt Cc: srikar, peterz, linux-kernel, oleg, linuxppc-dev, Suzuki K. Poulose, anton, mingo On 01/04/2013 05:42 AM, Benjamin Herrenschmidt wrote: > On Tue, 2012-12-11 at 11:18 +0530, Suzuki K. Poulose wrote: >> On 12/03/2012 08:37 PM, Suzuki K. Poulose wrote: >>> From: Suzuki K. Poulose<suzuki@in.ibm.com> >>> >>> External/Decrement exceptions have lower priority than the Debug Exception. >>> So, we don't have to disable the External interrupts before a single step. >>> However, on BookE, Critical Input Exception(CE) has higher priority than a >>> Debug Exception. Hence we mask them. > > I'm not sure about that one ... > >> From memory, 4xx has that interesting issue which is that if you have > single step enabled and an interrupt (of *any kind* occurs), the > processor *will* step into the first instruction of the interrupt > handler. (In fact, some silicons have a bug where it can even be the > *second* instruction of the handler, which can be problematic when the > first one is a branch). > > This is why you may notice that whole business we have in the handling > of debug/crit interrupts where we try to figure out if that happened, > and return with DE off if it did. > > Now, the above mentioned workaround means we might not need to disable > EE indeed. > > However, in any case, I don't see what your patch fixes or improves, nor > do I understand what you mean by "it is possible we'd get the single > step reported for CE". Please explain in more details and describe the > problematic scenario. This change is probably my fault to some degree so let me explain. I've been looking over the patch in first place and noticed that Suzuki disables EE while enabling single stepping. After looking into the manual I did not find a reason why this is done. _If_ an external interrupt is pending and we enable EE and DE at the same time (via rfi) then we should never land in the external interrupt handler but always in the debug exception handler (and EE is disabled on all interrupts by the CPU). So why disable EE here? _If_ the instruction in problem state triggers an DTLB exception then we land in the TLB exception handler with DE bit set in MSR. I would say that this isn't uncommon (same goes probably for the syscall opcode). After executing the first in instruction in kernel the CPU should disable the DE (and CE) bit in the MSR and invoke the critical exception handler. The critical debug exception handler seems to handle this case. So disable DE, let the previous handler continue and exit to problem state with DE enabled. From the uprobe point of view, we won't stop over kernel code but only know once a problem state instruction is over. Based on this I did not see a reason why we should disable EE (or CE) upfront. And for CE, it should be harmless if the code notices that we debug problem state and continue the non-critical exception with DE-disabled. Now, if you come along with some CPU erratas on the 4xx CPUs where we have to disable CE/EE because the CPU doesn't do what is expected then I think that this should be explained in the comment :) > Cheers, > Ben. Sebastian ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] powerpc: Move the single step enable code to a generic path [not found] <20121203150438.7727.74924.stgit@suzukikp> 2012-12-03 15:07 ` [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step Suzuki K. Poulose @ 2012-12-03 15:08 ` Suzuki K. Poulose 2012-12-10 10:34 ` Ananth N Mavinakayanahalli 1 sibling, 1 reply; 6+ messages in thread From: Suzuki K. Poulose @ 2012-12-03 15:08 UTC (permalink / raw) To: bigeasy, oleg, ananth, srikar Cc: peterz, linux-kernel, linuxppc-dev, anton, mingo From: Suzuki K. Poulose <suzuki@in.ibm.com> This patch moves the single step enable code used by kprobe to a generic routine header so that, it can be re-used by other code, in this case, uprobes. No functional changes. Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> Cc: Ananth N Mavinakaynahalli <ananth@in.ibm.com> Cc: Kumar Gala <galak@kernel.crashing.org> Cc: linuxppc-dev@ozlabs.org --- arch/powerpc/include/asm/probes.h | 25 +++++++++++++++++++++++++ arch/powerpc/kernel/kprobes.c | 21 +-------------------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/arch/powerpc/include/asm/probes.h b/arch/powerpc/include/asm/probes.h index 5f1e15b..f94a44f 100644 --- a/arch/powerpc/include/asm/probes.h +++ b/arch/powerpc/include/asm/probes.h @@ -38,5 +38,30 @@ typedef u32 ppc_opcode_t; #define is_trap(instr) (IS_TW(instr) || IS_TWI(instr)) #endif /* CONFIG_PPC64 */ +#ifdef CONFIG_PPC_ADV_DEBUG_REGS +#define MSR_SINGLESTEP (MSR_DE) +#else +#define MSR_SINGLESTEP (MSR_SE) +#endif + +/* Enable single stepping for the current task */ +static inline void enable_single_step(struct pt_regs *regs) +{ + regs->msr |= MSR_SINGLESTEP; +#ifdef CONFIG_PPC_ADV_DEBUG_REGS + /* + * We turn off Critical Input Exception(CE) to ensure that the single + * step will be for the instruction we have the probe on; if we don't, + * it is possible we'd get the single step reported for CE. + */ + regs->msr &= ~MSR_CE; + mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM); +#ifdef CONFIG_PPC_47x + isync(); +#endif +#endif +} + + #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_PROBES_H */ diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index 4901b34..92f1be7 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c @@ -36,12 +36,6 @@ #include <asm/sstep.h> #include <asm/uaccess.h> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS -#define MSR_SINGLESTEP (MSR_DE) -#else -#define MSR_SINGLESTEP (MSR_SE) -#endif - DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL; DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk); @@ -104,20 +98,7 @@ void __kprobes arch_remove_kprobe(struct kprobe *p) static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs) { - regs->msr |= MSR_SINGLESTEP; -#ifdef CONFIG_PPC_ADV_DEBUG_REGS - /* - * We turn off Critical Input Exception(CE) to ensure that the single - * step will be for the instruction we have the probe on; if we don't, - * it is possible we'd get the single step reported for CE. - */ - regs->msr &= ~MSR_CE; - mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM); -#ifdef CONFIG_PPC_47x - isync(); -#endif -#endif - + enable_single_step(regs); /* * On powerpc we should single step on the original * instruction even if the probed insn is a trap ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/4] powerpc: Move the single step enable code to a generic path 2012-12-03 15:08 ` [PATCH v2 2/4] powerpc: Move the single step enable code to a generic path Suzuki K. Poulose @ 2012-12-10 10:34 ` Ananth N Mavinakayanahalli 0 siblings, 0 replies; 6+ messages in thread From: Ananth N Mavinakayanahalli @ 2012-12-10 10:34 UTC (permalink / raw) To: Suzuki K. Poulose Cc: srikar, peterz, bigeasy, oleg, linuxppc-dev, anton, mingo, linux-kernel On Mon, Dec 03, 2012 at 08:38:37PM +0530, Suzuki K. Poulose wrote: > From: Suzuki K. Poulose <suzuki@in.ibm.com> > > This patch moves the single step enable code used by kprobe to a generic > routine header so that, it can be re-used by other code, in this case, > uprobes. No functional changes. > > Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com> > Cc: Ananth N Mavinakaynahalli <ananth@in.ibm.com> > Cc: Kumar Gala <galak@kernel.crashing.org> > Cc: linuxppc-dev@ozlabs.org Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-01-07 12:39 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <20121203150438.7727.74924.stgit@suzukikp> 2012-12-03 15:07 ` [PATCH v2 1/4] kprobes/powerpc: Do not disable External interrupts during single step Suzuki K. Poulose 2012-12-11 5:48 ` Suzuki K. Poulose 2013-01-04 4:42 ` Benjamin Herrenschmidt 2013-01-07 12:03 ` Sebastian Andrzej Siewior 2012-12-03 15:08 ` [PATCH v2 2/4] powerpc: Move the single step enable code to a generic path Suzuki K. Poulose 2012-12-10 10:34 ` Ananth N Mavinakayanahalli
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).