* m68k-tdep.c (m68k_register_raw_size): Remove cast.
(m68k_register_virtual_size): Likewise. (altos_skip_prologue): Remove obsolete function. (isi_frame_num_args): Likewise. (news_frame_num_args): Likewise. (m68k_fix_call_dummy): Make static. (m68k_push_dummy_frame): Likewise. (m68k_pop_frame): Likewise. (m68k_skip_prologue): Likewise. (m68k_frame_init_saved_regs): Likewise. (m68k_saved_pc_after_call): Likewise. (m68k_get_longjmp_target): Make multi-arch. (m68k_gdbarch_init): Allocate and initialize gdbarch_tdep structure. Register m68k_get_longjmp_target if enabled. * m68k-tdep.h (struct gdbarch_tdep): Define. * config/m68k/tm-m68k.h: Don't include "regcache.h". * Makefile.in (config.status): Also depend on configure.tgt and configure.host. (m68klinux-tdep.o): Update dependencies. * configure.tgt (m68*-*-linux*): Set gdb_multi_arch to 1. * m68klinux-tdep.c (M68K_LINUX_JB_ELEMENT_SIZE): Define. (M68K_LINUX_JB_PC): Define. (m68k_linux_pc_in_sigtramp): Renamed from m68k_linux_in_sigtramp and take additional parameter. (m68k_linux_sigtramp_saved_pc): Update. (m68k_linux_init_abi): Set jb_pc and jb_elt_size. Register m68k_linux_pc_in_sigtramp, in_plt_section, find_solib_trampoline_target. * config/m68k/tm-linux.h: Don't include any tm headers. (START_INFERIOR_TRAPS_EXPECTED): Remove definition. (JB_ELEMENT_SIZE): Likewise. (JB_PC): Likewise. (GET_LONGJMP_TARGET): Likewise. (IN_SIGTRAMP): Likewise. (SVR4_SHARED_LIBS): Define this and include "solib.h".
This commit is contained in:
parent
eb2c22dc71
commit
eb2e12d711
|
@ -1,3 +1,42 @@
|
|||
2003-05-25 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
* m68k-tdep.c (m68k_register_raw_size): Remove cast.
|
||||
(m68k_register_virtual_size): Likewise.
|
||||
(altos_skip_prologue): Remove obsolete function.
|
||||
(isi_frame_num_args): Likewise.
|
||||
(news_frame_num_args): Likewise.
|
||||
(m68k_fix_call_dummy): Make static.
|
||||
(m68k_push_dummy_frame): Likewise.
|
||||
(m68k_pop_frame): Likewise.
|
||||
(m68k_skip_prologue): Likewise.
|
||||
(m68k_frame_init_saved_regs): Likewise.
|
||||
(m68k_saved_pc_after_call): Likewise.
|
||||
(m68k_get_longjmp_target): Make multi-arch.
|
||||
(m68k_gdbarch_init): Allocate and initialize gdbarch_tdep
|
||||
structure. Register m68k_get_longjmp_target if enabled.
|
||||
* m68k-tdep.h (struct gdbarch_tdep): Define.
|
||||
* config/m68k/tm-m68k.h: Don't include "regcache.h".
|
||||
|
||||
* Makefile.in (config.status): Also depend on configure.tgt
|
||||
and configure.host.
|
||||
(m68klinux-tdep.o): Update dependencies.
|
||||
* configure.tgt (m68*-*-linux*): Set gdb_multi_arch to 1.
|
||||
* m68klinux-tdep.c (M68K_LINUX_JB_ELEMENT_SIZE): Define.
|
||||
(M68K_LINUX_JB_PC): Define.
|
||||
(m68k_linux_pc_in_sigtramp): Renamed from m68k_linux_in_sigtramp
|
||||
and take additional parameter.
|
||||
(m68k_linux_sigtramp_saved_pc): Update.
|
||||
(m68k_linux_init_abi): Set jb_pc and jb_elt_size. Register
|
||||
m68k_linux_pc_in_sigtramp, in_plt_section,
|
||||
find_solib_trampoline_target.
|
||||
* config/m68k/tm-linux.h: Don't include any tm headers.
|
||||
(START_INFERIOR_TRAPS_EXPECTED): Remove definition.
|
||||
(JB_ELEMENT_SIZE): Likewise.
|
||||
(JB_PC): Likewise.
|
||||
(GET_LONGJMP_TARGET): Likewise.
|
||||
(IN_SIGTRAMP): Likewise.
|
||||
(SVR4_SHARED_LIBS): Define this and include "solib.h".
|
||||
|
||||
2003-05-25 Mark Kettenis <kettenis@gnu.org>
|
||||
|
||||
* sparc-tdep.c (sparc32_do_push_arguments): New function.
|
||||
|
|
|
@ -1157,7 +1157,7 @@ config.h: stamp-h ; @true
|
|||
stamp-h: config.in config.status
|
||||
CONFIG_HEADERS=config.h:config.in $(SHELL) config.status
|
||||
|
||||
config.status: configure
|
||||
config.status: configure configure.tgt configure.host
|
||||
$(SHELL) config.status --recheck
|
||||
|
||||
force:
|
||||
|
@ -1923,7 +1923,8 @@ m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \
|
|||
$(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \
|
||||
$(m68k_tdep_h) $(gdb_stat_h) $(floatformat_h) $(target_h)
|
||||
m68klinux-tdep.o: m68klinux-tdep.c $(defs_h) $(gdbcore_h) $(frame_h) \
|
||||
$(target_h) $(gdb_string_h) $(gdbtypes_h) $(osabi_h) $(m68k_tdep_t)
|
||||
$(target_h) $(gdb_string_h) $(gdbtypes_h) $(osabi_h) $(regcache_h) \
|
||||
$(objfiles_h) $(symtab_h) $(m68k_tdep_t)
|
||||
m68knbsd-nat.o: m68knbsd-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
|
||||
$(regcache_h)
|
||||
m68knbsd-tdep.o: m68knbsd-tdep.c $(defs_h) $(gdbtypes_h) $(regcache_h)
|
||||
|
|
|
@ -20,28 +20,11 @@
|
|||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "config/tm-linux.h"
|
||||
#include "m68k/tm-m68k.h"
|
||||
/* We define SVR4_SHARED_LIBS unconditionally, on the assumption that
|
||||
link.h is available on all linux platforms. For I386 and SH3/4,
|
||||
we hard-code the information rather than use link.h anyway (for
|
||||
the benefit of cross-debugging). We may move to doing that for
|
||||
other architectures as well. */
|
||||
|
||||
#include "regcache.h"
|
||||
|
||||
/* Number of traps that happen between exec'ing the shell to run an
|
||||
inferior, and when we finally get to the inferior code. This is 2
|
||||
on most implementations. */
|
||||
|
||||
#define START_INFERIOR_TRAPS_EXPECTED 2
|
||||
|
||||
/* Offsets (in target ints) into jmp_buf. */
|
||||
|
||||
#define JB_ELEMENT_SIZE 4
|
||||
#define JB_PC 7
|
||||
|
||||
/* Figure out where the longjmp will land. Slurp the args out of the stack.
|
||||
We expect the first arg to be a pointer to the jmp_buf structure from which
|
||||
we extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
|
||||
This routine returns true on success */
|
||||
|
||||
#define GET_LONGJMP_TARGET(ADDR) m68k_get_longjmp_target(ADDR)
|
||||
|
||||
#define IN_SIGTRAMP(pc,name) m68k_linux_in_sigtramp (pc)
|
||||
extern int m68k_linux_in_sigtramp (CORE_ADDR pc);
|
||||
#define SVR4_SHARED_LIBS
|
||||
#include "solib.h" /* Support for shared libraries. */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Parameters for execution on a 68000 series machine.
|
||||
Copyright 1986, 1987, 1989, 1990, 1992, 1993, 1994, 1995, 1996, 1998,
|
||||
1999, 2000 Free Software Foundation, Inc.
|
||||
1999, 2000, 2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -19,8 +19,6 @@
|
|||
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include "regcache.h"
|
||||
|
||||
#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
|
||||
|
||||
extern int m68k_get_longjmp_target (CORE_ADDR *);
|
||||
|
|
|
@ -130,6 +130,7 @@ m68*-*-aout*) gdb_target=monitor ;;
|
|||
m68*-*-coff*) gdb_target=monitor ;;
|
||||
m68*-*-elf*) gdb_target=monitor ;;
|
||||
m68*-*-linux*) gdb_target=linux
|
||||
gdb_multi_arch=1
|
||||
build_gdbserver=yes
|
||||
;;
|
||||
m68*-*-lynxos*) gdb_target=m68klynx ;;
|
||||
|
|
138
gdb/m68k-tdep.c
138
gdb/m68k-tdep.c
|
@ -77,13 +77,13 @@
|
|||
#endif
|
||||
|
||||
|
||||
void m68k_frame_init_saved_regs (struct frame_info *frame_info);
|
||||
static void m68k_frame_init_saved_regs (struct frame_info *frame_info);
|
||||
|
||||
|
||||
/* gdbarch_breakpoint_from_pc is set to m68k_local_breakpoint_from_pc
|
||||
so m68k_remote_breakpoint_from_pc is currently not used. */
|
||||
|
||||
const static unsigned char *
|
||||
static const unsigned char *
|
||||
m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
|
||||
{
|
||||
static unsigned char break_insn[] = {0x4e, (0x40 | REMOTE_BPT_VECTOR)};
|
||||
|
@ -91,7 +91,7 @@ m68k_remote_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
|
|||
return break_insn;
|
||||
}
|
||||
|
||||
const static unsigned char *
|
||||
static const unsigned char *
|
||||
m68k_local_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
|
||||
{
|
||||
static unsigned char break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
|
||||
|
@ -110,13 +110,11 @@ m68k_register_bytes_ok (long numbytes)
|
|||
/* Number of bytes of storage in the actual machine representation
|
||||
for register regnum. On the 68000, all regs are 4 bytes
|
||||
except the floating point regs which are 12 bytes. */
|
||||
/* Note that the unsigned cast here forces the result of the
|
||||
subtraction to very high positive values if regnum < FP0_REGNUM */
|
||||
|
||||
static int
|
||||
m68k_register_raw_size (int regnum)
|
||||
{
|
||||
return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
|
||||
return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4);
|
||||
}
|
||||
|
||||
/* Number of bytes of storage in the program's representation
|
||||
|
@ -126,7 +124,7 @@ m68k_register_raw_size (int regnum)
|
|||
static int
|
||||
m68k_register_virtual_size (int regnum)
|
||||
{
|
||||
return (((unsigned) (regnum) - FP0_REGNUM) < 8 ? 12 : 4);
|
||||
return (regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 8 ? 12 : 4);
|
||||
}
|
||||
|
||||
/* Return the GDB type object for the "standard" data type of data in
|
||||
|
@ -296,28 +294,6 @@ m68k_frame_saved_pc (struct frame_info *frame)
|
|||
}
|
||||
|
||||
|
||||
/* The only reason this is here is the tm-altos.h reference below. It
|
||||
was moved back here from tm-m68k.h. FIXME? */
|
||||
|
||||
extern CORE_ADDR
|
||||
altos_skip_prologue (CORE_ADDR pc)
|
||||
{
|
||||
register int op = read_memory_unsigned_integer (pc, 2);
|
||||
if (op == P_LINKW_FP)
|
||||
pc += 4; /* Skip link #word */
|
||||
else if (op == P_LINKL_FP)
|
||||
pc += 6; /* Skip link #long */
|
||||
/* Not sure why branches are here. */
|
||||
/* From tm-altos.h */
|
||||
else if (op == 0060000)
|
||||
pc += 4; /* Skip bra #word */
|
||||
else if (op == 00600377)
|
||||
pc += 6; /* skip bra #long */
|
||||
else if ((op & 0177400) == 0060000)
|
||||
pc += 2; /* skip bra #char */
|
||||
return pc;
|
||||
}
|
||||
|
||||
int
|
||||
delta68_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
|
@ -353,31 +329,6 @@ delta68_frame_saved_pc (struct frame_info *frame_info)
|
|||
+ 4, 4);
|
||||
}
|
||||
|
||||
/* Return number of args passed to a frame.
|
||||
Can return -1, meaning no way to tell. */
|
||||
|
||||
int
|
||||
isi_frame_num_args (struct frame_info *fi)
|
||||
{
|
||||
int val;
|
||||
CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi);
|
||||
int insn = read_memory_unsigned_integer (pc, 2);
|
||||
val = 0;
|
||||
if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
|
||||
val = read_memory_integer (pc + 2, 2);
|
||||
else if ((insn & 0170777) == 0050217 /* addql #N, sp */
|
||||
|| (insn & 0170777) == 0050117) /* addqw */
|
||||
{
|
||||
val = (insn >> 9) & 7;
|
||||
if (val == 0)
|
||||
val = 8;
|
||||
}
|
||||
else if (insn == 0157774) /* addal #WW, sp */
|
||||
val = read_memory_integer (pc + 2, 4);
|
||||
val >>= 2;
|
||||
return val;
|
||||
}
|
||||
|
||||
int
|
||||
delta68_frame_num_args (struct frame_info *fi)
|
||||
{
|
||||
|
@ -400,33 +351,11 @@ delta68_frame_num_args (struct frame_info *fi)
|
|||
return val;
|
||||
}
|
||||
|
||||
int
|
||||
news_frame_num_args (struct frame_info *fi)
|
||||
{
|
||||
int val;
|
||||
CORE_ADDR pc = DEPRECATED_FRAME_SAVED_PC (fi);
|
||||
int insn = read_memory_unsigned_integer (pc, 2);
|
||||
val = 0;
|
||||
if (insn == 0047757 || insn == 0157374) /* lea W(sp),sp or addaw #W,sp */
|
||||
val = read_memory_integer (pc + 2, 2);
|
||||
else if ((insn & 0170777) == 0050217 /* addql #N, sp */
|
||||
|| (insn & 0170777) == 0050117) /* addqw */
|
||||
{
|
||||
val = (insn >> 9) & 7;
|
||||
if (val == 0)
|
||||
val = 8;
|
||||
}
|
||||
else if (insn == 0157774) /* addal #WW, sp */
|
||||
val = read_memory_integer (pc + 2, 4);
|
||||
val >>= 2;
|
||||
return val;
|
||||
}
|
||||
|
||||
/* Insert the specified number of args and function address
|
||||
into a call sequence of the above form stored at DUMMYNAME.
|
||||
We use the BFD routines to store a big-endian value of known size. */
|
||||
|
||||
void
|
||||
static void
|
||||
m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
|
||||
struct value **args, struct type *type, int gcc_p)
|
||||
{
|
||||
|
@ -438,7 +367,7 @@ m68k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
|
|||
|
||||
/* Push an empty stack frame, to record the current PC, etc. */
|
||||
|
||||
void
|
||||
static void
|
||||
m68k_push_dummy_frame (void)
|
||||
{
|
||||
register CORE_ADDR sp = read_register (SP_REGNUM);
|
||||
|
@ -468,7 +397,7 @@ m68k_push_dummy_frame (void)
|
|||
/* Discard from the stack the innermost frame,
|
||||
restoring all saved registers. */
|
||||
|
||||
void
|
||||
static void
|
||||
m68k_pop_frame (void)
|
||||
{
|
||||
register struct frame_info *frame = get_current_frame ();
|
||||
|
@ -539,7 +468,7 @@ m68k_pop_frame (void)
|
|||
|
||||
*/
|
||||
|
||||
CORE_ADDR
|
||||
static CORE_ADDR
|
||||
m68k_skip_prologue (CORE_ADDR ip)
|
||||
{
|
||||
register CORE_ADDR limit;
|
||||
|
@ -580,7 +509,7 @@ m68k_skip_prologue (CORE_ADDR ip)
|
|||
ways in the stack frame. sp is even more special:
|
||||
the address we return for it IS the sp for the next frame. */
|
||||
|
||||
void
|
||||
static void
|
||||
m68k_frame_init_saved_regs (struct frame_info *frame_info)
|
||||
{
|
||||
register int regnum;
|
||||
|
@ -905,17 +834,19 @@ fill_fpregset (fpregset_t *fpregsetp, int regno)
|
|||
we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
|
||||
This routine returns true on success. */
|
||||
|
||||
/* NOTE: cagney/2000-11-08: For this function to be fully multi-arched
|
||||
the macro's JB_PC and JB_ELEMENT_SIZE would need to be moved into
|
||||
the ``struct gdbarch_tdep'' object and then set on a target ISA/ABI
|
||||
dependant basis. */
|
||||
|
||||
int
|
||||
m68k_get_longjmp_target (CORE_ADDR *pc)
|
||||
{
|
||||
#if defined (JB_PC) && defined (JB_ELEMENT_SIZE)
|
||||
char *buf;
|
||||
CORE_ADDR sp, jb_addr;
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
||||
|
||||
if (tdep->jb_pc < 0)
|
||||
{
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"m68k_get_longjmp_target: not implemented");
|
||||
return 0;
|
||||
}
|
||||
|
||||
buf = alloca (TARGET_PTR_BIT / TARGET_CHAR_BIT);
|
||||
sp = read_register (SP_REGNUM);
|
||||
|
@ -926,18 +857,12 @@ m68k_get_longjmp_target (CORE_ADDR *pc)
|
|||
|
||||
jb_addr = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
|
||||
|
||||
if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
|
||||
if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
|
||||
TARGET_PTR_BIT / TARGET_CHAR_BIT))
|
||||
return 0;
|
||||
|
||||
*pc = extract_address (buf, TARGET_PTR_BIT / TARGET_CHAR_BIT);
|
||||
|
||||
return 1;
|
||||
#else
|
||||
internal_error (__FILE__, __LINE__,
|
||||
"m68k_get_longjmp_target: not implemented");
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Immediately after a function call, return the saved pc before the frame
|
||||
|
@ -945,7 +870,7 @@ m68k_get_longjmp_target (CORE_ADDR *pc)
|
|||
system call, and if so, we know that Sun pushes the call # on the stack
|
||||
prior to doing the trap. */
|
||||
|
||||
CORE_ADDR
|
||||
static CORE_ADDR
|
||||
m68k_saved_pc_after_call (struct frame_info *frame)
|
||||
{
|
||||
#ifdef SYSCALL_TRAP
|
||||
|
@ -979,11 +904,8 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
if (arches != NULL)
|
||||
return (arches->gdbarch);
|
||||
|
||||
#if 0
|
||||
tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
|
||||
#endif
|
||||
|
||||
gdbarch = gdbarch_alloc (&info, 0);
|
||||
tdep = xmalloc (sizeof (struct gdbarch_tdep));
|
||||
gdbarch = gdbarch_alloc (&info, tdep);
|
||||
|
||||
/* NOTE: cagney/2002-12-06: This can be deleted when this arch is
|
||||
ready to unwind the PC first (see frame.c:get_prev_frame()). */
|
||||
|
@ -1053,9 +975,22 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
/* Should be using push_dummy_call. */
|
||||
set_gdbarch_deprecated_dummy_write_sp (gdbarch, generic_target_write_sp);
|
||||
|
||||
#if defined JB_PC && defined JB_ELEMENT_SIZE
|
||||
tdep->jb_pc = JB_PC;
|
||||
tdep->jb_elt_size = JB_ELEMENT_SIZE;
|
||||
#else
|
||||
tdep->jb_pc = -1;
|
||||
#endif
|
||||
|
||||
/* Hook in ABI-specific overrides, if they have been registered. */
|
||||
gdbarch_init_osabi (info, gdbarch);
|
||||
|
||||
/* Now we have tuned the configuration, set a few final things,
|
||||
based on what the OS ABI has told us. */
|
||||
|
||||
if (tdep->jb_pc >= 0)
|
||||
set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
|
||||
|
||||
return gdbarch;
|
||||
}
|
||||
|
||||
|
@ -1063,7 +998,10 @@ m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
static void
|
||||
m68k_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
|
||||
|
||||
if (tdep == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Common target dependent code for the Motorola 68000 series.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001, 2003
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
@ -44,4 +44,14 @@ enum
|
|||
M68K_FPI_REGNUM = 28
|
||||
};
|
||||
|
||||
/* Target-dependent structure in gdbarch. */
|
||||
struct gdbarch_tdep
|
||||
{
|
||||
/* Offset to PC value in the jump buffer. If this is negative,
|
||||
longjmp support will be disabled. */
|
||||
int jb_pc;
|
||||
/* The size of each entry in the jump buffer. */
|
||||
size_t jb_elt_size;
|
||||
};
|
||||
|
||||
#endif /* M68K_TDEP_H */
|
||||
|
|
|
@ -27,8 +27,16 @@
|
|||
#include "gdb_string.h"
|
||||
#include "gdbtypes.h"
|
||||
#include "osabi.h"
|
||||
#include "regcache.h"
|
||||
#include "objfiles.h"
|
||||
#include "symtab.h"
|
||||
#include "m68k-tdep.h"
|
||||
|
||||
/* Offsets (in target ints) into jmp_buf. */
|
||||
|
||||
#define M68K_LINUX_JB_ELEMENT_SIZE 4
|
||||
#define M68K_LINUX_JB_PC 7
|
||||
|
||||
/* Check whether insn1 and insn2 are parts of a signal trampoline. */
|
||||
|
||||
#define IS_SIGTRAMP(insn1, insn2) \
|
||||
|
@ -47,8 +55,8 @@
|
|||
of m68k_linux_frame_saved_pc we also distinguish between non-RT and RT
|
||||
signal trampolines. */
|
||||
|
||||
int
|
||||
m68k_linux_in_sigtramp (CORE_ADDR pc)
|
||||
static int
|
||||
m68k_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
|
||||
{
|
||||
CORE_ADDR sp;
|
||||
char buf[12];
|
||||
|
@ -110,7 +118,7 @@ m68k_linux_sigtramp_saved_pc (struct frame_info *frame)
|
|||
|
||||
/* Don't cause a memory_error when accessing sigcontext in case the
|
||||
stack layout has changed or the stack is corrupt. */
|
||||
if (m68k_linux_in_sigtramp (get_frame_pc (frame)) == 2)
|
||||
if (m68k_linux_pc_in_sigtramp (get_frame_pc (frame), 0) == 2)
|
||||
target_read_memory (sigcontext_addr + UCONTEXT_PC_OFFSET, buf, ptrbytes);
|
||||
else
|
||||
target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
|
||||
|
@ -189,6 +197,11 @@ m68k_linux_extract_struct_value_address (char *regbuf)
|
|||
static void
|
||||
m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
||||
{
|
||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||
|
||||
tdep->jb_pc = M68K_LINUX_JB_PC;
|
||||
tdep->jb_elt_size = M68K_LINUX_JB_ELEMENT_SIZE;
|
||||
|
||||
set_gdbarch_deprecated_frame_saved_pc (gdbarch,
|
||||
m68k_linux_frame_saved_pc);
|
||||
set_gdbarch_deprecated_extract_return_value (gdbarch,
|
||||
|
@ -197,6 +210,12 @@ m68k_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
|
|||
m68k_linux_store_return_value);
|
||||
set_gdbarch_deprecated_extract_struct_value_address (gdbarch,
|
||||
m68k_linux_extract_struct_value_address);
|
||||
|
||||
set_gdbarch_pc_in_sigtramp (gdbarch, m68k_linux_pc_in_sigtramp);
|
||||
|
||||
/* Shared library handling. */
|
||||
set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section);
|
||||
set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in New Issue