From 34f36b232bdfb4398c7a0eb5af61b8d33bfbf5fa Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Mon, 28 Apr 2008 18:27:19 +0000 Subject: [PATCH] Use kgdb_parse() instead of libkvm(3) to read the first instruction from "calltrap" to see which method is used to pass trap frames. This seg faulted on remote gdb connections (where libkvm isn't used). MFC after: 3 days --- gnu/usr.bin/gdb/kgdb/trgt_i386.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/gnu/usr.bin/gdb/kgdb/trgt_i386.c b/gnu/usr.bin/gdb/kgdb/trgt_i386.c index de15a63cef96..995f1a63dbb3 100644 --- a/gnu/usr.bin/gdb/kgdb/trgt_i386.c +++ b/gnu/usr.bin/gdb/kgdb/trgt_i386.c @@ -299,22 +299,15 @@ kgdb_trgt_trapframe_prev_register(struct frame_info *next_frame, *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; - } - } + /* + * In revision 1.117 of i386/i386/exception.S trap handlers + * were changed to pass trapframes by reference rather than + * by value. Detect this by seeing if the first instruction + * at the 'calltrap' label is a "push %esp" which has the + * opcode 0x54. + */ + if (kgdb_parse("((char *)calltrap)[0]") == 0x54) + ofs_fix = 4; ofs_fixed = 1; } ofs = (regnum >= I386_EAX_REGNUM && regnum <= I386_FS_REGNUM)