diff options
author | Peng Fan <van.freenix@gmail.com> | 2014-09-01 21:48:07 +0800 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2014-09-16 12:23:56 -0400 |
commit | f9f040b21587ec884ff761cfa2f2fb66cc5157d1 (patch) | |
tree | d1ee243faebc72936b07e3227b27c034ad1db0cc /common/kgdb.c | |
parent | f6c8f38ec601d32d88ba279d53991e15015c9466 (diff) | |
download | u-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>
Diffstat (limited to 'common/kgdb.c')
-rw-r--r-- | common/kgdb.c | 14 |
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 */ |