linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well
@ 2012-12-20  9:08 Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 1/6] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

v1:
* Copy thread info only when we are from !user mode since we'll get kernel stack
  coming from usr directly.
* remove save/restore EX_R14/EX_R15 since DBG_EXCEPTION_PROLOG already covered
  this.
* use CURRENT_THREAD_INFO() conveniently to get thread.
* fix some typos
* add a patch to make sure gdb can generate a single step properly to invoke a
  kgdb state.
* add a patch to if we need to replay an interrupt, we shouldn't restore that
  previous backup thread info to make sure we can replay an interrupt lately
  with a proper thread info.
* rebase latest powerpc git tree

v0:
This patchset is used to support kgdb for book3e.

Tiejun Chen (6):
      powerpc/book3e: load critical/machine/debug exception stack
      powerpc/book3e: store critical/machine/debug exception thread info
      book3e/kgdb: update thread's dbcr0
      book3e/kgdb: Fix a single stgep case of lazy IRQ
      powerpc/book3e: support kgdb for kernel space
      kgdb/kgdbts: support ppc64

 arch/powerpc/kernel/exceptions-64e.S |   60 +++++++++++++++++++++++++++++++---
 arch/powerpc/kernel/irq.c            |   10 ++++++
 arch/powerpc/kernel/kgdb.c           |   13 +++++++-
 drivers/misc/kgdbts.c                |    2 ++
 4 files changed, 80 insertions(+), 5 deletions(-)

Tiejun

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [v1][PATCH 1/6] powerpc/book3e: load critical/machine/debug exception stack
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 2/6] powerpc/book3e: store critical/machine/debug exception thread info Tiejun Chen
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

We always alloc critical/machine/debug check exceptions. This is
different from the normal exception. So we should load these exception
stack properly like we did for booke.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/exceptions-64e.S |   40 +++++++++++++++++++++++++++++++---
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 4684e33..376e3d1 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -36,6 +36,28 @@
  */
 #define	SPECIAL_EXC_FRAME_SIZE	INT_FRAME_SIZE
 
