GDB (xrefs)
/tmp/gdb-7.10/gdb/alphaobsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for OpenBSD/alpha.
2 
3  Copyright (C) 2006-2015 Free Software Foundation, Inc.
4 
5  This file is part of GDB.
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 3 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "frame.h"
22 #include "gdbcore.h"
23 #include "osabi.h"
24 
25 #include "obsd-tdep.h"
26 #include "alpha-tdep.h"
27 #include "alphabsd-tdep.h"
28 #include "solib-svr4.h"
29 
30 /* Signal trampolines. */
31 
32 /* The OpenBSD kernel maps the signal trampoline at some random
33  location in user space, which means that the traditional BSD way of
34  detecting it won't work.
35 
36  The signal trampoline will be mapped at an address that is page
37  aligned. We recognize the signal trampoline by looking for the
38  sigreturn system call. */
39 
40 static const int alphaobsd_page_size = 8192;
41 
42 static LONGEST
44 {
45  return (pc & (alphaobsd_page_size - 1));
46 }
47 
48 static int
50  CORE_ADDR pc, const char *name)
51 {
52  CORE_ADDR start_pc = (pc & ~(alphaobsd_page_size - 1));
53  unsigned insn;
54 
55  if (name)
56  return 0;
57 
58  /* Check for "". */
59  insn = alpha_read_insn (gdbarch, start_pc + 5 * ALPHA_INSN_SIZE);
60  if (insn != 0x201f0067)
61  return 0;
62 
63  /* Check for "". */
64  insn = alpha_read_insn (gdbarch, start_pc + 6 * ALPHA_INSN_SIZE);
65  if (insn != 0x00000083)
66  return 0;
67 
68  return 1;
69 }
70 
71 static CORE_ADDR
73 {
74  struct gdbarch *gdbarch = get_frame_arch (this_frame);
75  CORE_ADDR pc = get_frame_pc (this_frame);
76 
77  if (alphaobsd_sigtramp_offset (gdbarch, pc) < 3 * ALPHA_INSN_SIZE)
78  {
79  /* On entry, a pointer the `struct sigcontext' is passed in %a2. */
80  return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM + 2);
81  }
82  else if (alphaobsd_sigtramp_offset (gdbarch, pc) < 4 * ALPHA_INSN_SIZE)
83  {
84  /* It is stored on the stack Before calling the signal handler. */
85  CORE_ADDR sp;
87  return get_frame_memory_unsigned (this_frame, sp, 8);
88  }
89  else
90  {
91  /* It is reloaded into %a0 for the sigreturn(2) call. */
92  return get_frame_register_unsigned (this_frame, ALPHA_A0_REGNUM);
93  }
94 }
95 
96 
97 static void
99 {
100  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
101 
102  /* Hook into the DWARF CFI frame unwinder. */
103  alpha_dwarf2_init_abi (info, gdbarch);
104 
105  /* Hook into the MDEBUG frame unwinder. */
106  alpha_mdebug_init_abi (info, gdbarch);
107 
108  /* OpenBSD/alpha 3.0 and earlier does not provide single step
109  support via ptrace(2); use software single-stepping for now. */
111 
112  /* OpenBSD/alpha has SVR4-style shared libraries. */
116 
120 
121  tdep->jb_pc = 2;
122  tdep->jb_elt_size = 8;
123 
126 }
127 
128 
129 /* Provide a prototype to silence -Wmissing-prototypes. */
130 void _initialize_alphaobsd_tdep (void);
131 
132 void
134 {
135  gdbarch_register_osabi (bfd_arch_alpha, 0, GDB_OSABI_OPENBSD_ELF,
137 }
void alpha_mdebug_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
CORE_ADDR get_frame_pc(struct frame_info *frame)
Definition: frame.c:2217
bfd_vma CORE_ADDR
Definition: common-types.h:41
struct link_map_offsets * svr4_lp64_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3180
void alphanbsd_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
LONGEST(* dynamic_sigtramp_offset)(struct gdbarch *, CORE_ADDR)
Definition: alpha-tdep.h:78
#define ALPHA_INSN_SIZE
Definition: alpha-tdep.h:54
#define ALPHA_A0_REGNUM
Definition: alpha-tdep.h:40
void alpha_dwarf2_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: alpha-tdep.c:1849
#define ALPHA_SP_REGNUM
Definition: alpha-tdep.h:45
struct m32c_reg * pc
Definition: m32c-tdep.c:111
unsigned int alpha_read_insn(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: alpha-tdep.c:681
static void alphaobsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
CORE_ADDR(* sigcontext_addr)(struct frame_info *)
Definition: alpha-tdep.h:82
ULONGEST get_frame_memory_unsigned(struct frame_info *this_frame, CORE_ADDR addr, int len)
Definition: frame.c:2515
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1402
const char *const name
Definition: aarch64-tdep.c:68
static LONGEST alphaobsd_sigtramp_offset(struct gdbarch *gdbarch, CORE_ADDR pc)
static const int alphaobsd_page_size
void _initialize_alphaobsd_tdep(void)
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3108
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1194
static CORE_ADDR alphaobsd_sigcontext_addr(struct frame_info *this_frame)
size_t jb_elt_size
Definition: aarch64-tdep.h:83
void set_gdbarch_software_single_step(struct gdbarch *gdbarch, gdbarch_software_single_step_ftype software_single_step)
Definition: gdbarch.c:3026
int alpha_software_single_step(struct frame_info *frame)
Definition: alpha-tdep.c:1725
int(* pc_in_sigtramp)(struct gdbarch *gdbarch, CORE_ADDR pc, const char *name)
Definition: alpha-tdep.h:88
static int alphaobsd_pc_in_sigtramp(struct gdbarch *gdbarch, CORE_ADDR pc, const char *name)
CORE_ADDR obsd_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition: obsd-tdep.c:28
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3398
void set_gdbarch_skip_solib_resolver(struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype skip_solib_resolver)
Definition: gdbarch.c:3101
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
Definition: osabi.c:148
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2535
long long LONGEST
Definition: common-types.h:52