* amd64-tdep.c (amd64_sigtramp_frame_sniffer): Rewrite to use new
sigtramp_p member of `struct gdbarch_tdep'. Also check whether the program counter is in the range specified by `struct gdbarch_tdep'. * amd64-linux-tdep.c: Include "symtab.h". (amd64_linux_pc_in_sigtramp): Remove function. (amd64_linux_sigtramp_p): New function. (amd64_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * amd64nbsd-tdep.c: Include "symtab.h". (amd64nbsd_sigtramp_p): New function. (amd64nbsd_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * amd64obsd-tdep.c: Include "symtab.h" and "objfiles.h". Add a few comments. (amd64obsd_pc_in_sigtramp): Remove function. (amd64obsd_sigtramp_p): New function. (amd64obsd_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-tdep.h (struct gdbarch_tdep): Add sigtramp_p member. (i386bsd_pc_ins_sigtramp): Remove prototype. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove prototypes. * i386-tdep.c (i386_sigtramp_frame_sniffer): Rewrite to use new sigtramp_p member of `struct gdbarch_tdep'. Also check whether the program counter is in the range specified by `struct gdbarch_tdep'. (i386_pc_in_sigtramp, i386_svr4_pc_in_sigtramp): Remove functions. (i386_sigtramp_p, i386_svr4_sigtramp_p): New functions. (i386_go32_pc_in_sigtramp): Remove function. (i386_svr4_init_abi): Don't set deprecated_pc_in_sigtramp. Initialize TDEP->sigtramp_p. (i386_go32_init_abi): Initialize TDEP->sigtramp_p to NULL. (i386_gdbarch_init): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-linux-tdep.c: Adjust comments. (i386_linux_pc_in_sigtramp): Remove function. (i386_linux_sigtramp_p): New function. (i386_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-nto-tdep.c: Update copyright year. (i386nto_pc_in_sigtramp): Remove function. (i386nto_sigtramp_p): New function. (i386nto_sigcontext_addr): Use I386_ESP_REGNUM instead of SP_REGNUM. (i386nto_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386-sol2-tdep.c: Update copyright year. (i386_sol2_pc_in_sigtramp): Remove function. (i386_sol2_sigtramp_p): New function. (i386_sol2_init_abi): Initialize TDEP->sigtramp_p. Don't set deprecated_pc_in_sigtramp. * i386bsd-tdep.c (i386bsd_pc_in_sigtramp): Remove function. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove functions. (i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start and deprecated_sigtramp_end. * i386nbsd-tdep.c: Include "frame.h" and "symtab.h". (i386nbsd_pc_in_sigtramp): Remove function. (i386nbsd_sigtramp_p): New function. (i386nbsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize TDEP->sigtramp_start, TDEP->sigtramp_end and TDEP->sigtramp_p. * i386obsd-tdep.c: Include "frame.h", "symtab.h" and "objfiles.h". (i386obsd_pc_in_sigtramp): Remove function. (i386obsd_sigtramp_p): New function. (i386obsd_sigtramp_start, i386obsd_sigtramp_end): Remove functions. (i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp, deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize TDEP->sigtramp_p. * Makefile.in (amd64-linux-tdep.o, amd64nbsd-tdep.o, amd64obsd-tdep.o, i386nbsd-tdep.o, i386obsd-tdep.o): Update dependencies.
This commit is contained in:
parent
e083e6ec57
commit
911bc6ee3f
|
@ -1,5 +1,78 @@
|
|||
2004-04-09 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* amd64-tdep.c (amd64_sigtramp_frame_sniffer): Rewrite to use new
|
||||
sigtramp_p member of `struct gdbarch_tdep'. Also check whether
|
||||
the program counter is in the range specified by `struct
|
||||
gdbarch_tdep'.
|
||||
* amd64-linux-tdep.c: Include "symtab.h".
|
||||
(amd64_linux_pc_in_sigtramp): Remove function.
|
||||
(amd64_linux_sigtramp_p): New function.
|
||||
(amd64_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* amd64nbsd-tdep.c: Include "symtab.h".
|
||||
(amd64nbsd_sigtramp_p): New function.
|
||||
(amd64nbsd_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* amd64obsd-tdep.c: Include "symtab.h" and "objfiles.h". Add a
|
||||
few comments.
|
||||
(amd64obsd_pc_in_sigtramp): Remove function.
|
||||
(amd64obsd_sigtramp_p): New function.
|
||||
(amd64obsd_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* i386-tdep.h (struct gdbarch_tdep): Add sigtramp_p member.
|
||||
(i386bsd_pc_ins_sigtramp): Remove prototype.
|
||||
(i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove prototypes.
|
||||
* i386-tdep.c (i386_sigtramp_frame_sniffer): Rewrite to use new
|
||||
sigtramp_p member of `struct gdbarch_tdep'. Also check whether
|
||||
the program counter is in the range specified by `struct
|
||||
gdbarch_tdep'.
|
||||
(i386_pc_in_sigtramp, i386_svr4_pc_in_sigtramp): Remove functions.
|
||||
(i386_sigtramp_p, i386_svr4_sigtramp_p): New functions.
|
||||
(i386_go32_pc_in_sigtramp): Remove function.
|
||||
(i386_svr4_init_abi): Don't set deprecated_pc_in_sigtramp.
|
||||
Initialize TDEP->sigtramp_p.
|
||||
(i386_go32_init_abi): Initialize TDEP->sigtramp_p to NULL.
|
||||
(i386_gdbarch_init): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* i386-linux-tdep.c: Adjust comments.
|
||||
(i386_linux_pc_in_sigtramp): Remove function.
|
||||
(i386_linux_sigtramp_p): New function.
|
||||
(i386_linux_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* i386-nto-tdep.c: Update copyright year.
|
||||
(i386nto_pc_in_sigtramp): Remove function.
|
||||
(i386nto_sigtramp_p): New function.
|
||||
(i386nto_sigcontext_addr): Use I386_ESP_REGNUM instead of
|
||||
SP_REGNUM.
|
||||
(i386nto_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* i386-sol2-tdep.c: Update copyright year.
|
||||
(i386_sol2_pc_in_sigtramp): Remove function.
|
||||
(i386_sol2_sigtramp_p): New function.
|
||||
(i386_sol2_init_abi): Initialize TDEP->sigtramp_p. Don't set
|
||||
deprecated_pc_in_sigtramp.
|
||||
* i386bsd-tdep.c (i386bsd_pc_in_sigtramp): Remove function.
|
||||
(i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove functions.
|
||||
(i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||
deprecated_sigtramp_start and deprecated_sigtramp_end.
|
||||
* i386nbsd-tdep.c: Include "frame.h" and "symtab.h".
|
||||
(i386nbsd_pc_in_sigtramp): Remove function.
|
||||
(i386nbsd_sigtramp_p): New function.
|
||||
(i386nbsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||
deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize
|
||||
TDEP->sigtramp_start, TDEP->sigtramp_end and TDEP->sigtramp_p.
|
||||
* i386obsd-tdep.c: Include "frame.h", "symtab.h" and "objfiles.h".
|
||||
(i386obsd_pc_in_sigtramp): Remove function.
|
||||
(i386obsd_sigtramp_p): New function.
|
||||
(i386obsd_sigtramp_start, i386obsd_sigtramp_end): Remove
|
||||
functions.
|
||||
(i386bsd_init_abi): Don't set deprecated_pc_in_sigtramp,
|
||||
deprecated_sigtramp_start, deprecated_sigtramp_end. Initialize
|
||||
TDEP->sigtramp_p.
|
||||
* Makefile.in (amd64-linux-tdep.o, amd64nbsd-tdep.o,
|
||||
amd64obsd-tdep.o, i386nbsd-tdep.o, i386obsd-tdep.o): Update
|
||||
dependencies.
|
||||
|
||||
* config/i386/i386aout.mt: Remove file.
|
||||
|
||||
* configure.tgt: Remove i[34567]86-*-go32*,
|
||||
|
|
|
@ -1533,20 +1533,21 @@ amd64-linux-nat.o: amd64-linux-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
|||
$(gdb_proc_service_h) $(gregset_h) $(amd64_tdep_h) \
|
||||
$(i386_linux_tdep_h) $(amd64_nat_h)
|
||||
amd64-linux-tdep.o: amd64-linux-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(osabi_h) $(gdb_string_h) $(amd64_tdep_h) \
|
||||
$(solib_svr4_h)
|
||||
$(regcache_h) $(osabi_h) $(symtab_h) $(gdb_string_h) \
|
||||
$(amd64_tdep_h) $(solib_svr4_h)
|
||||
amd64-nat.o: amd64-nat.c $(defs_h) $(gdbarch_h) $(regcache_h) \
|
||||
$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(amd64_tdep_h)
|
||||
amd64nbsd-nat.o: amd64nbsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||
$(amd64_nat_h)
|
||||
amd64nbsd-tdep.o: amd64nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||
$(gdbcore_h) $(osabi_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||
$(gdbcore_h) $(osabi_h) $(symtab_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||
$(nbsd_tdep_h) $(solib_svr4_h)
|
||||
amd64obsd-nat.o: amd64obsd-nat.c $(defs_h) $(gdb_assert_h) $(amd64_tdep_h) \
|
||||
$(amd64_nat_h)
|
||||
amd64obsd-tdep.o: amd64obsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
|
||||
$(osabi_h) $(regset_h) $(target_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(amd64_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
||||
$(symtab_h) $(objfiles_h) $(osabi_h) $(regset_h) $(target_h) \
|
||||
$(gdb_assert_h) $(gdb_string_h) $(amd64_tdep_h) $(i387_tdep_h) \
|
||||
$(solib_svr4_h)
|
||||
amd64-tdep.o: amd64-tdep.c $(defs_h) $(arch_utils_h) $(block_h) \
|
||||
$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
|
||||
$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
|
||||
|
@ -1863,16 +1864,18 @@ i386-linux-tdep.o: i386-linux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
|||
i386ly-tdep.o: i386ly-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
|
||||
$(regcache_h) $(target_h) $(osabi_h) $(i386_tdep_h)
|
||||
i386-nat.o: i386-nat.c $(defs_h) $(breakpoint_h) $(command_h) $(gdbcmd_h)
|
||||
i386nbsd-tdep.o: i386nbsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(regset_h) $(osabi_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(i386_tdep_h) $(i387_tdep_h) $(nbsd_tdep_h) $(solib_svr4_h)
|
||||
i386nbsd-tdep.o: i386nbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||
$(gdbcore_h) $(regcache_h) $(regset_h) $(osabi_h) $(symtab_h) \
|
||||
$(gdb_assert_h) $(gdb_string_h) $(i386_tdep_h) $(i387_tdep_h) \
|
||||
$(nbsd_tdep_h) $(solib_svr4_h)
|
||||
i386-nto-tdep.o: i386-nto-tdep.c $(gdb_string_h) $(gdb_assert_h) $(defs_h) \
|
||||
$(frame_h) $(target_h) $(regcache_h) $(solib_svr4_h) $(i386_tdep_h) \
|
||||
$(nto_tdep_h) $(osabi_h) $(i387_tdep_h)
|
||||
i386obsd-nat.o: i386obsd-nat.c $(defs_h) $(i386_tdep_h)
|
||||
i386obsd-tdep.o: i386obsd-tdep.c $(defs_h) $(arch_utils_h) $(gdbcore_h) \
|
||||
$(regcache_h) $(regset_h) $(osabi_h) $(target_h) $(gdb_assert_h) \
|
||||
$(gdb_string_h) $(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
||||
i386obsd-tdep.o: i386obsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
|
||||
$(gdbcore_h) $(regcache_h) $(regset_h) $(symtab_h) $(objfiles_h) \
|
||||
$(osabi_h) $(target_h) $(gdb_assert_h) $(gdb_string_h) \
|
||||
$(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
|
||||
i386-sol2-tdep.o: i386-sol2-tdep.c $(defs_h) $(value_h) $(osabi_h) \
|
||||
$(i386_tdep_h)
|
||||
i386-stub.o: i386-stub.c
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "osabi.h"
|
||||
#include "symtab.h"
|
||||
|
||||
#include "gdb_string.h"
|
||||
|
||||
|
@ -116,11 +117,17 @@ amd64_linux_sigtramp_start (CORE_ADDR pc)
|
|||
return pc;
|
||||
}
|
||||
|
||||
/* Return whether PC is in a GNU/Linux sigtramp routine. */
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||
GNU/Linux sigtramp routine. */
|
||||
|
||||
static int
|
||||
amd64_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
amd64_linux_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
|
||||
/* If we have NAME, we can optimize the search. The trampoline is
|
||||
named __restore_rt. However, it isn't dynamically exported from
|
||||
the shared C library, so the trampoline may appear to be part of
|
||||
|
@ -203,7 +210,7 @@ amd64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
|
||||
amd64_init_abi (info, gdbarch);
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, amd64_linux_pc_in_sigtramp);
|
||||
tdep->sigtramp_p = amd64_linux_sigtramp_p;
|
||||
tdep->sigcontext_addr = amd64_linux_sigcontext_addr;
|
||||
tdep->sc_reg_offset = amd64_linux_sc_reg_offset;
|
||||
tdep->sc_num_regs = ARRAY_SIZE (amd64_linux_sc_reg_offset);
|
||||
|
|
|
@ -967,15 +967,26 @@ static const struct frame_unwind amd64_sigtramp_frame_unwind =
|
|||
static const struct frame_unwind *
|
||||
amd64_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (DEPRECATED_PC_IN_SIGTRAMP (pc, name))
|
||||
/* We shouldn't even bother if we don't have a sigcontext_addr
|
||||
handler. */
|
||||
if (tdep->sigcontext_addr == NULL)
|
||||
return NULL;
|
||||
|
||||
if (tdep->sigtramp_p != NULL)
|
||||
{
|
||||
gdb_assert (gdbarch_tdep (current_gdbarch)->sigcontext_addr);
|
||||
if (tdep->sigtramp_p (next_frame))
|
||||
return &amd64_sigtramp_frame_unwind;
|
||||
}
|
||||
|
||||
return &amd64_sigtramp_frame_unwind;
|
||||
if (tdep->sigtramp_start != 0)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
|
||||
gdb_assert (tdep->sigtramp_end != 0);
|
||||
if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
|
||||
return &amd64_sigtramp_frame_unwind;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "frame.h"
|
||||
#include "gdbcore.h"
|
||||
#include "osabi.h"
|
||||
#include "symtab.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
|
||||
|
@ -33,6 +34,19 @@
|
|||
|
||||
/* Support for signal handlers. */
|
||||
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||
NetBSD sigtramp routine. */
|
||||
|
||||
static int
|
||||
amd64nbsd_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
return nbsd_pc_in_sigtramp (pc, name);
|
||||
}
|
||||
|
||||
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
||||
routine, return the address of the associated sigcontext structure. */
|
||||
|
||||
|
@ -98,7 +112,7 @@ amd64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
tdep->jb_pc_offset = 7 * 8;
|
||||
|
||||
/* NetBSD has its own convention for signal trampolines. */
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, nbsd_pc_in_sigtramp);
|
||||
tdep->sigtramp_p = amd64nbsd_sigtramp_p;
|
||||
tdep->sigcontext_addr = amd64nbsd_sigcontext_addr;
|
||||
|
||||
/* Initialize the array with register offsets in `struct
|
||||
|
|
|
@ -22,6 +22,8 @@
|
|||
#include "defs.h"
|
||||
#include "frame.h"
|
||||
#include "gdbcore.h"
|
||||
#include "symtab.h"
|
||||
#include "objfiles.h"
|
||||
#include "osabi.h"
|
||||
#include "regset.h"
|
||||
#include "target.h"
|
||||
|
@ -75,11 +77,16 @@ amd64obsd_regset_from_core_section (struct gdbarch *gdbarch,
|
|||
|
||||
/* Support for signal handlers. */
|
||||
|
||||
/* Default page size. */
|
||||
static const int amd64obsd_page_size = 4096;
|
||||
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to an
|
||||
OpenBSD sigtramp routine. */
|
||||
|
||||
static int
|
||||
amd64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
amd64obsd_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1));
|
||||
const char sigreturn[] =
|
||||
{
|
||||
|
@ -87,9 +94,17 @@ amd64obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||
0x67, 0x00, 0x00, 0x00, /* movq $SYS_sigreturn, %rax */
|
||||
0xcd, 0x80 /* int $0x80 */
|
||||
};
|
||||
char *buf;
|
||||
char *name, *buf;
|
||||
|
||||
if (name)
|
||||
/* If the function has a valid symbol name, it isn't a
|
||||
trampoline. */
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (name != NULL)
|
||||
return 0;
|
||||
|
||||
/* If the function lives in a valid section (even without a starting
|
||||
point) it isn't a trampoline. */
|
||||
if (find_pc_section (pc) != NULL)
|
||||
return 0;
|
||||
|
||||
/* If we can't read the instructions at START_PC, return zero. */
|
||||
|
@ -195,7 +210,7 @@ amd64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
|
||||
tdep->jb_pc_offset = 7 * 8;
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, amd64obsd_pc_in_sigtramp);
|
||||
tdep->sigtramp_p = amd64obsd_sigtramp_p;
|
||||
tdep->sigcontext_addr = amd64obsd_sigcontext_addr;
|
||||
tdep->sc_reg_offset = amd64obsd_sc_reg_offset;
|
||||
tdep->sc_num_regs = ARRAY_SIZE (amd64obsd_sc_reg_offset);
|
||||
|
|
|
@ -83,13 +83,13 @@ i386_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
|
|||
|
||||
Checking for the code sequence should be somewhat reliable, because
|
||||
the effect is to call the system call sigreturn. This is unlikely
|
||||
to occur anywhere other than a signal trampoline.
|
||||
to occur anywhere other than in a signal trampoline.
|
||||
|
||||
It kind of sucks that we have to read memory from the process in
|
||||
order to identify a signal trampoline, but there doesn't seem to be
|
||||
any other way. The DEPRECATED_PC_IN_SIGTRAMP macro in tm-linux.h
|
||||
arranges to only call us if no function name could be identified,
|
||||
which should be the case since the code is on the stack.
|
||||
any other way. Therefore we only do the memory reads if no
|
||||
function name could be identified, which should be the case since
|
||||
the code is on the stack.
|
||||
|
||||
Detection of signal trampolines for handlers that set the
|
||||
SA_RESTORER flag is in general not possible. Unfortunately this is
|
||||
|
@ -217,11 +217,17 @@ i386_linux_rt_sigtramp_start (CORE_ADDR pc)
|
|||
return pc;
|
||||
}
|
||||
|
||||
/* Return whether PC is in a GNU/Linux sigtramp routine. */
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||
GNU/Linux sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386_linux_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
|
||||
/* If we have NAME, we can optimize the search. The trampolines are
|
||||
named __restore and __restore_rt. However, they aren't dynamically
|
||||
exported from the shared C library, so the trampoline may appear to
|
||||
|
@ -394,16 +400,11 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
|
||||
tdep->jb_pc_offset = 20; /* From <bits/setjmp.h>. */
|
||||
|
||||
tdep->sigtramp_p = i386_linux_sigtramp_p;
|
||||
tdep->sigcontext_addr = i386_linux_sigcontext_addr;
|
||||
tdep->sc_reg_offset = i386_linux_sc_reg_offset;
|
||||
tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
|
||||
|
||||
/* When the i386 Linux kernel calls a signal handler, the return
|
||||
address points to a bit of code on the stack. This function is
|
||||
used to identify this bit of code as a signal trampoline in order
|
||||
to support backtracing through calls to signal handlers. */
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_linux_pc_in_sigtramp);
|
||||
|
||||
/* GNU/Linux uses SVR4-style shared libraries. */
|
||||
set_solib_svr4_fetch_link_map_offsets
|
||||
(gdbarch, svr4_ilp32_fetch_link_map_offsets);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* i386-nto-tdep.c - i386 specific functionality for QNX Neutrino.
|
||||
/* Target-dependent code for QNX Neutrino x86.
|
||||
|
||||
Copyright 2003 Free Software Foundation, Inc.
|
||||
Copyright 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by QNX Software Systems Ltd.
|
||||
|
||||
|
@ -225,9 +225,16 @@ i386nto_svr4_fetch_link_map_offsets (void)
|
|||
return lmp;
|
||||
}
|
||||
|
||||
/* Return whether the frame preceding NEXT_FRAME corresponds to a QNX
|
||||
Neutrino sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386nto_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386nto_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
return name && strcmp ("__signalstub", name) == 0;
|
||||
}
|
||||
|
||||
|
@ -242,7 +249,7 @@ i386nto_sigcontext_addr (struct frame_info *next_frame)
|
|||
char buf[4];
|
||||
CORE_ADDR sp;
|
||||
|
||||
frame_unwind_register (next_frame, SP_REGNUM, buf);
|
||||
frame_unwind_register (next_frame, I386_ESP_REGNUM, buf);
|
||||
sp = extract_unsigned_integer (buf, 4);
|
||||
|
||||
return sp + I386_NTO_SIGCONTEXT_OFFSET;
|
||||
|
@ -278,7 +285,7 @@ i386nto_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386nto_pc_in_sigtramp);
|
||||
tdep->sigtramp_p = i386nto_sigtramp_p;
|
||||
tdep->sigcontext_addr = i386nto_sigcontext_addr;
|
||||
tdep->sc_pc_offset = 56;
|
||||
tdep->sc_sp_offset = 68;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
/* Target-dependent code for Solaris x86.
|
||||
Copyright 2002, 2003 Free Software Foundation, Inc.
|
||||
|
||||
Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -46,8 +47,10 @@ static int i386_sol2_gregset_reg_offset[] =
|
|||
};
|
||||
|
||||
static int
|
||||
i386_sol2_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386_sol2_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
|
||||
/* Signal handler frames under Solaris 2 are recognized by a return
|
||||
address of 0xffffffff. */
|
||||
return (pc == 0xffffffff);
|
||||
|
@ -85,12 +88,11 @@ i386_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
tdep->sizeof_gregset = 19 * 4;
|
||||
tdep->sizeof_fpregset = 380;
|
||||
|
||||
/* Signal trampolines are slightly different from SVR4. */
|
||||
tdep->sigtramp_p = i386_sol2_sigtramp_p;
|
||||
tdep->sigcontext_addr = i386_sol2_mcontext_addr;
|
||||
tdep->sc_reg_offset = tdep->gregset_reg_offset;
|
||||
tdep->sc_num_regs = tdep->gregset_num_regs;
|
||||
|
||||
/* Signal trampolines are slightly different from SVR4. */
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_sol2_pc_in_sigtramp);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1051,17 +1051,27 @@ static const struct frame_unwind i386_sigtramp_frame_unwind =
|
|||
static const struct frame_unwind *
|
||||
i386_sigtramp_frame_sniffer (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
|
||||
|
||||
/* We shouldn't even bother to try if the OSABI didn't register
|
||||
a sigcontext_addr handler. */
|
||||
if (!gdbarch_tdep (current_gdbarch)->sigcontext_addr)
|
||||
/* We shouldn't even bother if we don't have a sigcontext_addr
|
||||
handler. */
|
||||
if (tdep->sigcontext_addr == NULL)
|
||||
return NULL;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (DEPRECATED_PC_IN_SIGTRAMP (pc, name))
|
||||
return &i386_sigtramp_frame_unwind;
|
||||
if (tdep->sigtramp_p != NULL)
|
||||
{
|
||||
if (tdep->sigtramp_p (next_frame))
|
||||
return &i386_sigtramp_frame_unwind;
|
||||
}
|
||||
|
||||
if (tdep->sigtramp_start != 0)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
|
||||
gdb_assert (tdep->sigtramp_end != 0);
|
||||
if (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end)
|
||||
return &i386_sigtramp_frame_unwind;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -1731,12 +1741,16 @@ i386_pe_skip_trampoline_code (CORE_ADDR pc, char *name)
|
|||
}
|
||||
|
||||
|
||||
/* Return non-zero if PC and NAME show that we are in a signal
|
||||
trampoline. */
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||
sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
return (name && strcmp ("_sigtramp", name) == 0);
|
||||
}
|
||||
|
||||
|
@ -1766,11 +1780,18 @@ i386_print_insn (bfd_vma pc, struct disassemble_info *info)
|
|||
|
||||
/* System V Release 4 (SVR4). */
|
||||
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a SVR4
|
||||
sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386_svr4_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386_svr4_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
/* UnixWare uses _sigacthandler. The origin of the other symbols is
|
||||
currently unknown. */
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
return (name && (strcmp ("_sigreturn", name) == 0
|
||||
|| strcmp ("_sigacthandler", name) == 0
|
||||
|| strcmp ("sigvechandler", name) == 0));
|
||||
|
@ -1793,16 +1814,6 @@ i386_svr4_sigcontext_addr (struct frame_info *next_frame)
|
|||
}
|
||||
|
||||
|
||||
/* DJGPP. */
|
||||
|
||||
static int
|
||||
i386_go32_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
/* DJGPP doesn't have any special frames for signal handlers. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Generic ELF. */
|
||||
|
||||
void
|
||||
|
@ -1826,7 +1837,7 @@ i386_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_svr4_pc_in_sigtramp);
|
||||
tdep->sigtramp_p = i386_svr4_sigtramp_p;
|
||||
tdep->sigcontext_addr = i386_svr4_sigcontext_addr;
|
||||
tdep->sc_pc_offset = 36 + 14 * 4;
|
||||
tdep->sc_sp_offset = 36 + 17 * 4;
|
||||
|
@ -1841,7 +1852,8 @@ i386_go32_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_go32_pc_in_sigtramp);
|
||||
/* DJGPP doesn't have any special frames for signal handlers. */
|
||||
tdep->sigtramp_p = NULL;
|
||||
|
||||
tdep->jb_pc_offset = 36;
|
||||
}
|
||||
|
@ -1973,6 +1985,7 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
tdep->struct_return = pcc_struct_return;
|
||||
tdep->sigtramp_start = 0;
|
||||
tdep->sigtramp_end = 0;
|
||||
tdep->sigtramp_p = i386_sigtramp_p;
|
||||
tdep->sigcontext_addr = NULL;
|
||||
tdep->sc_reg_offset = NULL;
|
||||
tdep->sc_pc_offset = -1;
|
||||
|
@ -2034,7 +2047,6 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
set_gdbarch_decr_pc_after_break (gdbarch, 1);
|
||||
|
||||
set_gdbarch_frame_args_skip (gdbarch, 8);
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386_pc_in_sigtramp);
|
||||
|
||||
/* Wire in the MMX registers. */
|
||||
set_gdbarch_num_pseudo_regs (gdbarch, i386_num_mmx_regs);
|
||||
|
|
|
@ -89,6 +89,9 @@ struct gdbarch_tdep
|
|||
CORE_ADDR sigtramp_start;
|
||||
CORE_ADDR sigtramp_end;
|
||||
|
||||
/* Detect sigtramp. */
|
||||
int (*sigtramp_p) (struct frame_info *);
|
||||
|
||||
/* Get address of sigcontext for sigtramp. */
|
||||
CORE_ADDR (*sigcontext_addr) (struct frame_info *);
|
||||
|
||||
|
@ -217,9 +220,6 @@ extern void i386_svr4_init_abi (struct gdbarch_info, struct gdbarch *);
|
|||
/* Functions and variables exported from i386bsd-tdep.c. */
|
||||
|
||||
extern void i386bsd_init_abi (struct gdbarch_info, struct gdbarch *);
|
||||
extern int i386bsd_pc_in_sigtramp (CORE_ADDR pc, char *name);
|
||||
extern CORE_ADDR i386bsd_sigtramp_start (CORE_ADDR pc);
|
||||
extern CORE_ADDR i386bsd_sigtramp_end (CORE_ADDR pc);
|
||||
extern CORE_ADDR i386fbsd_sigtramp_start_addr;
|
||||
extern CORE_ADDR i386fbsd_sigtramp_end_addr;
|
||||
extern CORE_ADDR i386obsd_sigtramp_start_addr;
|
||||
|
|
|
@ -32,16 +32,6 @@
|
|||
|
||||
/* Support for signal handlers. */
|
||||
|
||||
/* Return whether PC is in a BSD sigtramp routine. */
|
||||
|
||||
int
|
||||
i386bsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
||||
|
||||
return (pc >= tdep->sigtramp_start && pc < tdep->sigtramp_end);
|
||||
}
|
||||
|
||||
/* Assuming NEXT_FRAME is for a frame following a BSD sigtramp
|
||||
routine, return the address of the associated sigcontext structure. */
|
||||
|
||||
|
@ -56,22 +46,6 @@ i386bsd_sigcontext_addr (struct frame_info *next_frame)
|
|||
|
||||
return read_memory_unsigned_integer (sp + 8, 4);
|
||||
}
|
||||
|
||||
/* Return the start address of the sigtramp routine. */
|
||||
|
||||
CORE_ADDR
|
||||
i386bsd_sigtramp_start (CORE_ADDR pc)
|
||||
{
|
||||
return gdbarch_tdep (current_gdbarch)->sigtramp_start;
|
||||
}
|
||||
|
||||
/* Return the end address of the sigtramp routine. */
|
||||
|
||||
CORE_ADDR
|
||||
i386bsd_sigtramp_end (CORE_ADDR pc)
|
||||
{
|
||||
return gdbarch_tdep (current_gdbarch)->sigtramp_end;
|
||||
}
|
||||
|
||||
|
||||
/* Support for shared libraries. */
|
||||
|
@ -112,12 +86,6 @@ i386bsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386bsd_pc_in_sigtramp);
|
||||
|
||||
/* Allow the recognition of sigtramps as a function named <sigtramp>. */
|
||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, i386bsd_sigtramp_start);
|
||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, i386bsd_sigtramp_end);
|
||||
|
||||
/* Assume SunOS-style shared libraries. */
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch,
|
||||
i386bsd_aout_in_solib_call_trampoline);
|
||||
|
|
|
@ -23,10 +23,12 @@
|
|||
|
||||
#include "defs.h"
|
||||
#include "arch-utils.h"
|
||||
#include "frame.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "regset.h"
|
||||
#include "osabi.h"
|
||||
#include "symtab.h"
|
||||
|
||||
#include "gdb_assert.h"
|
||||
#include "gdb_string.h"
|
||||
|
@ -183,9 +185,16 @@ i386nbsd_sigtramp_offset (CORE_ADDR pc)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to a
|
||||
NetBSD sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386nbsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386nbsd_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
char *name;
|
||||
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
return (nbsd_pc_in_sigtramp (pc, name)
|
||||
|| i386nbsd_sigtramp_offset (pc) >= 0);
|
||||
}
|
||||
|
@ -225,12 +234,9 @@ i386nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
tdep->sizeof_gregset = 16 * 4;
|
||||
|
||||
/* NetBSD has different signal trampoline conventions. */
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386nbsd_pc_in_sigtramp);
|
||||
/* FIXME: kettenis/20020906: We should probably provide
|
||||
NetBSD-specific versions of these functions if we want to
|
||||
recognize signal trampolines that live on the stack. */
|
||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, NULL);
|
||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, NULL);
|
||||
tdep->sigtramp_start = 0;
|
||||
tdep->sigtramp_end = 0;
|
||||
tdep->sigtramp_p = i386nbsd_sigtramp_p;
|
||||
|
||||
/* NetBSD uses -freg-struct-return by default. */
|
||||
tdep->struct_return = reg_struct_return;
|
||||
|
|
|
@ -23,9 +23,12 @@
|
|||
|
||||
#include "defs.h"
|
||||
#include "arch-utils.h"
|
||||
#include "frame.h"
|
||||
#include "gdbcore.h"
|
||||
#include "regcache.h"
|
||||
#include "regset.h"
|
||||
#include "symtab.h"
|
||||
#include "objfiles.h"
|
||||
#include "osabi.h"
|
||||
#include "target.h"
|
||||
|
||||
|
@ -48,11 +51,13 @@
|
|||
/* Default page size. */
|
||||
static const int i386obsd_page_size = 4096;
|
||||
|
||||
/* Return whether PC is in an OpenBSD sigtramp routine. */
|
||||
/* Return whether the frame preciding NEXT_FRAME corresponds to an
|
||||
OpenBSD sigtramp routine. */
|
||||
|
||||
static int
|
||||
i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
i386obsd_sigtramp_p (struct frame_info *next_frame)
|
||||
{
|
||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
||||
const char sigreturn[] =
|
||||
{
|
||||
|
@ -60,13 +65,17 @@ i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||
0x67, 0x00, 0x00, 0x00, /* movl $SYS_sigreturn, %eax */
|
||||
0xcd, 0x80 /* int $0x80 */
|
||||
};
|
||||
char *buf;
|
||||
char *name, *buf;
|
||||
|
||||
/* Avoid reading memory from the target if possible. If we're in a
|
||||
named function, we're certainly not in a sigtramp routine
|
||||
provided by the kernel. Take synthetic function names into
|
||||
account though. */
|
||||
if (name && name[0] != '<')
|
||||
/* If the function has a valid symbol name, it isn't a
|
||||
trampoline. */
|
||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
||||
if (name != NULL)
|
||||
return 0;
|
||||
|
||||
/* If the function lives in a valid section (even without a starting
|
||||
point) it isn't a trampoline. */
|
||||
if (find_pc_section (pc) != NULL)
|
||||
return 0;
|
||||
|
||||
/* If we can't read the instructions at START_PC, return zero. */
|
||||
|
@ -78,34 +87,7 @@ i386obsd_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
|||
if (memcmp (buf, sigreturn, sizeof sigreturn) == 0)
|
||||
return 1;
|
||||
|
||||
/* Check for a traditional BSD sigtramp routine. */
|
||||
return i386bsd_pc_in_sigtramp (pc, name);
|
||||
}
|
||||
|
||||
/* Return the start address of the sigtramp routine. */
|
||||
|
||||
static CORE_ADDR
|
||||
i386obsd_sigtramp_start (CORE_ADDR pc)
|
||||
{
|
||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
||||
|
||||
if (i386bsd_pc_in_sigtramp (pc, NULL))
|
||||
return i386bsd_sigtramp_start (pc);
|
||||
|
||||
return start_pc;
|
||||
}
|
||||
|
||||
/* Return the end address of the sigtramp routine. */
|
||||
|
||||
static CORE_ADDR
|
||||
i386obsd_sigtramp_end (CORE_ADDR pc)
|
||||
{
|
||||
CORE_ADDR start_pc = (pc & ~(i386obsd_page_size - 1));
|
||||
|
||||
if (i386bsd_pc_in_sigtramp (pc, NULL))
|
||||
return i386bsd_sigtramp_end (pc);
|
||||
|
||||
return start_pc + 0x22;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mapping between the general-purpose registers in `struct reg'
|
||||
|
@ -215,9 +197,7 @@ i386obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
/* OpenBSD uses a different memory layout. */
|
||||
tdep->sigtramp_start = i386obsd_sigtramp_start_addr;
|
||||
tdep->sigtramp_end = i386obsd_sigtramp_end_addr;
|
||||
set_gdbarch_deprecated_pc_in_sigtramp (gdbarch, i386obsd_pc_in_sigtramp);
|
||||
set_gdbarch_deprecated_sigtramp_start (gdbarch, i386obsd_sigtramp_start);
|
||||
set_gdbarch_deprecated_sigtramp_end (gdbarch, i386obsd_sigtramp_end);
|
||||
tdep->sigtramp_p = i386obsd_sigtramp_p;
|
||||
|
||||
/* OpenBSD has a `struct sigcontext' that's different from the
|
||||
original 4.3 BSD. */
|
||||
|
|
Loading…
Reference in New Issue