+/* only on book3e */
+#define DBG_STACK_BASE		dbgirq_ctx
+#define MC_STACK_BASE		mcheckirq_ctx
+#define CRIT_STACK_BASE		critirq_ctx
+
+#ifdef CONFIG_SMP
+#define BOOK3E_LOAD_EXC_LEVEL_STACK(level)		\
+	mfspr	r14,SPRN_PIR;				\
+	slwi	r14,r14,3;				\
+	LOAD_REG_ADDR(r10, level##_STACK_BASE);		\
+	add	r10,r10,r14;				\
+	ld	r10,0(r10);				\
+	addi	r10,r10,THREAD_SIZE;			\
+	std	r10,PACA_##level##_STACK(r13);
+#else
+#define BOOK3E_LOAD_EXC_LEVEL_STACK(level)		\
+	LOAD_REG_ADDR(r10, level##_STACK_BASE);		\
+	ld	r10,0(r10);				\
+	addi	r10,r10,THREAD_SIZE;			\
+	std	r10,PACA_##level##_STACK(r13);
+#endif
+
 /* Exception prolog code for all exceptions */
 #define EXCEPTION_PROLOG(n, intnum, type, addition)	    		    \
 	mtspr	SPRN_SPRG_##type##_SCRATCH,r13;	/* get spare registers */   \
@@ -68,20 +90,32 @@
 #define SPRN_GDBELL_SRR1	SPRN_GSRR1
 
 #define CRIT_SET_KSTACK						            \
+	andi.	r10,r11,MSR_PR;							\
+	bne	1f;								\
+	BOOK3E_LOAD_EXC_LEVEL_STACK(CRIT);					\
 	ld	r1,PACA_CRIT_STACK(r13);				    \
-	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
+	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+1:
 #define SPRN_CRIT_SRR0	SPRN_CSRR0
 #define SPRN_CRIT_SRR1	SPRN_CSRR1
 
 #define DBG_SET_KSTACK						            \
+	andi.	r10,r11,MSR_PR;							\
+	bne	1f;								\
+	BOOK3E_LOAD_EXC_LEVEL_STACK(DBG);					\
 	ld	r1,PACA_DBG_STACK(r13);					    \
-	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
+	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+1:
 #define SPRN_DBG_SRR0	SPRN_DSRR0
 #define SPRN_DBG_SRR1	SPRN_DSRR1
 
 #define MC_SET_KSTACK						            \
+	andi.	r10,r11,MSR_PR;							\
+	bne	1f;								\
+	BOOK3E_LOAD_EXC_LEVEL_STACK(MC);					\
 	ld	r1,PACA_MC_STACK(r13);					    \
-	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;
+	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+1:
 #define SPRN_MC_SRR0	SPRN_MCSRR0
 #define SPRN_MC_SRR1	SPRN_MCSRR1
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [v1][PATCH 2/6] powerpc/book3e: store critical/machine/debug exception thread info
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 1/6] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0 Tiejun Chen
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

We need to store thread info to these exception thread info like something
we already did for PPC32.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/exceptions-64e.S |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 376e3d1..9a99cba 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -58,6 +58,18 @@
 	std	r10,PACA_##level##_STACK(r13);
 #endif
 
+/* Store something to exception thread info */
+#define	BOOK3E_STORE_EXC_LEVEL_THEAD_INFO(type)					\
+	ld	r14,PACA_EX##type+EX_R1(r13);					\
+	CURRENT_THREAD_INFO(r14, r14);						\
+	CURRENT_THREAD_INFO(r15, r1);						\
+	ld	r10,TI_FLAGS(r14);		     				\
+	std	r10,TI_FLAGS(r15);			     			\
+	ld	r10,TI_PREEMPT(r14);		     				\
+	std	r10,TI_PREEMPT(r15);		     				\
+	ld	r10,TI_TASK(r14);			     			\
+	std	r10,TI_TASK(r15);
+
 /* Exception prolog code for all exceptions */
 #define EXCEPTION_PROLOG(n, intnum, type, addition)	    		    \
 	mtspr	SPRN_SPRG_##type##_SCRATCH,r13;	/* get spare registers */   \
@@ -95,6 +107,7 @@
 	BOOK3E_LOAD_EXC_LEVEL_STACK(CRIT);					\
 	ld	r1,PACA_CRIT_STACK(r13);				    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+	BOOK3E_STORE_EXC_LEVEL_THEAD_INFO(CRIT);				\
 1:
 #define SPRN_CRIT_SRR0	SPRN_CSRR0
 #define SPRN_CRIT_SRR1	SPRN_CSRR1
@@ -105,6 +118,7 @@
 	BOOK3E_LOAD_EXC_LEVEL_STACK(DBG);					\
 	ld	r1,PACA_DBG_STACK(r13);					    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+	BOOK3E_STORE_EXC_LEVEL_THEAD_INFO(DBG);					\
 1:
 #define SPRN_DBG_SRR0	SPRN_DSRR0
 #define SPRN_DBG_SRR1	SPRN_DSRR1
@@ -115,6 +129,7 @@
 	BOOK3E_LOAD_EXC_LEVEL_STACK(MC);					\
 	ld	r1,PACA_MC_STACK(r13);					    \
 	subi	r1,r1,SPECIAL_EXC_FRAME_SIZE;					\
+	BOOK3E_STORE_EXC_LEVEL_THEAD_INFO(MC);					\
 1:
 #define SPRN_MC_SRR0	SPRN_MCSRR0
 #define SPRN_MC_SRR1	SPRN_MCSRR1
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 1/6] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 2/6] powerpc/book3e: store critical/machine/debug exception thread info Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  2012-12-20 18:41   ` Kumar Gala
  2012-12-20  9:08 ` [v1][PATCH 4/6] book3e/kgdb: Fix a single stgep case of lazy IRQ Tiejun Chen
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

gdb always need to generate a single step properly to invoke
a kgdb state. But with lazy interrupt, book3e can't always
trigger a debug exception with a single step since the current
is blocked for handling those pending exception, then we miss
that expected dbcr configuration at last to generate a debug
exception.

