projects
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gdb/doc/
[binutils-gdb.git]
/
gdb
/
mips-linux-tdep.c
diff --git
a/gdb/mips-linux-tdep.c
b/gdb/mips-linux-tdep.c
index 8f30aef45ff6b978009a25f6e81400e305239b9f..5924b30984db3d95f2219f18082da3c3b1de7c98 100644
(file)
--- a/
gdb/mips-linux-tdep.c
+++ b/
gdb/mips-linux-tdep.c
@@
-1,6
+1,6
@@
/* Target-dependent code for GNU/Linux on MIPS processors.
/* Target-dependent code for GNU/Linux on MIPS processors.
- Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008
+ Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008
, 2009, 2010
Free Software Foundation, Inc.
This file is part of GDB.
Free Software Foundation, Inc.
This file is part of GDB.
@@
-37,6
+37,7
@@
#include "symtab.h"
#include "target-descriptions.h"
#include "mips-linux-tdep.h"
#include "symtab.h"
#include "target-descriptions.h"
#include "mips-linux-tdep.h"
+#include "glibc-tdep.h"
static struct target_so_ops mips_svr4_so_ops;
static struct target_so_ops mips_svr4_so_ops;
@@
-54,6
+55,7
@@
mips_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
{
CORE_ADDR jb_addr;
struct gdbarch *gdbarch = get_frame_arch (frame);
{
CORE_ADDR jb_addr;
struct gdbarch *gdbarch = get_frame_arch (frame);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
char buf[gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT];
jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
char buf[gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT];
jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
@@
-64,7
+66,8
@@
mips_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
return 0;
*pc = extract_unsigned_integer (buf,
return 0;
*pc = extract_unsigned_integer (buf,
- gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
+ gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT,
+ byte_order);
return 1;
}
return 1;
}
@@
-76,10
+79,11
@@
mips_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
static void
supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr)
{
static void
supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr)
{
+ struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
gdb_byte buf[MAX_REGISTER_SIZE];
gdb_byte buf[MAX_REGISTER_SIZE];
- store_signed_integer (buf,
- register_size (get_regcache_arch (regcache), regnum),
- extract_signed_integer (addr, 4));
+ store_signed_integer (buf, register_size (gdbarch, regnum), byte_order,
+ extract_signed_integer (addr, 4, byte_order));
regcache_raw_supply (regcache, regnum, buf);
}
regcache_raw_supply (regcache, regnum, buf);
}
@@
-257,6
+261,7
@@
mips64_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
{
CORE_ADDR jb_addr;
struct gdbarch *gdbarch = get_frame_arch (frame);
{
CORE_ADDR jb_addr;
struct gdbarch *gdbarch = get_frame_arch (frame);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
void *buf = alloca (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
int element_size = gdbarch_ptr_bit (gdbarch) == 32 ? 4 : 8;
void *buf = alloca (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
int element_size = gdbarch_ptr_bit (gdbarch) == 32 ? 4 : 8;
@@
-268,7
+273,8
@@
mips64_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
return 0;
*pc = extract_unsigned_integer (buf,
return 0;
*pc = extract_unsigned_integer (buf,
- gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
+ gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT,
+ byte_order);
return 1;
}
return 1;
}
@@
-279,7
+285,7
@@
mips64_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
/* Supply a 64-bit register. */
/* Supply a 64-bit register. */
-void
+
static
void
supply_64bit_reg (struct regcache *regcache, int regnum,
const gdb_byte *buf)
{
supply_64bit_reg (struct regcache *regcache, int regnum,
const gdb_byte *buf)
{
@@
-342,6
+348,7
@@
mips64_fill_gregset (const struct regcache *regcache,
mips64_elf_gregset_t *gregsetp, int regno)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
mips64_elf_gregset_t *gregsetp, int regno)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int regaddr, regi;
mips64_elf_greg_t *regp = *gregsetp;
void *dst;
int regaddr, regi;
mips64_elf_greg_t *regp = *gregsetp;
void *dst;
@@
-387,9
+394,10
@@
mips64_fill_gregset (const struct regcache *regcache,
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
- val = extract_signed_integer (buf, register_size (gdbarch, regno));
+ val = extract_signed_integer (buf, register_size (gdbarch, regno),
+ byte_order);
dst = regp + regaddr;
dst = regp + regaddr;
- store_signed_integer (dst, 8, val);
+ store_signed_integer (dst, 8,
byte_order,
val);
}
}
}
}
@@
-439,6
+447,7
@@
mips64_fill_fpregset (const struct regcache *regcache,
mips64_elf_fpregset_t *fpregsetp, int regno)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
mips64_elf_fpregset_t *fpregsetp, int regno)
{
struct gdbarch *gdbarch = get_regcache_arch (regcache);
+ enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
gdb_byte *to;
if ((regno >= gdbarch_fp0_regnum (gdbarch))
gdb_byte *to;
if ((regno >= gdbarch_fp0_regnum (gdbarch))
@@
-467,9
+476,10
@@
mips64_fill_fpregset (const struct regcache *regcache,
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
- val = extract_signed_integer (buf, register_size (gdbarch, regno));
+ val = extract_signed_integer (buf, register_size (gdbarch, regno),
+ byte_order);
to = (gdb_byte *) (*fpregsetp + 32);
to = (gdb_byte *) (*fpregsetp + 32);
- store_signed_integer (to, 4, val);
+ store_signed_integer (to, 4,
byte_order,
val);
}
else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
{
}
else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
{
@@
-477,9
+487,10
@@
mips64_fill_fpregset (const struct regcache *regcache,
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
LONGEST val;
regcache_raw_collect (regcache, regno, buf);
- val = extract_signed_integer (buf, register_size (gdbarch, regno));
+ val = extract_signed_integer (buf, register_size (gdbarch, regno),
+ byte_order);
to = (gdb_byte *) (*fpregsetp + 32) + 4;
to = (gdb_byte *) (*fpregsetp + 32) + 4;
- store_signed_integer (to, 4, val);
+ store_signed_integer (to, 4,
byte_order,
val);
}
else if (regno == -1)
{
}
else if (regno == -1)
{
@@
-603,7
+614,8
@@
mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
{
unsigned char buf[28], *p;
ULONGEST insn, insn1;
{
unsigned char buf[28], *p;
ULONGEST insn, insn1;
- int n64 = (mips_abi (current_gdbarch) == MIPS_ABI_N64);
+ int n64 = (mips_abi (target_gdbarch) == MIPS_ABI_N64);
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
read_memory (pc - 12, buf, 28);
read_memory (pc - 12, buf, 28);
@@
-621,7
+633,7
@@
mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
p = buf + 12;
while (p >= buf)
{
p = buf + 12;
while (p >= buf)
{
- insn = extract_unsigned_integer (p, 4);
+ insn = extract_unsigned_integer (p, 4
, byte_order
);
if (insn == insn1)
break;
p -= 4;
if (insn == insn1)
break;
p -= 4;
@@
-629,7
+641,7
@@
mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
if (p < buf)
return 0;
if (p < buf)
return 0;
- insn = extract_unsigned_integer (p + 4, 4);
+ insn = extract_unsigned_integer (p + 4, 4
, byte_order
);
if (n64)
{
/* daddu t7,ra */
if (n64)
{
/* daddu t7,ra */
@@
-643,12
+655,12
@@
mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
return 0;
}
return 0;
}
- insn = extract_unsigned_integer (p + 8, 4);
+ insn = extract_unsigned_integer (p + 8, 4
, byte_order
);
/* jalr t9,ra */
if (insn != 0x0320f809)
return 0;
/* jalr t9,ra */
if (insn != 0x0320f809)
return 0;
- insn = extract_unsigned_integer (p + 12, 4);
+ insn = extract_unsigned_integer (p + 12, 4
, byte_order
);
if (n64)
{
/* daddiu t8,zero,0 */
if (n64)
{
/* daddiu t8,zero,0 */
@@
-666,13
+678,13
@@
mips_linux_in_dynsym_stub (CORE_ADDR pc, char *name)
}
/* Return non-zero iff PC belongs to the dynamic linker resolution
}
/* Return non-zero iff PC belongs to the dynamic linker resolution
- code
or to a
stub. */
+ code
, a PLT entry, or a lazy binding
stub. */
static int
mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
{
/* Check whether PC is in the dynamic linker. This also checks
static int
mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
{
/* Check whether PC is in the dynamic linker. This also checks
- whether it is in the .plt section,
which MIPS does not use
. */
+ whether it is in the .plt section,
used by non-PIC executables
. */
if (svr4_in_dynsym_resolve_code (pc))
return 1;
if (svr4_in_dynsym_resolve_code (pc))
return 1;
@@
-688,8
+700,8
@@
mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
and glibc_skip_solib_resolver in glibc-tdep.c. The normal glibc
implementation of this triggers at "fixup" from the same objfile as
"_dl_runtime_resolve"; MIPS GNU/Linux can trigger at
and glibc_skip_solib_resolver in glibc-tdep.c. The normal glibc
implementation of this triggers at "fixup" from the same objfile as
"_dl_runtime_resolve"; MIPS GNU/Linux can trigger at
- "__dl_runtime_resolve" directly. An unresolved
PLT entry will
- point to _dl_runtime_resolve, which will first call
+ "__dl_runtime_resolve" directly. An unresolved
lazy binding
+
stub will
point to _dl_runtime_resolve, which will first call
__dl_runtime_resolve, and then pass control to the resolved
function. */
__dl_runtime_resolve, and then pass control to the resolved
function. */
@@
-701,9
+713,9
@@
mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
- return frame_
pc_unwind
(get_current_frame ());
+ return frame_
unwind_caller_pc
(get_current_frame ());
- return
0
;
+ return
glibc_skip_solib_resolver (gdbarch, pc)
;
}
/* Signal trampoline support. There are four supported layouts for a
}
/* Signal trampoline support. There are four supported layouts for a
@@
-785,7
+797,7
@@
static const struct tramp_frame mips_linux_n64_rt_sigframe = {
struct sigframe {
u32 sf_ass[4]; [argument save space for o32]
struct sigframe {
u32 sf_ass[4]; [argument save space for o32]
- u32 sf_code[2]; [signal trampoline]
+ u32 sf_code[2]; [signal trampoline
or fill
]
struct sigcontext sf_sc;
sigset_t sf_mask;
};
struct sigcontext sf_sc;
sigset_t sf_mask;
};
@@
-815,7
+827,7
@@
static const struct tramp_frame mips_linux_n64_rt_sigframe = {
struct rt_sigframe {
u32 rs_ass[4]; [argument save space for o32]
struct rt_sigframe {
u32 rs_ass[4]; [argument save space for o32]
- u32 rs_code[2] [signal trampoline]
+ u32 rs_code[2] [signal trampoline
or fill
]
struct siginfo rs_info;
struct ucontext rs_uc;
};
struct siginfo rs_info;
struct ucontext rs_uc;
};
@@
-830,7
+842,6
@@
static const struct tramp_frame mips_linux_n64_rt_sigframe = {
}; */
/* *INDENT-ON* */
}; */
/* *INDENT-ON* */
-#define SIGFRAME_CODE_OFFSET (4 * 4)
#define SIGFRAME_SIGCONTEXT_OFFSET (6 * 4)
#define RTSIGFRAME_SIGINFO_SIZE 128
#define SIGFRAME_SIGCONTEXT_OFFSET (6 * 4)
#define RTSIGFRAME_SIGINFO_SIZE 128
@@
-859,14
+870,15
@@
mips_linux_o32_sigframe_init (const struct tramp_frame *self,
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
int ireg, reg_position;
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
int ireg, reg_position;
- CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
+ CORE_ADDR frame_sp = get_frame_sp (this_frame);
+ CORE_ADDR sigcontext_base;
const struct mips_regnum *regs = mips_regnum (gdbarch);
CORE_ADDR regs_base;
if (self == &mips_linux_o32_sigframe)
const struct mips_regnum *regs = mips_regnum (gdbarch);
CORE_ADDR regs_base;
if (self == &mips_linux_o32_sigframe)
- sigcontext_base
+=
SIGFRAME_SIGCONTEXT_OFFSET;
+ sigcontext_base
= frame_sp +
SIGFRAME_SIGCONTEXT_OFFSET;
else
else
- sigcontext_base
+=
RTSIGFRAME_SIGCONTEXT_OFFSET;
+ sigcontext_base
= frame_sp +
RTSIGFRAME_SIGCONTEXT_OFFSET;
/* I'm not proud of this hack. Eventually we will have the
infrastructure to indicate the size of saved registers on a
/* I'm not proud of this hack. Eventually we will have the
infrastructure to indicate the size of saved registers on a
@@
-935,9
+947,7
@@
mips_linux_o32_sigframe_init (const struct tramp_frame *self,
sigcontext_base + SIGCONTEXT_BADVADDR);
/* Choice of the bottom of the sigframe is somewhat arbitrary. */
sigcontext_base + SIGCONTEXT_BADVADDR);
/* Choice of the bottom of the sigframe is somewhat arbitrary. */
- trad_frame_set_id (this_cache,
- frame_id_build (func - SIGFRAME_CODE_OFFSET,
- func));
+ trad_frame_set_id (this_cache, frame_id_build (frame_sp, func));
}
/* *INDENT-OFF* */
}
/* *INDENT-OFF* */
@@
-945,7
+955,7
@@
mips_linux_o32_sigframe_init (const struct tramp_frame *self,
struct rt_sigframe_n32 {
u32 rs_ass[4]; [ argument save space for o32 ]
struct rt_sigframe_n32 {
u32 rs_ass[4]; [ argument save space for o32 ]
- u32 rs_code[2]; [ signal trampoline ]
+ u32 rs_code[2]; [ signal trampoline
or fill
]
struct siginfo rs_info;
struct ucontextn32 rs_uc;
};
struct siginfo rs_info;
struct ucontextn32 rs_uc;
};
@@
-1026,13
+1036,14
@@
mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
int ireg, reg_position;
{
struct gdbarch *gdbarch = get_frame_arch (this_frame);
int ireg, reg_position;
- CORE_ADDR sigcontext_base = func - SIGFRAME_CODE_OFFSET;
+ CORE_ADDR frame_sp = get_frame_sp (this_frame);
+ CORE_ADDR sigcontext_base;
const struct mips_regnum *regs = mips_regnum (gdbarch);
if (self == &mips_linux_n32_rt_sigframe)
const struct mips_regnum *regs = mips_regnum (gdbarch);
if (self == &mips_linux_n32_rt_sigframe)
- sigcontext_base
+=
N32_SIGFRAME_SIGCONTEXT_OFFSET;
+ sigcontext_base
= frame_sp +
N32_SIGFRAME_SIGCONTEXT_OFFSET;
else
else
- sigcontext_base
+=
N64_SIGFRAME_SIGCONTEXT_OFFSET;
+ sigcontext_base
= frame_sp +
N64_SIGFRAME_SIGCONTEXT_OFFSET;
if (mips_linux_restart_reg_p (gdbarch))
trad_frame_set_reg_addr (this_cache,
if (mips_linux_restart_reg_p (gdbarch))
trad_frame_set_reg_addr (this_cache,
@@
-1070,9
+1081,7
@@
mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
sigcontext_base + N64_SIGCONTEXT_LO);
/* Choice of the bottom of the sigframe is somewhat arbitrary. */
sigcontext_base + N64_SIGCONTEXT_LO);
/* Choice of the bottom of the sigframe is somewhat arbitrary. */
- trad_frame_set_id (this_cache,
- frame_id_build (func - SIGFRAME_CODE_OFFSET,
- func));
+ trad_frame_set_id (this_cache, frame_id_build (frame_sp, func));
}
static void
}
static void
@@
-1104,7
+1113,7
@@
mips_linux_restart_reg_p (struct gdbarch *gdbarch)
/* When FRAME is at a syscall instruction, return the PC of the next
instruction to be executed. */
/* When FRAME is at a syscall instruction, return the PC of the next
instruction to be executed. */
-CORE_ADDR
+
static
CORE_ADDR
mips_linux_syscall_next_pc (struct frame_info *frame)
{
CORE_ADDR pc = get_frame_pc (frame);
mips_linux_syscall_next_pc (struct frame_info *frame)
{
CORE_ADDR pc = get_frame_pc (frame);
@@
-1116,7
+1125,7
@@
mips_linux_syscall_next_pc (struct frame_info *frame)
|| v0 == MIPS_NR_rt_sigreturn
|| v0 == MIPS_NR_N64_rt_sigreturn
|| v0 == MIPS_NR_N32_rt_sigreturn)
|| v0 == MIPS_NR_rt_sigreturn
|| v0 == MIPS_NR_N64_rt_sigreturn
|| v0 == MIPS_NR_N32_rt_sigreturn)
- return frame_
pc_unwind
(get_current_frame ());
+ return frame_
unwind_caller_pc
(get_current_frame ());
return pc + 4;
}
return pc + 4;
}
@@
-1171,7
+1180,6
@@
mips_linux_init_abi (struct gdbarch_info info,
break;
}
break;
}
- set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
set_gdbarch_skip_solib_resolver (gdbarch, mips_linux_skip_resolver);
set_gdbarch_software_single_step (gdbarch, mips_software_single_step);
set_gdbarch_skip_solib_resolver (gdbarch, mips_linux_skip_resolver);
set_gdbarch_software_single_step (gdbarch, mips_software_single_step);
@@
-1216,6
+1224,9
@@
mips_linux_init_abi (struct gdbarch_info info,
}
}
}
}
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_mips_linux_tdep;
+
void
_initialize_mips_linux_tdep (void)
{
void
_initialize_mips_linux_tdep (void)
{