summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Fan <van.freenix@gmail.com>2014-09-01 21:48:07 +0800
committerTom Rini <trini@ti.com>2014-09-16 12:23:56 -0400
commitf9f040b21587ec884ff761cfa2f2fb66cc5157d1 (patch)
treed1ee243faebc72936b07e3227b27c034ad1db0cc
parentf6c8f38ec601d32d88ba279d53991e15015c9466 (diff)
downloadu-boot-imx-f9f040b21587ec884ff761cfa2f2fb66cc5157d1.zip
u-boot-imx-f9f040b21587ec884ff761cfa2f2fb66cc5157d1.tar.gz
u-boot-imx-f9f040b21587ec884ff761cfa2f2fb66cc5157d1.tar.bz2
kgdb: Remove first_entry for kgdb
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>
-rw-r--r--common/kgdb.c14
1 files changed, 2 insertions, 12 deletions
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 */