So here we also update thread's dbcr0 to make sure the current
can go back with that missed dbcr0 configuration.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/kgdb.c |   10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index c470a40..516b44b 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -426,8 +426,18 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
 		/* set the trace bit if we're stepping */
 		if (remcom_in_buffer[0] == 's') {
 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
+#ifdef CONFIG_PPC_BOOK3E
+			/* With lazy interrut we have to update thread dbcr0 here
+			 * to make sure we can set debug properly at last to invoke
+			 * kgdb again to work well.
+			 */
+			current->thread.dbcr0 =
+				mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM;
+			mtspr(SPRN_DBCR0, current->thread.dbcr0);
+#else
 			mtspr(SPRN_DBCR0,
 			      mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
+#endif
 			linux_regs->msr |= MSR_DE;
 #else
 			linux_regs->msr |= MSR_SE;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [v1][PATCH 4/6] book3e/kgdb: Fix a single stgep case of lazy IRQ
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
                   ` (2 preceding siblings ...)
  2012-12-20  9:08 ` [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0 Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 5/6] powerpc/book3e: support kgdb for kernel space Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 6/6] kgdb/kgdbts: support ppc64 Tiejun Chen
  5 siblings, 0 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

When we're in kgdb_singlestep(), we have to work around to get
thread_info by copying from the kernel stack before calling
kgdb_handle_exception(), then copying it back afterwards.

But for PPC64, we have a lazy interrupt implementation. So after
copying thread info frome kernle stack, if we need to replay an
interrupt, we shouldn't restore that previous backup thread info
to make sure we can replay an interrupt lately with a proper
thread info.

This patch use __check_irq_replay() to guarantee this process.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/irq.c  |   10 ++++++++++
 arch/powerpc/kernel/kgdb.c |    3 ++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 71413f4..30a9cb0 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -332,7 +332,17 @@ bool prep_irq_for_idle(void)
 	return true;
 }
 
+notrace unsigned int check_irq_replay(void)
+{
+	return __check_irq_replay();
+}
+#else
+notrace unsigned int check_irq_replay(void)
+{
+	return 0;
+}
 #endif /* CONFIG_PPC64 */
+EXPORT_SYMBOL(check_irq_replay);
 
 int arch_show_interrupts(struct seq_file *p, int prec)
 {
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index 516b44b..6a48db9 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -151,6 +151,7 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)
 	return 1;
 }
 
