[PATCH 1/3] kgdb,ppc: do not set kgdb_single_step on ppc

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

STALE5105d

5 messages, 2 authors, 2012-08-23 · open the first message on its own page

[PATCH 1/3] kgdb,ppc: do not set kgdb_single_step on ppc

From: Tiejun Chen <hidden>
Date: 2012-08-22 10:50:41

The kgdb_single_step flag has the possibility to indefinitely
hang the system on an SMP system.

The x86 arch have the same problem, and that problem was fixed by
commit 8097551d9ab9b9e3630(kgdb,x86: do not set kgdb_single_step
on x86). This patch does the same behaviors as x86's patch.

Signed-off-by: Dongdong Deng <redacted>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Tiejun Chen <redacted>
---
 arch/powerpc/kernel/kgdb.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index 782bd0a..bbabc5a 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -410,7 +410,6 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code,
 #else
 			linux_regs->msr |= MSR_SE;
 #endif
-			kgdb_single_step = 1;
 			atomic_set(&kgdb_cpu_doing_single_step,
 				   raw_smp_processor_id());
 		}
-- 
1.5.6

[PATCH 3/3] powerpc/kgdb: restore current_thread_info properly

From: Tiejun Chen <hidden>
Date: 2012-08-22 10:50:46

For powerpc BooKE and e200, singlestep is handled on the critical/dbg
exception stack. This causes current_thread_info() to fail for kgdb
internal, so previously We work around this issue by copying
the thread_info from the kernel stack before calling kgdb_handle_exception,
and copying it back afterwards.

But actually we don't do this previously. We should backp current_thread_info
then restore that when exit.

CC: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Tiejun Chen <redacted>
---
 arch/powerpc/kernel/kgdb.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index e84252b..7dcdbe7 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -25,6 +25,7 @@
 #include <asm/processor.h>
 #include <asm/machdep.h>
 #include <asm/debug.h>
+#include <linux/slab.h>
 
 /*
  * This table contains the mapping between PowerPC hardware trap types, and
@@ -156,6 +157,8 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)
 static int kgdb_singlestep(struct pt_regs *regs)
 {
 	struct thread_info *thread_info, *exception_thread_info;
+	struct thread_info *backup_current_thread_info = \
+		(struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);
 
 	if (user_mode(regs))
 		return 0;
@@ -173,13 +176,17 @@ static int kgdb_singlestep(struct pt_regs *regs)
 	thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1));
 	exception_thread_info = current_thread_info();
 
-	if (thread_info != exception_thread_info)
+	if (thread_info != exception_thread_info) {
+		/* Save the original current_thread_info. */
+		memcpy(backup_current_thread_info, exception_thread_info, sizeof *thread_info);
 		memcpy(exception_thread_info, thread_info, sizeof *thread_info);
+	}
 
 	kgdb_handle_exception(0, SIGTRAP, 0, regs);
 
 	if (thread_info != exception_thread_info)
-		memcpy(thread_info, exception_thread_info, sizeof *thread_info);
+		/* Restore current_thread_info lastly. */
+		memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
 
 	return 1;
 }
-- 
1.5.6

[PATCH 2/3] powerpc: Bail out of KGDB when we've been triggered

From: Tiejun Chen <hidden>
Date: 2012-08-22 10:50:51

We need to skip a breakpoint exception when it occurs after
a breakpoint has already been removed.

Signed-off-by: Tiejun Chen <redacted>
---
 arch/powerpc/kernel/kgdb.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c
index bbabc5a..e84252b 100644
--- a/arch/powerpc/kernel/kgdb.c
+++ b/arch/powerpc/kernel/kgdb.c
@@ -101,6 +101,24 @@ static int computeSignal(unsigned int tt)
 	return SIGHUP;		/* default for things we don't know about */
 }
 
+/**
+ *
+ *	kgdb_skipexception - Bail out of KGDB when we've been triggered.
+ *	@exception: Exception vector number
+ *	@regs: Current &struct pt_regs.
+ *
+ *	On some architectures we need to skip a breakpoint exception when
+ *	it occurs after a breakpoint has been removed.
+ *
+ */
+int kgdb_skipexception(int exception, struct pt_regs *regs)
+{
+	if (kgdb_isremovedbreak(regs->nip))
+		return 1;
+
+	return 0;
+}
+
 static int kgdb_call_nmi_hook(struct pt_regs *regs)
 {
 	kgdb_nmicallback(raw_smp_processor_id(), regs);
-- 
1.5.6

Re: [PATCH 2/3] powerpc: Bail out of KGDB when we've been triggered

From: Tabi Timur-B04825 <hidden>
Date: 2012-08-22 15:07:17

On Wed, Aug 22, 2012 at 5:43 AM, Tiejun Chen [off-list ref] wr=
ote:
+int kgdb_skipexception(int exception, struct pt_regs *regs)
+{
+       if (kgdb_isremovedbreak(regs->nip))
+               return 1;
+
+       return 0;
+}
int kgdb_skipexception(int exception, struct pt_regs *regs)
{
        return !!kgdb_isremovedbreak(regs->nip));
}

If the caller only cares about zero vs. non-zero, you can drop the !!.

--=20
Timur Tabi
Linux kernel developer at Freescale=

Re: [PATCH 2/3] powerpc: Bail out of KGDB when we've been triggered

From: tiejun.chen <hidden>
Date: 2012-08-23 02:02:10

On 08/22/2012 11:07 PM, Tabi Timur-B04825 wrote:
On Wed, Aug 22, 2012 at 5:43 AM, Tiejun Chen [off-list ref] wrote:
quoted
+int kgdb_skipexception(int exception, struct pt_regs *regs)
+{
+       if (kgdb_isremovedbreak(regs->nip))
+               return 1;
+
+       return 0;
+}
int kgdb_skipexception(int exception, struct pt_regs *regs)
{
        return !!kgdb_isremovedbreak(regs->nip));
}

If the caller only cares about zero vs. non-zero, you can drop the !!.
Yes, so 'return kgdb_isremovedbreak(regs->nip);' is already fine and simple.

I'll update this as v2 so thanks your comment.

Tiejun
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help