summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2007-03-01 13:56:08 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2007-03-01 13:56:08 +0000
commit0a592d053589b0a5252910a13ddc338549e7ea8c (patch)
tree93914fc3958ef322578c6c49d65ebbfe85e90519 /gnu
parentd7eb5fb599369d82e91701c17a6beea236b06896 (diff)
Notes
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 73d02d4a3e28..0d40236dff0d 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;