+extern notrace unsigned int check_irq_replay(void);
 static int kgdb_singlestep(struct pt_regs *regs)
 {
 	struct thread_info *thread_info, *exception_thread_info;
@@ -181,7 +182,7 @@ static int kgdb_singlestep(struct pt_regs *regs)
 
 	kgdb_handle_exception(0, SIGTRAP, 0, regs);
 
-	if (thread_info != exception_thread_info)
+	if ((thread_info != exception_thread_info) && (!check_irq_replay()))
 		/* Restore current_thread_info lastly. */
 		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [v1][PATCH 5/6] powerpc/book3e: support kgdb for kernel space
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
                   ` (3 preceding siblings ...)
  2012-12-20  9:08 ` [v1][PATCH 4/6] book3e/kgdb: Fix a single stgep case of lazy IRQ Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  2012-12-20  9:08 ` [v1][PATCH 6/6] kgdb/kgdbts: support ppc64 Tiejun Chen
  5 siblings, 0 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

Currently we need to skip this for supporting KGDB.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 arch/powerpc/kernel/exceptions-64e.S |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 9a99cba..a24baef 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -588,11 +588,14 @@ kernel_dbg_exc:
 	rfdi
 
 	/* Normal debug exception */
+1:
+#ifndef CONFIG_KGDB
 	/* XXX We only handle coming from userspace for now since we can't
 	 *     quite save properly an interrupted kernel state yet
 	 */
-1:	andi.	r14,r11,MSR_PR;		/* check for userspace again */
+	andi.	r14,r11,MSR_PR;		/* check for userspace again */
 	beq	kernel_dbg_exc;		/* if from kernel mode */
+#endif
 
 	/* Now we mash up things to make it look like we are coming on a
 	 * normal exception
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [v1][PATCH 6/6] kgdb/kgdbts: support ppc64
  2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
                   ` (4 preceding siblings ...)
  2012-12-20  9:08 ` [v1][PATCH 5/6] powerpc/book3e: support kgdb for kernel space Tiejun Chen
@ 2012-12-20  9:08 ` Tiejun Chen
  5 siblings, 0 replies; 9+ messages in thread
From: Tiejun Chen @ 2012-12-20  9:08 UTC (permalink / raw)
  To: benh; +Cc: linuxppc-dev, linux-kernel, jason.wessel

We can't look up the address of the entry point of the function simply
via that function symbol for all architectures.

For PPC64 ABI, actually there is a function descriptors structure.

A function descriptor is a three doubleword data structure that contains
the following values:
	* The first doubleword contains the address of the entry point of
		the function.
	* The second doubleword contains the TOC base address for
		the function.
	* The third doubleword contains the environment pointer for
		languages such as Pascal and PL/1.

So we should call a wapperred dereference_function_descriptor() to get
the address of the entry point of the function.

Note this is also safe for other architecture after refer to
"include/asm-generic/sections.h" since:

dereference_function_descriptor(p) always is (p) if without arched definition.

Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
---
 drivers/misc/kgdbts.c |    2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
index 3aa9a96..4799e1f 100644
--- a/drivers/misc/kgdbts.c
+++ b/drivers/misc/kgdbts.c
@@ -103,6 +103,7 @@
 #include <linux/delay.h>
 #include <linux/kthread.h>
 #include <linux/module.h>
+#include <asm/sections.h>
 
 #define v1printk(a...) do { \
 	if (verbose) \
@@ -222,6 +223,7 @@ static unsigned long lookup_addr(char *arg)
 		addr = (unsigned long)do_fork;
 	else if (!strcmp(arg, "hw_break_val"))
 		addr = (unsigned long)&hw_break_val;
+	addr = (unsigned long )dereference_function_descriptor((void *)addr);
 	return addr;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0
  2012-12-20  9:08 ` [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0 Tiejun Chen
@ 2012-12-20 18:41   ` Kumar Gala
  2012-12-21  2:02     ` tiejun.chen
  0 siblings, 1 reply; 9+ messages in thread
From: Kumar Gala @ 2012-12-20 18:41 UTC (permalink / raw)
  To: Tiejun Chen; +Cc: linuxppc-dev, linux-kernel, jason.wessel


On Dec 20, 2012, at 3:08 AM, Tiejun Chen wrote:

> gdb always need to generate a single step properly to invoke
> a kgdb state. But with lazy interrupt, book3e can't always
> trigger a debug exception with a single step since the current
> is blocked for handling those pending exception, then we miss
> that expected dbcr configuration at last to generate a debug
> exception.
>=20
> So here we also update thread's dbcr0 to make sure the current
> can go back with that missed dbcr0 configuration.
>=20
> Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
> ---
> arch/powerpc/kernel/kgdb.c |   10 ++++++++++
> 1 file changed, 10 insertions(+)
>=20
> diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
> index c470a40..516b44b 100644
> --- a/arch/powerpc/kernel/kgdb.c
> +++ b/arch/powerpc/kernel/kgdb.c
> @@ -426,8 +426,18 @@ int kgdb_arch_handle_exception(int vector, int =
signo, int err_code,
> 		/* set the trace bit if we're stepping */
> 		if (remcom_in_buffer[0] =3D=3D 's') {
> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
> +#ifdef CONFIG_PPC_BOOK3E

Should this really be CONFIG_PPC64 or CONFIG_PPC_BOOK3E_64?

> +			/* With lazy interrut we have to update thread =
dbcr0 here
> +			 * to make sure we can set debug properly at =
last to invoke
> +			 * kgdb again to work well.
> +			 */
> +			current->thread.dbcr0 =3D
> +				mfspr(SPRN_DBCR0) | DBCR0_IC | =
DBCR0_IDM;
> +			mtspr(SPRN_DBCR0, current->thread.dbcr0);
> +#else
> 			mtspr(SPRN_DBCR0,
> 			      mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
> +#endif

Can we code this so we don't need the #else?

> 			linux_regs->msr |=3D MSR_DE;
> #else
> 			linux_regs->msr |=3D MSR_SE;
> --=20
> 1.7.9.5
>=20
> --
> To unsubscribe from this list: send the line "unsubscribe =
linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0
  2012-12-20 18:41   ` Kumar Gala
@ 2012-12-21  2:02     ` tiejun.chen
  0 siblings, 0 replies; 9+ messages in thread
From: tiejun.chen @ 2012-12-21  2:02 UTC (permalink / raw)
  To: Kumar Gala; +Cc: linuxppc-dev, linux-kernel, jason.wessel

On 12/21/2012 02:41 AM, Kumar Gala wrote:
>
> On Dec 20, 2012, at 3:08 AM, Tiejun Chen wrote:
>
>> gdb always need to generate a single step properly to invoke
>> a kgdb state. But with lazy interrupt, book3e can't always
>> trigger a debug exception with a single step since the current
>> is blocked for handling those pending exception, then we miss
>> that expected dbcr configuration at last to generate a debug
>> exception.
>>
>> So here we also update thread's dbcr0 to make sure the current
>> can go back with that missed dbcr0 configuration.
>>
>> Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com>
>> ---
>> arch/powerpc/kernel/kgdb.c |   10 ++++++++++
>> 1 file changed, 10 insertions(+)
>>
>> diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
>> index c470a40..516b44b 100644
>> --- a/arch/powerpc/kernel/kgdb.c
>> +++ b/arch/powerpc/kernel/kgdb.c
>> @@ -426,8 +426,18 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
>> 		/* set the trace bit if we're stepping */
>> 		if (remcom_in_buffer[0] == 's') {
>> #ifdef CONFIG_PPC_ADV_DEBUG_REGS
>> +#ifdef CONFIG_PPC_BOOK3E
>
> Should this really be CONFIG_PPC64 or CONFIG_PPC_BOOK3E_64?

Yes, I think CONFIG_PPC_BOOK3E_64 is better currently. Because I didn't validate 
this on power arch since I have no a real machine :)

>
>> +			/* With lazy interrut we have to update thread dbcr0 here
>> +			 * to make sure we can set debug properly at last to invoke
>> +			 * kgdb again to work well.
>> +			 */
>> +			current->thread.dbcr0 =
>> +				mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM;
>> +			mtspr(SPRN_DBCR0, current->thread.dbcr0);
>> +#else
>> 			mtspr(SPRN_DBCR0,
>> 			      mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
>> +#endif
>
> Can we code this so we don't need the #else?

I guess you're saying something like this:

---
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index c470a40..b2df42a 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -409,7 +409,7 @@ int kgdb_arch_handle_exception(int vector, int signo, int 
err_code,
  			       struct pt_regs *linux_regs)
  {
  	char *ptr = &remcom_in_buffer[1];
-	unsigned long addr;
+	unsigned long addr, dbcr0;

  	switch (remcom_in_buffer[0]) {
  		/*
@@ -426,8 +426,15 @@ int kgdb_arch_handle_exception(int vector, int signo, int 
err_code,
  		/* set the trace bit if we're stepping */
  		if (remcom_in_buffer[0] == 's') {
  #ifdef CONFIG_PPC_ADV_DEBUG_REGS
-			mtspr(SPRN_DBCR0,
-			      mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM);
+			dbcr0 = mfspr(SPRN_DBCR0) | DBCR0_IC | DBCR0_IDM;
+			mtspr(SPRN_DBCR0, dbcr0);
+#ifdef CONFIG_PPC_BOOK3E_64
+			/* With lazy interrut we have to update thread dbcr0 here
+			 * to make sure we can set debug properly at last to invoke
+			 * kgdb again to work well.
+			 */
+			current->thread.dbcr0 = dbcr0;
+#endif
  			linux_regs->msr |= MSR_DE;
  #else
  			linux_regs->msr |= MSR_SE;
-- 
1.7.9.5

Tiejun

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-12-21  2:02 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-20  9:08 [v1][PATCH 0/6] powerpc/book3e: make kgdb to work well Tiejun Chen
2012-12-20  9:08 ` [v1][PATCH 1/6] powerpc/book3e: load critical/machine/debug exception stack Tiejun Chen
2012-12-20  9:08 ` [v1][PATCH 2/6] powerpc/book3e: store critical/machine/debug exception thread info Tiejun Chen
2012-12-20  9:08 ` [v1][PATCH 3/6] book3e/kgdb: update thread's dbcr0 Tiejun Chen
2012-12-20 18:41   ` Kumar Gala
2012-12-21  2:02     ` tiejun.chen
2012-12-20  9:08 ` [v1][PATCH 4/6] book3e/kgdb: Fix a single stgep case of lazy IRQ Tiejun Chen
2012-12-20  9:08 ` [v1][PATCH 5/6] powerpc/book3e: support kgdb for kernel space Tiejun Chen
2012-12-20  9:08 ` [v1][PATCH 6/6] kgdb/kgdbts: support ppc64 Tiejun Chen

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).