Message ID | 1345687820-5248-3-git-send-email-tiejun.chen@windriver.com (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Benjamin Herrenschmidt |
Headers | show |
On Thu, 2012-08-23 at 10:10 +0800, Tiejun Chen wrote: > 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 properly. We should backup current_thread_info > then restore that when exit. > > Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com> > --- > v2: fix a typo in patch head description. > > 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 05adb69..c470a40 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 > @@ -153,6 +154,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); > Looks like a rouge '\' in the above assignment..
On 08/23/2012 11:14 AM, Nicholas A. Bellinger wrote: > On Thu, 2012-08-23 at 10:10 +0800, Tiejun Chen wrote: >> 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 properly. We should backup current_thread_info >> then restore that when exit. >> >> Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com> >> --- >> v2: fix a typo in patch head description. >> >> 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 05adb69..c470a40 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 >> @@ -153,6 +154,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); >> > > Looks like a rouge '\' in the above assignment.. Remove that :) Thanks Tiejun
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index 05adb69..c470a40 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 @@ -153,6 +154,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; @@ -170,13 +173,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; }
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 properly. We should backup current_thread_info then restore that when exit. Signed-off-by: Tiejun Chen <tiejun.chen@windriver.com> --- v2: fix a typo in patch head description. arch/powerpc/kernel/kgdb.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-)