diff mbox

[U-Boot] kgdb: Remove first_entry for kgdb

Message ID 1409579287-11575-1-git-send-email-van.freenix@gmail.com
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Peng Fan Sept. 1, 2014, 1:48 p.m. UTC
There are two ways to run into handle_exception, run command 'kgdb' and
encounter a breakpoint which triggers exception handling.

The origin source code only saves regs when first run command 'kgdb'.
Take the following for example, When run 'kgdb', regs is saved to entry_regs.
When run 'bootz', regs is not saved. However, if we set a breakpoint, then
continue. When breakpoint is reached, run `quit`, and Now return to the
instruction which follows kgdb, but not bootz.This may cause errors. So,
save regs for each handle_exception call to return to the correct place.
Example:
Target      |    Host
=>kgdb      |    (gdb)b bootz
            |    (gdb)c
=>bootz     |
            |    (gdb)Here stop because of breakpoint
            |    (gdb)q

Signed-off-by: Peng Fan <van.freenix@gmail.com>
---
 common/kgdb.c | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

Comments

Tom Rini Sept. 17, 2014, 12:44 a.m. UTC | #1
On Mon, Sep 01, 2014 at 09:48:07PM +0800, Peng Fan wrote:

> There are two ways to run into handle_exception, run command 'kgdb' and
> encounter a breakpoint which triggers exception handling.
> 
> The origin source code only saves regs when first run command 'kgdb'.
> Take the following for example, When run 'kgdb', regs is saved to entry_regs.
> When run 'bootz', regs is not saved. However, if we set a breakpoint, then
> continue. When breakpoint is reached, run `quit`, and Now return to the
> instruction which follows kgdb, but not bootz.This may cause errors. So,
> save regs for each handle_exception call to return to the correct place.
> Example:
> Target      |    Host
> =>kgdb      |    (gdb)b bootz
>             |    (gdb)c
> =>bootz     |
>             |    (gdb)Here stop because of breakpoint
>             |    (gdb)q
> 
> Signed-off-by: Peng Fan <van.freenix@gmail.com>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff --git a/common/kgdb.c b/common/kgdb.c
index 8a621ad..d357463 100644
--- a/common/kgdb.c
+++ b/common/kgdb.c
@@ -103,7 +103,7 @@  static char remcomOutBuffer[BUFMAX];
 static char remcomRegBuffer[BUFMAX];
 
 static int initialized = 0;
-static int kgdb_active = 0, first_entry = 1;
+static int kgdb_active;
 static struct pt_regs entry_regs;
 static long error_jmp_buf[BUFMAX/2];
 static int longjmp_on_fault = 0;
@@ -348,16 +348,7 @@  handle_exception (struct pt_regs *regs)
 
 	kgdb_enter(regs, &kd);
 
-	if (first_entry) {
-		/*
-		 * the first time we enter kgdb, we save the processor
-		 * state so that we can return to the monitor if the
-		 * remote end quits gdb (or at least, tells us to quit
-		 * with the 'k' packet)
-		 */
-		entry_regs = *regs;
-		first_entry = 0;
-	}
+	entry_regs = *regs;
 
 	ptr = remcomOutBuffer;
 
@@ -459,7 +450,6 @@  handle_exception (struct pt_regs *regs)
 		case 'k':    /* kill the program, actually return to monitor */
 			kd.extype = KGDBEXIT_KILL;
 			*regs = entry_regs;
-			first_entry = 1;
 			goto doexit;
 
 		case 'C':    /* CSS  continue with signal SS */