summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2011-05-31 10:42:40 +1000
committerStephen Rothwell <sfr@canb.auug.org.au>2011-05-31 10:42:40 +1000
commit3f921c60f1fc57daaed13b078a1d003573ef7776 (patch)
tree60ce800ce8fbc9b99e5a94b6ba98f49e3d3e81ef
parent4bed7fed862c31ed0459c485d45370c92e50232d (diff)
Revert "kgdbts: unify/generalize gdb breakpoint adjustment"
This reverts commit 63ab25ebbc50f74550bd8d164a34724b498f6fb9.
-rw-r--r--arch/blackfin/include/asm/kgdb.h1
-rw-r--r--arch/sh/include/asm/kgdb.h1
-rw-r--r--arch/x86/include/asm/kgdb.h1
-rw-r--r--drivers/misc/kgdbts.c29
4 files changed, 18 insertions, 14 deletions
diff --git a/arch/blackfin/include/asm/kgdb.h b/arch/blackfin/include/asm/kgdb.h
index aaf884591b07..3ac0c72e9fee 100644
--- a/arch/blackfin/include/asm/kgdb.h
+++ b/arch/blackfin/include/asm/kgdb.h
@@ -108,7 +108,6 @@ static inline void arch_kgdb_breakpoint(void)
#else
# define CACHE_FLUSH_IS_SAFE 1
#endif
-#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/sh/include/asm/kgdb.h b/arch/sh/include/asm/kgdb.h
index f3613952d1ae..4235e228d921 100644
--- a/arch/sh/include/asm/kgdb.h
+++ b/arch/sh/include/asm/kgdb.h
@@ -34,6 +34,5 @@ static inline void arch_kgdb_breakpoint(void)
#define CACHE_FLUSH_IS_SAFE 1
#define BREAK_INSTR_SIZE 2
-#define GDB_ADJUSTS_BREAK_OFFSET
#endif /* __ASM_SH_KGDB_H */
diff --git a/arch/x86/include/asm/kgdb.h b/arch/x86/include/asm/kgdb.h
index 77e95f54570a..396f5b5fc4d7 100644
--- a/arch/x86/include/asm/kgdb.h
+++ b/arch/x86/include/asm/kgdb.h
@@ -77,7 +77,6 @@ static inline void arch_kgdb_breakpoint(void)
}
#define BREAK_INSTR_SIZE 1
#define CACHE_FLUSH_IS_SAFE 1
-#define GDB_ADJUSTS_BREAK_OFFSET
extern int kgdb_ll_trap(int cmd, const char *str,
struct pt_regs *regs, long err, int trap, int sig);
diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c
index b0c56313dbbb..74f16f167b8e 100644
--- a/drivers/misc/kgdbts.c
+++ b/drivers/misc/kgdbts.c
@@ -285,26 +285,33 @@ static void hw_break_val_write(void)
static int check_and_rewind_pc(char *put_str, char *arg)
{
unsigned long addr = lookup_addr(arg);
- unsigned long ip;
int offset = 0;
kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs,
NUMREGBYTES);
gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
- ip = instruction_pointer(&kgdbts_regs);
- v2printk("Stopped at IP: %lx\n", ip);
-#ifdef GDB_ADJUSTS_BREAK_OFFSET
- /* On some arches, a breakpoint stop requires it to be decremented */
- if (addr + BREAK_INSTR_SIZE == ip)
- offset = -BREAK_INSTR_SIZE;
+ 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;
+#elif defined(CONFIG_SUPERH)
+ /* On SUPERH a breakpoint stop requires it to be decremented */
+ if (addr + 2 == kgdbts_regs.pc)
+ offset = -2;
#endif
- if (strcmp(arg, "silent") && ip + offset != addr) {
+ if (strcmp(arg, "silent") &&
+ instruction_pointer(&kgdbts_regs) + offset != addr) {
eprintk("kgdbts: BP mismatch %lx expected %lx\n",
- ip + offset, addr);
+ instruction_pointer(&kgdbts_regs) + offset, addr);
return 1;
}
- /* Readjust the instruction pointer if needed */
- instruction_pointer_set(&kgdbts_regs, ip + offset);
+#ifdef CONFIG_X86
+ /* On x86 adjust the instruction pointer if needed */
+ kgdbts_regs.ip += offset;
+#elif defined(CONFIG_SUPERH)
+ kgdbts_regs.pc += offset;
+#endif
return 0;
}