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>
This commit is contained in:
@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user