Messages in this thread Patch in this message | | | From | Mike Frysinger <> | Subject | [PATCH] kgdbts: unify/generalize gdb breakpoint adjustment | Date | Tue, 2 Jun 2009 03:17:30 -0400 |
| |
The Blackfin arch, like the x86 arch, needs to adjust the PC manually after a breakpoint is hit as normally this is handled by the remote gdb. However, rather than starting another arch ifdef mess, create a common GDB_ADJUSTS_BREAK_OFFSET define for any arch to opt-in via their kgdb.h.
Signed-off-by: Mike Frysinger <vapier@gentoo.org> --- arch/blackfin/include/asm/kgdb.h | 1 + arch/x86/include/asm/kgdb.h | 1 + drivers/misc/kgdbts.c | 14 ++++++-------- 3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/arch/blackfin/include/asm/kgdb.h b/arch/blackfin/include/asm/kgdb.h index c8b256d..8d5fe42 100644 --- a/arch/blackfin/include/asm/kgdb.h +++ b/arch/blackfin/include/asm/kgdb.h @@ -107,6 +107,7 @@ static inline void arch_kgdb_breakpoint(void) } #define BREAK_INSTR_SIZE 2 #define CACHE_FLUSH_IS_SAFE 1 +#define GDB_ADJUSTS_BREAK_OFFSET #define HW_INST_WATCHPOINT_NUM 6 #define HW_WATCHPOINT_NUM 8 #define TYPE_INST_WATCHPOINT 0 diff --git a/arch/x86/include/asm/kgdb.h b/arch/x86/include/asm/kgdb.h index e6c6c80..30671a8 100644 --- a/arch/x86/include/asm/kgdb.h +++ b/arch/x86/include/asm/kgdb.h @@ -75,5 +75,6 @@ static inline void arch_kgdb_breakpoint(void) } #define BREAK_INSTR_SIZE 1 #define CACHE_FLUSH_IS_SAFE 1 +#define GDB_ADJUSTS_BREAK_OFFSET #endif /* _ASM_X86_KGDB_H */ diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index e4ff50b..faff9cb 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c @@ -291,10 +291,10 @@ static int check_and_rewind_pc(char *put_str, char *arg) NUMREGBYTES); gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs); v2printk("Stopped at IP: %lx\n", instruction_pointer(&kgdbts_regs)); -#ifdef CONFIG_X86 - /* On x86 a breakpoint stop requires it to be decremented */ - if (addr + 1 == kgdbts_regs.ip) - offset = -1; +#ifdef GDB_ADJUSTS_BREAK_OFFSET + /* On some arches, a breakpoint stop requires it to be decremented */ + if (addr + BREAK_INSTR_SIZE == instruction_pointer(&kgdbts_regs)) + offset = -BREAK_INSTR_SIZE; #endif if (strcmp(arg, "silent") && instruction_pointer(&kgdbts_regs) + offset != addr) { @@ -302,10 +302,8 @@ static int check_and_rewind_pc(char *put_str, char *arg) instruction_pointer(&kgdbts_regs) + offset, addr); return 1; } -#ifdef CONFIG_X86 - /* On x86 adjust the instruction pointer if needed */ - kgdbts_regs.ip += offset; -#endif + /* Readjust the instruction pointer if needed */ + instruction_pointer(&kgdbts_regs) += offset; return 0; } -- 1.6.3.1
| |