* [PATCH 1/4] powerpc: Revert show_regs() define for readability
@ 2011-10-06 12:53 Kumar Gala
2011-10-06 12:53 ` [PATCH 2/4] powerpc: Remove extraneous CONFIG_PPC_ADV_DEBUG_REGS define Kumar Gala
2011-10-28 19:40 ` [1/4] powerpc: Revert show_regs() define for readability Jimi Xenidis
0 siblings, 2 replies; 11+ messages in thread
From: Kumar Gala @ 2011-10-06 12:53 UTC (permalink / raw)
To: linuxppc-dev
We had an existing ifdef for 4xx & BOOKE processors that got changed to
CONFIG_PPC_ADV_DEBUG_REGS. The define has nothing to do with
CONFIG_PPC_ADV_DEBUG_REGS. The define really should be:
#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
and not
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/kernel/process.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 8f53954..a1b5981 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -657,7 +657,7 @@ void show_regs(struct pt_regs * regs)
if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
printk("CFAR: "REG"\n", regs->orig_gpr3);
if (trap == 0x300 || trap == 0x600)
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
+#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
#else
printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/4] powerpc: Remove extraneous CONFIG_PPC_ADV_DEBUG_REGS define
2011-10-06 12:53 [PATCH 1/4] powerpc: Revert show_regs() define for readability Kumar Gala
@ 2011-10-06 12:53 ` Kumar Gala
2011-10-06 12:53 ` [PATCH 3/4] powerpc/book3e-64: Fix debug support for userspace Kumar Gala
2011-10-28 19:40 ` [1/4] powerpc: Revert show_regs() define for readability Jimi Xenidis
1 sibling, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2011-10-06 12:53 UTC (permalink / raw)
To: linuxppc-dev
All of DebugException is already protected by CONFIG_PPC_ADV_DEBUG_REGS
there is no need to have another such ifdef inside the function.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/kernel/traps.c | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index f19d977..db733d3 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -1291,14 +1291,12 @@ void __kprobes DebugException(struct pt_regs *regs, unsigned long debug_status)
if (user_mode(regs)) {
current->thread.dbcr0 &= ~DBCR0_IC;
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
if (DBCR_ACTIVE_EVENTS(current->thread.dbcr0,
current->thread.dbcr1))
regs->msr |= MSR_DE;
else
/* Make sure the IDM bit is off */
current->thread.dbcr0 &= ~DBCR0_IDM;
-#endif
}
_exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
--
1.7.3.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/4] powerpc/book3e-64: Fix debug support for userspace
2011-10-06 12:53 ` [PATCH 2/4] powerpc: Remove extraneous CONFIG_PPC_ADV_DEBUG_REGS define Kumar Gala
@ 2011-10-06 12:53 ` Kumar Gala
2011-10-06 12:53 ` [PATCH 4/4] powerpc/booke: Re-organize debug code Kumar Gala
0 siblings, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2011-10-06 12:53 UTC (permalink / raw)
To: linuxppc-dev
With the introduction of CONFIG_PPC_ADV_DEBUG_REGS user space debug is
broken on Book-E 64-bit parts that support delayed debug events. When
switch_booke_debug_regs() sets DBCR0 we'll start getting debug events as
MSR_DE is also set and we aren't able to handle debug events from kernel
space.
We can remove the hack that always enables MSR_DE and loads up DBCR0 and
just utilize switch_booke_debug_regs() to get user space debug working
again.
We still need to handle critical/debug exception stacks & proper
save/restore of state for those exception levles to support debug events
from kernel space like we have on 32-bit.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/include/asm/reg_booke.h | 2 +-
arch/powerpc/kernel/process.c | 22 ----------------------
2 files changed, 1 insertions(+), 23 deletions(-)
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h
index 9ec0b39..4dfa21c 100644
--- a/arch/powerpc/include/asm/reg_booke.h
+++ b/arch/powerpc/include/asm/reg_booke.h
@@ -31,7 +31,7 @@
#define MSR_ MSR_ME | MSR_CE
#define MSR_KERNEL MSR_ | MSR_64BIT
-#define MSR_USER32 MSR_ | MSR_PR | MSR_EE | MSR_DE
+#define MSR_USER32 MSR_ | MSR_PR | MSR_EE
#define MSR_USER64 MSR_USER32 | MSR_64BIT
#elif defined (CONFIG_40x)
#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index a1b5981..269a309 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -486,28 +486,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
new_thread = &new->thread;
old_thread = ¤t->thread;
-#if defined(CONFIG_PPC_BOOK3E_64)
- /* XXX Current Book3E code doesn't deal with kernel side DBCR0,
- * we always hold the user values, so we set it now.
- *
- * However, we ensure the kernel MSR:DE is appropriately cleared too
- * to avoid spurrious single step exceptions in the kernel.
- *
- * This will have to change to merge with the ppc32 code at some point,
- * but I don't like much what ppc32 is doing today so there's some
- * thinking needed there
- */
- if ((new_thread->dbcr0 | old_thread->dbcr0) & DBCR0_IDM) {
- u32 dbcr0;
-
- mtmsr(mfmsr() & ~MSR_DE);
- isync();
- dbcr0 = mfspr(SPRN_DBCR0);
- dbcr0 = (dbcr0 & DBCR0_EDM) | new_thread->dbcr0;
- mtspr(SPRN_DBCR0, dbcr0);
- }
-#endif /* CONFIG_PPC64_BOOK3E */
-
#ifdef CONFIG_PPC64
/*
* Collect processor utilization data per process
--
1.7.3.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 4/4] powerpc/booke: Re-organize debug code
2011-10-06 12:53 ` [PATCH 3/4] powerpc/book3e-64: Fix debug support for userspace Kumar Gala
@ 2011-10-06 12:53 ` Kumar Gala
2011-10-28 19:37 ` [4/4] " Jimi Xenidis
0 siblings, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2011-10-06 12:53 UTC (permalink / raw)
To: linuxppc-dev
* set_dabr/do_dabr are no longer used when CNFIG_PPC_ADV_DEBUG_REGS is set
refactor code a bit such that we only build the dabr code for
!CONFIG_PPC_ADV_DEBUG_REGS and removed some CONFIG_PPC_ADV_DEBUG_REGS
code in set_dabr that would never get built.
* Move do_send_trap into traps.c as its only used there
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
---
arch/powerpc/include/asm/system.h | 5 +--
arch/powerpc/kernel/process.c | 97 +++++++++++++-----------------------
arch/powerpc/kernel/traps.c | 17 +++++++
3 files changed, 53 insertions(+), 66 deletions(-)
diff --git a/arch/powerpc/include/asm/system.h b/arch/powerpc/include/asm/system.h
index e30a13d..1dc5d9c 100644
--- a/arch/powerpc/include/asm/system.h
+++ b/arch/powerpc/include/asm/system.h
@@ -111,11 +111,8 @@ static inline int debugger_dabr_match(struct pt_regs *regs) { return 0; }
static inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
#endif
+#ifndef CONFIG_PPC_ADV_DEBUG_REGS
extern int set_dabr(unsigned long dabr);
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
-extern void do_send_trap(struct pt_regs *regs, unsigned long address,
- unsigned long error_code, int signal_code, int brkpt);
-#else
extern void do_dabr(struct pt_regs *regs, unsigned long address,
unsigned long error_code);
#endif
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 269a309..989e574 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -251,50 +251,6 @@ void discard_lazy_cpu_state(void)
#endif /* CONFIG_SMP */
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
-void do_send_trap(struct pt_regs *regs, unsigned long address,
- unsigned long error_code, int signal_code, int breakpt)
-{
- siginfo_t info;
-
- if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
- 11, SIGSEGV) == NOTIFY_STOP)
- return;
-
- /* Deliver the signal to userspace */
- info.si_signo = SIGTRAP;
- info.si_errno = breakpt; /* breakpoint or watchpoint id */
- info.si_code = signal_code;
- info.si_addr = (void __user *)address;
- force_sig_info(SIGTRAP, &info, current);
-}
-#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
-void do_dabr(struct pt_regs *regs, unsigned long address,
- unsigned long error_code)
-{
- siginfo_t info;
-
- if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
- 11, SIGSEGV) == NOTIFY_STOP)
- return;
-
- if (debugger_dabr_match(regs))
- return;
-
- /* Clear the DABR */
- set_dabr(0);
-
- /* Deliver the signal to userspace */
- info.si_signo = SIGTRAP;
- info.si_errno = 0;
- info.si_code = TRAP_HWBKPT;
- info.si_addr = (void __user *)address;
- force_sig_info(SIGTRAP, &info, current);
-}
-#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
-
-static DEFINE_PER_CPU(unsigned long, current_dabr);
-
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
/*
* Set the debug registers back to their default "safe" values.
*/
@@ -357,16 +313,7 @@ static void switch_booke_debug_regs(struct thread_struct *new_thread)
prime_debug_regs(new_thread);
}
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
-#ifndef CONFIG_HAVE_HW_BREAKPOINT
-static void set_debug_reg_defaults(struct thread_struct *thread)
-{
- if (thread->dabr) {
- thread->dabr = 0;
- set_dabr(0);
- }
-}
-#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
-#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
+static DEFINE_PER_CPU(unsigned long, current_dabr);
int set_dabr(unsigned long dabr)
{
@@ -376,19 +323,45 @@ int set_dabr(unsigned long dabr)
return ppc_md.set_dabr(dabr);
/* XXX should we have a CPU_FTR_HAS_DABR ? */
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
- mtspr(SPRN_DAC1, dabr);
-#ifdef CONFIG_PPC_47x
- isync();
-#endif
-#elif defined(CONFIG_PPC_BOOK3S)
mtspr(SPRN_DABR, dabr);
-#endif
-
return 0;
}
+void do_dabr(struct pt_regs *regs, unsigned long address,
+ unsigned long error_code)
+{
+ siginfo_t info;
+
+ if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
+ 11, SIGSEGV) == NOTIFY_STOP)
+ return;
+
+ if (debugger_dabr_match(regs))
+ return;
+
+ /* Clear the DABR */
+ set_dabr(0);
+
+ /* Deliver the signal to userspace */
+ info.si_signo = SIGTRAP;
+ info.si_errno = 0;
+ info.si_code = TRAP_HWBKPT;
+ info.si_addr = (void __user *)address;
+ force_sig_info(SIGTRAP, &info, current);
+}
+
+#ifndef CONFIG_HAVE_HW_BREAKPOINT
+static void set_debug_reg_defaults(struct thread_struct *thread)
+{
+ if (thread->dabr) {
+ thread->dabr = 0;
+ set_dabr(0);
+ }
+}
+#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
+#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
+
#ifdef CONFIG_PPC64
DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
#endif
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index db733d3..edc1108 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -1184,6 +1184,23 @@ void SoftwareEmulation(struct pt_regs *regs)
#endif /* CONFIG_8xx */
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
+static void do_send_trap(struct pt_regs *regs, unsigned long address,
+ unsigned long error_code, int signal_code, int breakpt)
+{
+ siginfo_t info;
+
+ if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
+ 11, SIGSEGV) == NOTIFY_STOP)
+ return;
+
+ /* Deliver the signal to userspace */
+ info.si_signo = SIGTRAP;
+ info.si_errno = breakpt; /* breakpoint or watchpoint id */
+ info.si_code = signal_code;
+ info.si_addr = (void __user *)address;
+ force_sig_info(SIGTRAP, &info, current);
+}
+
static void handle_debug(struct pt_regs *regs, unsigned long debug_status)
{
int changed = 0;
--
1.7.3.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [4/4] powerpc/booke: Re-organize debug code
2011-10-06 12:53 ` [PATCH 4/4] powerpc/booke: Re-organize debug code Kumar Gala
@ 2011-10-28 19:37 ` Jimi Xenidis
2011-10-31 14:21 ` Kumar Gala
0 siblings, 1 reply; 11+ messages in thread
From: Jimi Xenidis @ 2011-10-28 19:37 UTC (permalink / raw)
To: Kumar Gala, Ben Herrenschmidt; +Cc: linuxppc-dev
On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
> * set_dabr/do_dabr are no longer used when CNFIG_PPC_ADV_DEBUG_REGS is =
set
> refactor code a bit such that we only build the dabr code for
> !CONFIG_PPC_ADV_DEBUG_REGS and removed some CONFIG_PPC_ADV_DEBUG_REGS
> code in set_dabr that would never get built.
>=20
> * Move do_send_trap into traps.c as its only used there
>=20
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>=20
> ---
> arch/powerpc/include/asm/system.h | 5 +--
> arch/powerpc/kernel/process.c | 97 =
+++++++++++++-----------------------
> arch/powerpc/kernel/traps.c | 17 +++++++
> 3 files changed, 53 insertions(+), 66 deletions(-)
>=20
> diff --git a/arch/powerpc/include/asm/system.h =
b/arch/powerpc/include/asm/system.h
> index e30a13d..1dc5d9c 100644
> --- a/arch/powerpc/include/asm/system.h
> +++ b/arch/powerpc/include/asm/system.h
> @@ -111,11 +111,8 @@ static inline int debugger_dabr_match(struct =
pt_regs *regs) { return 0; }
> static inline int debugger_fault_handler(struct pt_regs *regs) { =
return 0; }
> #endif
>=20
> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
> extern int set_dabr(unsigned long dabr);
> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
> -extern void do_send_trap(struct pt_regs *regs, unsigned long address,
> - unsigned long error_code, int signal_code, int =
brkpt);
> -#else
This part of the patch breaks xmon.c
Naively I simply wrapped the xmon call:
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index f08836a..b5911b2 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -738,8 +738,10 @@ static void insert_bpts(void)
=20
static void insert_cpu_bpts(void)
{
+#ifndef CONFIG_PPC_ADV_DEBUG_REGS
if (dabr.enabled)
set_dabr(dabr.address | (dabr.enabled & 7));
+#endif
if (iabr && cpu_has_feature(CPU_FTR_IABR))
mtspr(SPRN_IABR, iabr->address
| (iabr->enabled & (BP_IABR|BP_IABR_TE)));
@@ -767,7 +769,9 @@ static void remove_bpts(void)
=20
static void remove_cpu_bpts(void)
{
+#ifndef CONFIG_PPC_ADV_DEBUG_REGS
set_dabr(0);
+#endif
if (cpu_has_feature(CPU_FTR_IABR))
mtspr(SPRN_IABR, 0);
}
-JX
> extern void do_dabr(struct pt_regs *regs, unsigned long address,
> unsigned long error_code);
> #endif
> diff --git a/arch/powerpc/kernel/process.c =
b/arch/powerpc/kernel/process.c
> index 269a309..989e574 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -251,50 +251,6 @@ void discard_lazy_cpu_state(void)
> #endif /* CONFIG_SMP */
>=20
> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
> -void do_send_trap(struct pt_regs *regs, unsigned long address,
> - unsigned long error_code, int signal_code, int =
breakpt)
> -{
> - siginfo_t info;
> -
> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
> - return;
> -
> - /* Deliver the signal to userspace */
> - info.si_signo =3D SIGTRAP;
> - info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
> - info.si_code =3D signal_code;
> - info.si_addr =3D (void __user *)address;
> - force_sig_info(SIGTRAP, &info, current);
> -}
> -#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
> -void do_dabr(struct pt_regs *regs, unsigned long address,
> - unsigned long error_code)
> -{
> - siginfo_t info;
> -
> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
> - return;
> -
> - if (debugger_dabr_match(regs))
> - return;
> -
> - /* Clear the DABR */
> - set_dabr(0);
> -
> - /* Deliver the signal to userspace */
> - info.si_signo =3D SIGTRAP;
> - info.si_errno =3D 0;
> - info.si_code =3D TRAP_HWBKPT;
> - info.si_addr =3D (void __user *)address;
> - force_sig_info(SIGTRAP, &info, current);
> -}
> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
> -
> -static DEFINE_PER_CPU(unsigned long, current_dabr);
> -
> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
> /*
> * Set the debug registers back to their default "safe" values.
> */
> @@ -357,16 +313,7 @@ static void switch_booke_debug_regs(struct =
thread_struct *new_thread)
> prime_debug_regs(new_thread);
> }
> #else /* !CONFIG_PPC_ADV_DEBUG_REGS */
> -#ifndef CONFIG_HAVE_HW_BREAKPOINT
> -static void set_debug_reg_defaults(struct thread_struct *thread)
> -{
> - if (thread->dabr) {
> - thread->dabr =3D 0;
> - set_dabr(0);
> - }
> -}
> -#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
> +static DEFINE_PER_CPU(unsigned long, current_dabr);
>=20
> int set_dabr(unsigned long dabr)
> {
> @@ -376,19 +323,45 @@ int set_dabr(unsigned long dabr)
> return ppc_md.set_dabr(dabr);
>=20
> /* XXX should we have a CPU_FTR_HAS_DABR ? */
> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
> - mtspr(SPRN_DAC1, dabr);
> -#ifdef CONFIG_PPC_47x
> - isync();
> -#endif
> -#elif defined(CONFIG_PPC_BOOK3S)
> mtspr(SPRN_DABR, dabr);
> -#endif
> -
>=20
> return 0;
> }
>=20
> +void do_dabr(struct pt_regs *regs, unsigned long address,
> + unsigned long error_code)
> +{
> + siginfo_t info;
> +
> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
> + return;
> +
> + if (debugger_dabr_match(regs))
> + return;
> +
> + /* Clear the DABR */
> + set_dabr(0);
> +
> + /* Deliver the signal to userspace */
> + info.si_signo =3D SIGTRAP;
> + info.si_errno =3D 0;
> + info.si_code =3D TRAP_HWBKPT;
> + info.si_addr =3D (void __user *)address;
> + force_sig_info(SIGTRAP, &info, current);
> +}
> +
> +#ifndef CONFIG_HAVE_HW_BREAKPOINT
> +static void set_debug_reg_defaults(struct thread_struct *thread)
> +{
> + if (thread->dabr) {
> + thread->dabr =3D 0;
> + set_dabr(0);
> + }
> +}
> +#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
> +#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
> +
> #ifdef CONFIG_PPC64
> DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
> #endif
> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> index db733d3..edc1108 100644
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -1184,6 +1184,23 @@ void SoftwareEmulation(struct pt_regs *regs)
> #endif /* CONFIG_8xx */
>=20
> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
> +static void do_send_trap(struct pt_regs *regs, unsigned long address,
> + unsigned long error_code, int signal_code, int =
breakpt)
> +{
> + siginfo_t info;
> +
> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
> + return;
> +
> + /* Deliver the signal to userspace */
> + info.si_signo =3D SIGTRAP;
> + info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
> + info.si_code =3D signal_code;
> + info.si_addr =3D (void __user *)address;
> + force_sig_info(SIGTRAP, &info, current);
> +}
> +
> static void handle_debug(struct pt_regs *regs, unsigned long =
debug_status)
> {
> int changed =3D 0;
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [1/4] powerpc: Revert show_regs() define for readability
2011-10-06 12:53 [PATCH 1/4] powerpc: Revert show_regs() define for readability Kumar Gala
2011-10-06 12:53 ` [PATCH 2/4] powerpc: Remove extraneous CONFIG_PPC_ADV_DEBUG_REGS define Kumar Gala
@ 2011-10-28 19:40 ` Jimi Xenidis
2011-10-31 14:18 ` Kumar Gala
1 sibling, 1 reply; 11+ messages in thread
From: Jimi Xenidis @ 2011-10-28 19:40 UTC (permalink / raw)
To: Kumar Gala; +Cc: Linuxppc-dev list
On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
> We had an existing ifdef for 4xx & BOOKE processors that got changed to
> CONFIG_PPC_ADV_DEBUG_REGS. The define has nothing to do with
> CONFIG_PPC_ADV_DEBUG_REGS. The define really should be:
>
> #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
>
> and not
>
> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>
> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>
> ---
> arch/powerpc/kernel/process.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index 8f53954..a1b5981 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -657,7 +657,7 @@ void show_regs(struct pt_regs * regs)
> if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
> printk("CFAR: "REG"\n", regs->orig_gpr3);
> if (trap == 0x300 || trap == 0x600)
> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
> +#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
> printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
I'll be needing "|| defined(CONFIG_PPC_BOOK3E)" added to this please.
-jx
> #else
> printk("DAR: "REG", DSISR: %08lx\n", regs->dar, regs->dsisr);
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [1/4] powerpc: Revert show_regs() define for readability
2011-10-28 19:40 ` [1/4] powerpc: Revert show_regs() define for readability Jimi Xenidis
@ 2011-10-31 14:18 ` Kumar Gala
2011-10-31 18:35 ` Jimi Xenidis
0 siblings, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2011-10-31 14:18 UTC (permalink / raw)
To: Jimi Xenidis; +Cc: Linuxppc-dev list
On Oct 28, 2011, at 2:40 PM, Jimi Xenidis wrote:
>
> On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
>
>> We had an existing ifdef for 4xx & BOOKE processors that got changed to
>> CONFIG_PPC_ADV_DEBUG_REGS. The define has nothing to do with
>> CONFIG_PPC_ADV_DEBUG_REGS. The define really should be:
>>
>> #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
>>
>> and not
>>
>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>
>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>>
>> ---
>> arch/powerpc/kernel/process.c | 2 +-
>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
>> index 8f53954..a1b5981 100644
>> --- a/arch/powerpc/kernel/process.c
>> +++ b/arch/powerpc/kernel/process.c
>> @@ -657,7 +657,7 @@ void show_regs(struct pt_regs * regs)
>> if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
>> printk("CFAR: "REG"\n", regs->orig_gpr3);
>> if (trap == 0x300 || trap == 0x600)
>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> +#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
>> printk("DEAR: "REG", ESR: "REG"\n", regs->dar, regs->dsisr);
>
> I'll be needing "|| defined(CONFIG_PPC_BOOK3E)" added to this please.
> -jx
Under what platform is CONFIG_PPC_BOOK3E set and CONFIG_BOOKE is not?
- k
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [4/4] powerpc/booke: Re-organize debug code
2011-10-28 19:37 ` [4/4] " Jimi Xenidis
@ 2011-10-31 14:21 ` Kumar Gala
2011-10-31 18:37 ` Jimi Xenidis
0 siblings, 1 reply; 11+ messages in thread
From: Kumar Gala @ 2011-10-31 14:21 UTC (permalink / raw)
To: Jimi Xenidis; +Cc: linuxppc-dev
On Oct 28, 2011, at 2:37 PM, Jimi Xenidis wrote:
>=20
> On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
>=20
>> * set_dabr/do_dabr are no longer used when CNFIG_PPC_ADV_DEBUG_REGS =
is set
>> refactor code a bit such that we only build the dabr code for
>> !CONFIG_PPC_ADV_DEBUG_REGS and removed some CONFIG_PPC_ADV_DEBUG_REGS
>> code in set_dabr that would never get built.
>>=20
>> * Move do_send_trap into traps.c as its only used there
>>=20
>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>>=20
>> ---
>> arch/powerpc/include/asm/system.h | 5 +--
>> arch/powerpc/kernel/process.c | 97 =
+++++++++++++-----------------------
>> arch/powerpc/kernel/traps.c | 17 +++++++
>> 3 files changed, 53 insertions(+), 66 deletions(-)
>>=20
>> diff --git a/arch/powerpc/include/asm/system.h =
b/arch/powerpc/include/asm/system.h
>> index e30a13d..1dc5d9c 100644
>> --- a/arch/powerpc/include/asm/system.h
>> +++ b/arch/powerpc/include/asm/system.h
>> @@ -111,11 +111,8 @@ static inline int debugger_dabr_match(struct =
pt_regs *regs) { return 0; }
>> static inline int debugger_fault_handler(struct pt_regs *regs) { =
return 0; }
>> #endif
>>=20
>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>> extern int set_dabr(unsigned long dabr);
>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> -extern void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>> - unsigned long error_code, int signal_code, int =
brkpt);
>> -#else
>=20
>=20
> This part of the patch breaks xmon.c
> Naively I simply wrapped the xmon call:
>=20
> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
> index f08836a..b5911b2 100644
> --- a/arch/powerpc/xmon/xmon.c
> +++ b/arch/powerpc/xmon/xmon.c
> @@ -738,8 +738,10 @@ static void insert_bpts(void)
>=20
> static void insert_cpu_bpts(void)
> {
> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
> if (dabr.enabled)
> set_dabr(dabr.address | (dabr.enabled & 7));
> +#endif
> if (iabr && cpu_has_feature(CPU_FTR_IABR))
> mtspr(SPRN_IABR, iabr->address
> | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
> @@ -767,7 +769,9 @@ static void remove_bpts(void)
>=20
> static void remove_cpu_bpts(void)
> {
> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
> set_dabr(0);
> +#endif
> if (cpu_has_feature(CPU_FTR_IABR))
> mtspr(SPRN_IABR, 0);
> }
Shouldn't all of these functions be #ifndef'd out as we don't support =
cpu_bpts on book-e parts in xmon code today?
>=20
> -JX
>=20
>=20
>> extern void do_dabr(struct pt_regs *regs, unsigned long address,
>> unsigned long error_code);
>> #endif
>> diff --git a/arch/powerpc/kernel/process.c =
b/arch/powerpc/kernel/process.c
>> index 269a309..989e574 100644
>> --- a/arch/powerpc/kernel/process.c
>> +++ b/arch/powerpc/kernel/process.c
>> @@ -251,50 +251,6 @@ void discard_lazy_cpu_state(void)
>> #endif /* CONFIG_SMP */
>>=20
>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> -void do_send_trap(struct pt_regs *regs, unsigned long address,
>> - unsigned long error_code, int signal_code, int =
breakpt)
>> -{
>> - siginfo_t info;
>> -
>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>> - return;
>> -
>> - /* Deliver the signal to userspace */
>> - info.si_signo =3D SIGTRAP;
>> - info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>> - info.si_code =3D signal_code;
>> - info.si_addr =3D (void __user *)address;
>> - force_sig_info(SIGTRAP, &info, current);
>> -}
>> -#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>> -void do_dabr(struct pt_regs *regs, unsigned long address,
>> - unsigned long error_code)
>> -{
>> - siginfo_t info;
>> -
>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>> - return;
>> -
>> - if (debugger_dabr_match(regs))
>> - return;
>> -
>> - /* Clear the DABR */
>> - set_dabr(0);
>> -
>> - /* Deliver the signal to userspace */
>> - info.si_signo =3D SIGTRAP;
>> - info.si_errno =3D 0;
>> - info.si_code =3D TRAP_HWBKPT;
>> - info.si_addr =3D (void __user *)address;
>> - force_sig_info(SIGTRAP, &info, current);
>> -}
>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>> -
>> -static DEFINE_PER_CPU(unsigned long, current_dabr);
>> -
>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> /*
>> * Set the debug registers back to their default "safe" values.
>> */
>> @@ -357,16 +313,7 @@ static void switch_booke_debug_regs(struct =
thread_struct *new_thread)
>> prime_debug_regs(new_thread);
>> }
>> #else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>> -#ifndef CONFIG_HAVE_HW_BREAKPOINT
>> -static void set_debug_reg_defaults(struct thread_struct *thread)
>> -{
>> - if (thread->dabr) {
>> - thread->dabr =3D 0;
>> - set_dabr(0);
>> - }
>> -}
>> -#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>> +static DEFINE_PER_CPU(unsigned long, current_dabr);
>>=20
>> int set_dabr(unsigned long dabr)
>> {
>> @@ -376,19 +323,45 @@ int set_dabr(unsigned long dabr)
>> return ppc_md.set_dabr(dabr);
>>=20
>> /* XXX should we have a CPU_FTR_HAS_DABR ? */
>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> - mtspr(SPRN_DAC1, dabr);
>> -#ifdef CONFIG_PPC_47x
>> - isync();
>> -#endif
>> -#elif defined(CONFIG_PPC_BOOK3S)
>> mtspr(SPRN_DABR, dabr);
>> -#endif
>> -
>>=20
>> return 0;
>> }
>>=20
>> +void do_dabr(struct pt_regs *regs, unsigned long address,
>> + unsigned long error_code)
>> +{
>> + siginfo_t info;
>> +
>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>> + return;
>> +
>> + if (debugger_dabr_match(regs))
>> + return;
>> +
>> + /* Clear the DABR */
>> + set_dabr(0);
>> +
>> + /* Deliver the signal to userspace */
>> + info.si_signo =3D SIGTRAP;
>> + info.si_errno =3D 0;
>> + info.si_code =3D TRAP_HWBKPT;
>> + info.si_addr =3D (void __user *)address;
>> + force_sig_info(SIGTRAP, &info, current);
>> +}
>> +
>> +#ifndef CONFIG_HAVE_HW_BREAKPOINT
>> +static void set_debug_reg_defaults(struct thread_struct *thread)
>> +{
>> + if (thread->dabr) {
>> + thread->dabr =3D 0;
>> + set_dabr(0);
>> + }
>> +}
>> +#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>> +#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>> +
>> #ifdef CONFIG_PPC64
>> DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
>> #endif
>> diff --git a/arch/powerpc/kernel/traps.c =
b/arch/powerpc/kernel/traps.c
>> index db733d3..edc1108 100644
>> --- a/arch/powerpc/kernel/traps.c
>> +++ b/arch/powerpc/kernel/traps.c
>> @@ -1184,6 +1184,23 @@ void SoftwareEmulation(struct pt_regs *regs)
>> #endif /* CONFIG_8xx */
>>=20
>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> +static void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>> + unsigned long error_code, int signal_code, int =
breakpt)
>> +{
>> + siginfo_t info;
>> +
>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>> + return;
>> +
>> + /* Deliver the signal to userspace */
>> + info.si_signo =3D SIGTRAP;
>> + info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>> + info.si_code =3D signal_code;
>> + info.si_addr =3D (void __user *)address;
>> + force_sig_info(SIGTRAP, &info, current);
>> +}
>> +
>> static void handle_debug(struct pt_regs *regs, unsigned long =
debug_status)
>> {
>> int changed =3D 0;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [1/4] powerpc: Revert show_regs() define for readability
2011-10-31 14:18 ` Kumar Gala
@ 2011-10-31 18:35 ` Jimi Xenidis
0 siblings, 0 replies; 11+ messages in thread
From: Jimi Xenidis @ 2011-10-31 18:35 UTC (permalink / raw)
To: Kumar Gala; +Cc: Linuxppc-dev list
On Oct 31, 2011, at 9:18 AM, Kumar Gala wrote:
>=20
> On Oct 28, 2011, at 2:40 PM, Jimi Xenidis wrote:
>=20
>>=20
>> On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
>>=20
>>> We had an existing ifdef for 4xx & BOOKE processors that got changed =
to
>>> CONFIG_PPC_ADV_DEBUG_REGS. The define has nothing to do with
>>> CONFIG_PPC_ADV_DEBUG_REGS. The define really should be:
>>>=20
>>> #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
>>>=20
>>> and not
>>>=20
>>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>=20
>>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>>>=20
>>> ---
>>> arch/powerpc/kernel/process.c | 2 +-
>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>=20
>>> diff --git a/arch/powerpc/kernel/process.c =
b/arch/powerpc/kernel/process.c
>>> index 8f53954..a1b5981 100644
>>> --- a/arch/powerpc/kernel/process.c
>>> +++ b/arch/powerpc/kernel/process.c
>>> @@ -657,7 +657,7 @@ void show_regs(struct pt_regs * regs)
>>> if ((regs->trap !=3D 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
>>> printk("CFAR: "REG"\n", regs->orig_gpr3);
>>> if (trap =3D=3D 0x300 || trap =3D=3D 0x600)
>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> +#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
>>> printk("DEAR: "REG", ESR: "REG"\n", regs->dar, =
regs->dsisr);
>>=20
>> I'll be needing "|| defined(CONFIG_PPC_BOOK3E)" added to this please.
>> -jx
>=20
> Under what platform is CONFIG_PPC_BOOK3E set and CONFIG_BOOKE is not?
this was a grep typo on my part. sorry.
-jx
>=20
> - k
>=20
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [4/4] powerpc/booke: Re-organize debug code
2011-10-31 14:21 ` Kumar Gala
@ 2011-10-31 18:37 ` Jimi Xenidis
2011-11-24 4:54 ` Kumar Gala
0 siblings, 1 reply; 11+ messages in thread
From: Jimi Xenidis @ 2011-10-31 18:37 UTC (permalink / raw)
To: Kumar Gala; +Cc: linuxppc-dev
On Oct 31, 2011, at 9:21 AM, Kumar Gala wrote:
>=20
> On Oct 28, 2011, at 2:37 PM, Jimi Xenidis wrote:
>=20
>>=20
>> On Oct 5, 2011, at 9:53 PM, Kumar Gala wrote:
>>=20
>>> * set_dabr/do_dabr are no longer used when CNFIG_PPC_ADV_DEBUG_REGS =
is set
>>> refactor code a bit such that we only build the dabr code for
>>> !CONFIG_PPC_ADV_DEBUG_REGS and removed some =
CONFIG_PPC_ADV_DEBUG_REGS
>>> code in set_dabr that would never get built.
>>>=20
>>> * Move do_send_trap into traps.c as its only used there
>>>=20
>>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>>>=20
>>> ---
>>> arch/powerpc/include/asm/system.h | 5 +--
>>> arch/powerpc/kernel/process.c | 97 =
+++++++++++++-----------------------
>>> arch/powerpc/kernel/traps.c | 17 +++++++
>>> 3 files changed, 53 insertions(+), 66 deletions(-)
>>>=20
>>> diff --git a/arch/powerpc/include/asm/system.h =
b/arch/powerpc/include/asm/system.h
>>> index e30a13d..1dc5d9c 100644
>>> --- a/arch/powerpc/include/asm/system.h
>>> +++ b/arch/powerpc/include/asm/system.h
>>> @@ -111,11 +111,8 @@ static inline int debugger_dabr_match(struct =
pt_regs *regs) { return 0; }
>>> static inline int debugger_fault_handler(struct pt_regs *regs) { =
return 0; }
>>> #endif
>>>=20
>>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>>> extern int set_dabr(unsigned long dabr);
>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> -extern void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>>> - unsigned long error_code, int signal_code, int =
brkpt);
>>> -#else
>>=20
>>=20
>> This part of the patch breaks xmon.c
>> Naively I simply wrapped the xmon call:
>>=20
>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>> index f08836a..b5911b2 100644
>> --- a/arch/powerpc/xmon/xmon.c
>> +++ b/arch/powerpc/xmon/xmon.c
>> @@ -738,8 +738,10 @@ static void insert_bpts(void)
>>=20
>> static void insert_cpu_bpts(void)
>> {
>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>> if (dabr.enabled)
>> set_dabr(dabr.address | (dabr.enabled & 7));
>> +#endif
>> if (iabr && cpu_has_feature(CPU_FTR_IABR))
>> mtspr(SPRN_IABR, iabr->address
>> | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
>> @@ -767,7 +769,9 @@ static void remove_bpts(void)
>>=20
>> static void remove_cpu_bpts(void)
>> {
>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>> set_dabr(0);
>> +#endif
>> if (cpu_has_feature(CPU_FTR_IABR))
>> mtspr(SPRN_IABR, 0);
>> }
>=20
> Shouldn't all of these functions be #ifndef'd out as we don't support =
cpu_bpts on book-e parts in xmon code today?
Well I guess this is one for benh, because I would have expected xmon to =
test and call ppc_md.dabr.
Actually, should everyone be doing that?
-jx
>=20
>>=20
>> -JX
>>=20
>>=20
>>> extern void do_dabr(struct pt_regs *regs, unsigned long address,
>>> unsigned long error_code);
>>> #endif
>>> diff --git a/arch/powerpc/kernel/process.c =
b/arch/powerpc/kernel/process.c
>>> index 269a309..989e574 100644
>>> --- a/arch/powerpc/kernel/process.c
>>> +++ b/arch/powerpc/kernel/process.c
>>> @@ -251,50 +251,6 @@ void discard_lazy_cpu_state(void)
>>> #endif /* CONFIG_SMP */
>>>=20
>>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> -void do_send_trap(struct pt_regs *regs, unsigned long address,
>>> - unsigned long error_code, int signal_code, int =
breakpt)
>>> -{
>>> - siginfo_t info;
>>> -
>>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>> - return;
>>> -
>>> - /* Deliver the signal to userspace */
>>> - info.si_signo =3D SIGTRAP;
>>> - info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>>> - info.si_code =3D signal_code;
>>> - info.si_addr =3D (void __user *)address;
>>> - force_sig_info(SIGTRAP, &info, current);
>>> -}
>>> -#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>>> -void do_dabr(struct pt_regs *regs, unsigned long address,
>>> - unsigned long error_code)
>>> -{
>>> - siginfo_t info;
>>> -
>>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>> - return;
>>> -
>>> - if (debugger_dabr_match(regs))
>>> - return;
>>> -
>>> - /* Clear the DABR */
>>> - set_dabr(0);
>>> -
>>> - /* Deliver the signal to userspace */
>>> - info.si_signo =3D SIGTRAP;
>>> - info.si_errno =3D 0;
>>> - info.si_code =3D TRAP_HWBKPT;
>>> - info.si_addr =3D (void __user *)address;
>>> - force_sig_info(SIGTRAP, &info, current);
>>> -}
>>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>> -
>>> -static DEFINE_PER_CPU(unsigned long, current_dabr);
>>> -
>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> /*
>>> * Set the debug registers back to their default "safe" values.
>>> */
>>> @@ -357,16 +313,7 @@ static void switch_booke_debug_regs(struct =
thread_struct *new_thread)
>>> prime_debug_regs(new_thread);
>>> }
>>> #else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>>> -#ifndef CONFIG_HAVE_HW_BREAKPOINT
>>> -static void set_debug_reg_defaults(struct thread_struct *thread)
>>> -{
>>> - if (thread->dabr) {
>>> - thread->dabr =3D 0;
>>> - set_dabr(0);
>>> - }
>>> -}
>>> -#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>> +static DEFINE_PER_CPU(unsigned long, current_dabr);
>>>=20
>>> int set_dabr(unsigned long dabr)
>>> {
>>> @@ -376,19 +323,45 @@ int set_dabr(unsigned long dabr)
>>> return ppc_md.set_dabr(dabr);
>>>=20
>>> /* XXX should we have a CPU_FTR_HAS_DABR ? */
>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> - mtspr(SPRN_DAC1, dabr);
>>> -#ifdef CONFIG_PPC_47x
>>> - isync();
>>> -#endif
>>> -#elif defined(CONFIG_PPC_BOOK3S)
>>> mtspr(SPRN_DABR, dabr);
>>> -#endif
>>> -
>>>=20
>>> return 0;
>>> }
>>>=20
>>> +void do_dabr(struct pt_regs *regs, unsigned long address,
>>> + unsigned long error_code)
>>> +{
>>> + siginfo_t info;
>>> +
>>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>> + return;
>>> +
>>> + if (debugger_dabr_match(regs))
>>> + return;
>>> +
>>> + /* Clear the DABR */
>>> + set_dabr(0);
>>> +
>>> + /* Deliver the signal to userspace */
>>> + info.si_signo =3D SIGTRAP;
>>> + info.si_errno =3D 0;
>>> + info.si_code =3D TRAP_HWBKPT;
>>> + info.si_addr =3D (void __user *)address;
>>> + force_sig_info(SIGTRAP, &info, current);
>>> +}
>>> +
>>> +#ifndef CONFIG_HAVE_HW_BREAKPOINT
>>> +static void set_debug_reg_defaults(struct thread_struct *thread)
>>> +{
>>> + if (thread->dabr) {
>>> + thread->dabr =3D 0;
>>> + set_dabr(0);
>>> + }
>>> +}
>>> +#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>>> +#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>> +
>>> #ifdef CONFIG_PPC64
>>> DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
>>> #endif
>>> diff --git a/arch/powerpc/kernel/traps.c =
b/arch/powerpc/kernel/traps.c
>>> index db733d3..edc1108 100644
>>> --- a/arch/powerpc/kernel/traps.c
>>> +++ b/arch/powerpc/kernel/traps.c
>>> @@ -1184,6 +1184,23 @@ void SoftwareEmulation(struct pt_regs *regs)
>>> #endif /* CONFIG_8xx */
>>>=20
>>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>> +static void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>>> + unsigned long error_code, int signal_code, int =
breakpt)
>>> +{
>>> + siginfo_t info;
>>> +
>>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>> + return;
>>> +
>>> + /* Deliver the signal to userspace */
>>> + info.si_signo =3D SIGTRAP;
>>> + info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>>> + info.si_code =3D signal_code;
>>> + info.si_addr =3D (void __user *)address;
>>> + force_sig_info(SIGTRAP, &info, current);
>>> +}
>>> +
>>> static void handle_debug(struct pt_regs *regs, unsigned long =
debug_status)
>>> {
>>> int changed =3D 0;
>=20
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [4/4] powerpc/booke: Re-organize debug code
2011-10-31 18:37 ` Jimi Xenidis
@ 2011-11-24 4:54 ` Kumar Gala
0 siblings, 0 replies; 11+ messages in thread
From: Kumar Gala @ 2011-11-24 4:54 UTC (permalink / raw)
To: Ben Herrenschmidt; +Cc: linuxppc-dev@ozlabs.org list
>>>> * set_dabr/do_dabr are no longer used when CNFIG_PPC_ADV_DEBUG_REGS =
is set
>>>> refactor code a bit such that we only build the dabr code for
>>>> !CONFIG_PPC_ADV_DEBUG_REGS and removed some =
CONFIG_PPC_ADV_DEBUG_REGS
>>>> code in set_dabr that would never get built.
>>>>=20
>>>> * Move do_send_trap into traps.c as its only used there
>>>>=20
>>>> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
>>>>=20
>>>> ---
>>>> arch/powerpc/include/asm/system.h | 5 +--
>>>> arch/powerpc/kernel/process.c | 97 =
+++++++++++++-----------------------
>>>> arch/powerpc/kernel/traps.c | 17 +++++++
>>>> 3 files changed, 53 insertions(+), 66 deletions(-)
>>>>=20
>>>> diff --git a/arch/powerpc/include/asm/system.h =
b/arch/powerpc/include/asm/system.h
>>>> index e30a13d..1dc5d9c 100644
>>>> --- a/arch/powerpc/include/asm/system.h
>>>> +++ b/arch/powerpc/include/asm/system.h
>>>> @@ -111,11 +111,8 @@ static inline int debugger_dabr_match(struct =
pt_regs *regs) { return 0; }
>>>> static inline int debugger_fault_handler(struct pt_regs *regs) { =
return 0; }
>>>> #endif
>>>>=20
>>>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>>>> extern int set_dabr(unsigned long dabr);
>>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>> -extern void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>>>> - unsigned long error_code, int signal_code, int =
brkpt);
>>>> -#else
>>>=20
>>>=20
>>> This part of the patch breaks xmon.c
>>> Naively I simply wrapped the xmon call:
>>>=20
>>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>>> index f08836a..b5911b2 100644
>>> --- a/arch/powerpc/xmon/xmon.c
>>> +++ b/arch/powerpc/xmon/xmon.c
>>> @@ -738,8 +738,10 @@ static void insert_bpts(void)
>>>=20
>>> static void insert_cpu_bpts(void)
>>> {
>>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>>> if (dabr.enabled)
>>> set_dabr(dabr.address | (dabr.enabled & 7));
>>> +#endif
>>> if (iabr && cpu_has_feature(CPU_FTR_IABR))
>>> mtspr(SPRN_IABR, iabr->address
>>> | (iabr->enabled & (BP_IABR|BP_IABR_TE)));
>>> @@ -767,7 +769,9 @@ static void remove_bpts(void)
>>>=20
>>> static void remove_cpu_bpts(void)
>>> {
>>> +#ifndef CONFIG_PPC_ADV_DEBUG_REGS
>>> set_dabr(0);
>>> +#endif
>>> if (cpu_has_feature(CPU_FTR_IABR))
>>> mtspr(SPRN_IABR, 0);
>>> }
>>=20
>> Shouldn't all of these functions be #ifndef'd out as we don't support =
cpu_bpts on book-e parts in xmon code today?
>=20
> Well I guess this is one for benh, because I would have expected xmon =
to test and call ppc_md.dabr.
> Actually, should everyone be doing that?
> -jx
Ben,
Any comment on direction here ?
- k
>>>> extern void do_dabr(struct pt_regs *regs, unsigned long address,
>>>> unsigned long error_code);
>>>> #endif
>>>> diff --git a/arch/powerpc/kernel/process.c =
b/arch/powerpc/kernel/process.c
>>>> index 269a309..989e574 100644
>>>> --- a/arch/powerpc/kernel/process.c
>>>> +++ b/arch/powerpc/kernel/process.c
>>>> @@ -251,50 +251,6 @@ void discard_lazy_cpu_state(void)
>>>> #endif /* CONFIG_SMP */
>>>>=20
>>>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>> -void do_send_trap(struct pt_regs *regs, unsigned long address,
>>>> - unsigned long error_code, int signal_code, int =
breakpt)
>>>> -{
>>>> - siginfo_t info;
>>>> -
>>>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>>> - return;
>>>> -
>>>> - /* Deliver the signal to userspace */
>>>> - info.si_signo =3D SIGTRAP;
>>>> - info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>>>> - info.si_code =3D signal_code;
>>>> - info.si_addr =3D (void __user *)address;
>>>> - force_sig_info(SIGTRAP, &info, current);
>>>> -}
>>>> -#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>>>> -void do_dabr(struct pt_regs *regs, unsigned long address,
>>>> - unsigned long error_code)
>>>> -{
>>>> - siginfo_t info;
>>>> -
>>>> - if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>>> - 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>>> - return;
>>>> -
>>>> - if (debugger_dabr_match(regs))
>>>> - return;
>>>> -
>>>> - /* Clear the DABR */
>>>> - set_dabr(0);
>>>> -
>>>> - /* Deliver the signal to userspace */
>>>> - info.si_signo =3D SIGTRAP;
>>>> - info.si_errno =3D 0;
>>>> - info.si_code =3D TRAP_HWBKPT;
>>>> - info.si_addr =3D (void __user *)address;
>>>> - force_sig_info(SIGTRAP, &info, current);
>>>> -}
>>>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>>> -
>>>> -static DEFINE_PER_CPU(unsigned long, current_dabr);
>>>> -
>>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>> /*
>>>> * Set the debug registers back to their default "safe" values.
>>>> */
>>>> @@ -357,16 +313,7 @@ static void switch_booke_debug_regs(struct =
thread_struct *new_thread)
>>>> prime_debug_regs(new_thread);
>>>> }
>>>> #else /* !CONFIG_PPC_ADV_DEBUG_REGS */
>>>> -#ifndef CONFIG_HAVE_HW_BREAKPOINT
>>>> -static void set_debug_reg_defaults(struct thread_struct *thread)
>>>> -{
>>>> - if (thread->dabr) {
>>>> - thread->dabr =3D 0;
>>>> - set_dabr(0);
>>>> - }
>>>> -}
>>>> -#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>>>> -#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>>> +static DEFINE_PER_CPU(unsigned long, current_dabr);
>>>>=20
>>>> int set_dabr(unsigned long dabr)
>>>> {
>>>> @@ -376,19 +323,45 @@ int set_dabr(unsigned long dabr)
>>>> return ppc_md.set_dabr(dabr);
>>>>=20
>>>> /* XXX should we have a CPU_FTR_HAS_DABR ? */
>>>> -#ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>> - mtspr(SPRN_DAC1, dabr);
>>>> -#ifdef CONFIG_PPC_47x
>>>> - isync();
>>>> -#endif
>>>> -#elif defined(CONFIG_PPC_BOOK3S)
>>>> mtspr(SPRN_DABR, dabr);
>>>> -#endif
>>>> -
>>>>=20
>>>> return 0;
>>>> }
>>>>=20
>>>> +void do_dabr(struct pt_regs *regs, unsigned long address,
>>>> + unsigned long error_code)
>>>> +{
>>>> + siginfo_t info;
>>>> +
>>>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>>> + return;
>>>> +
>>>> + if (debugger_dabr_match(regs))
>>>> + return;
>>>> +
>>>> + /* Clear the DABR */
>>>> + set_dabr(0);
>>>> +
>>>> + /* Deliver the signal to userspace */
>>>> + info.si_signo =3D SIGTRAP;
>>>> + info.si_errno =3D 0;
>>>> + info.si_code =3D TRAP_HWBKPT;
>>>> + info.si_addr =3D (void __user *)address;
>>>> + force_sig_info(SIGTRAP, &info, current);
>>>> +}
>>>> +
>>>> +#ifndef CONFIG_HAVE_HW_BREAKPOINT
>>>> +static void set_debug_reg_defaults(struct thread_struct *thread)
>>>> +{
>>>> + if (thread->dabr) {
>>>> + thread->dabr =3D 0;
>>>> + set_dabr(0);
>>>> + }
>>>> +}
>>>> +#endif /* !CONFIG_HAVE_HW_BREAKPOINT */
>>>> +#endif /* CONFIG_PPC_ADV_DEBUG_REGS */
>>>> +
>>>> #ifdef CONFIG_PPC64
>>>> DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
>>>> #endif
>>>> diff --git a/arch/powerpc/kernel/traps.c =
b/arch/powerpc/kernel/traps.c
>>>> index db733d3..edc1108 100644
>>>> --- a/arch/powerpc/kernel/traps.c
>>>> +++ b/arch/powerpc/kernel/traps.c
>>>> @@ -1184,6 +1184,23 @@ void SoftwareEmulation(struct pt_regs *regs)
>>>> #endif /* CONFIG_8xx */
>>>>=20
>>>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>>>> +static void do_send_trap(struct pt_regs *regs, unsigned long =
address,
>>>> + unsigned long error_code, int signal_code, int =
breakpt)
>>>> +{
>>>> + siginfo_t info;
>>>> +
>>>> + if (notify_die(DIE_DABR_MATCH, "dabr_match", regs, error_code,
>>>> + 11, SIGSEGV) =3D=3D NOTIFY_STOP)
>>>> + return;
>>>> +
>>>> + /* Deliver the signal to userspace */
>>>> + info.si_signo =3D SIGTRAP;
>>>> + info.si_errno =3D breakpt; /* breakpoint or watchpoint id =
*/
>>>> + info.si_code =3D signal_code;
>>>> + info.si_addr =3D (void __user *)address;
>>>> + force_sig_info(SIGTRAP, &info, current);
>>>> +}
>>>> +
>>>> static void handle_debug(struct pt_regs *regs, unsigned long =
debug_status)
>>>> {
>>>> int changed =3D 0;
>>=20
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-11-24 4:55 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-10-06 12:53 [PATCH 1/4] powerpc: Revert show_regs() define for readability Kumar Gala
2011-10-06 12:53 ` [PATCH 2/4] powerpc: Remove extraneous CONFIG_PPC_ADV_DEBUG_REGS define Kumar Gala
2011-10-06 12:53 ` [PATCH 3/4] powerpc/book3e-64: Fix debug support for userspace Kumar Gala
2011-10-06 12:53 ` [PATCH 4/4] powerpc/booke: Re-organize debug code Kumar Gala
2011-10-28 19:37 ` [4/4] " Jimi Xenidis
2011-10-31 14:21 ` Kumar Gala
2011-10-31 18:37 ` Jimi Xenidis
2011-11-24 4:54 ` Kumar Gala
2011-10-28 19:40 ` [1/4] powerpc: Revert show_regs() define for readability Jimi Xenidis
2011-10-31 14:18 ` Kumar Gala
2011-10-31 18:35 ` Jimi Xenidis
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).