summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2007-03-01 13:56:08 +0000
committerkib <kib@FreeBSD.org>2007-03-01 13:56:08 +0000
commit5b0899cab632e28032b4debca6bc651077e4f3eb (patch)
tree93914fc3958ef322578c6c49d65ebbfe85e90519 /gnu
parentf6803308596d957a85f3b8d756ceb04882dcee2d (diff)
downloadFreeBSD-src-5b0899cab632e28032b4debca6bc651077e4f3eb.zip
FreeBSD-src-5b0899cab632e28032b4debca6bc651077e4f3eb.tar.gz
Unbreak the kgdb stepping over the special frames on i386 after rev. 1.117 of
i386/i386/exception.s. No objections from: marcel
Diffstat (limited to 'gnu')
-rw-r--r--gnu/usr.bin/gdb/kgdb/trgt_i386.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/gnu/usr.bin/gdb/kgdb/trgt_i386.c b/gnu/usr.bin/gdb/kgdb/trgt_i386.c
index 73d02d4..0d40236 100644
--- a/gnu/usr.bin/gdb/kgdb/trgt_i386.c
+++ b/gnu/usr.bin/gdb/kgdb/trgt_i386.c
@@ -134,6 +134,8 @@ kgdb_trgt_trapframe_prev_register(struct frame_info *next_frame,
char dummy_valuep[MAX_REGISTER_SIZE];
struct kgdb_frame_cache *cache;
int ofs, regsz;
+ static int ofs_fix = 0;
+ static int ofs_fixed = 0;
regsz = register_size(current_gdbarch, regnum);
@@ -145,8 +147,27 @@ kgdb_trgt_trapframe_prev_register(struct frame_info *next_frame,
*lvalp = not_lval;
*realnump = -1;
+ if (!ofs_fixed) {
+ uintptr_t calltrap_addr;
+ char calltrap[1];
+
+ calltrap_addr = kgdb_lookup("calltrap");
+ if (calltrap_addr != 0) {
+ if (kvm_read(kvm, calltrap_addr, calltrap,
+ sizeof(calltrap)) != sizeof(calltrap)) {
+ warnx("kvm_read: %s", kvm_geterr(kvm));
+ } else if (calltrap[0] == 0x54) /* push %esp */ {
+ /*
+ * To accomodate for rev. 1.117 of
+ * i386/i386/exception.s
+ */
+ ofs_fix = 4;
+ }
+ }
+ ofs_fixed = 1;
+ }
ofs = (regnum >= I386_EAX_REGNUM && regnum <= I386_FS_REGNUM)
- ? kgdb_trgt_frame_offset[regnum] : -1;
+ ? kgdb_trgt_frame_offset[regnum] + ofs_fix : -1;
if (ofs == -1)
return;
OpenPOWER on IntegriCloud