gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / mips64-obsd-tdep.c
CommitLineData
abc08782
MK
1/* Target-dependent code for OpenBSD/mips64.
2
b811d2c2 3 Copyright (C) 2004-2020 Free Software Foundation, Inc.
abc08782
MK
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
abc08782
MK
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
abc08782
MK
19
20#include "defs.h"
89fa5cc8 21#include "gdbtypes.h"
abc08782
MK
22#include "osabi.h"
23#include "regcache.h"
24#include "regset.h"
8e763687
MK
25#include "trad-frame.h"
26#include "tramp-frame.h"
abc08782 27
3cdd631f 28#include "obsd-tdep.h"
abc08782
MK
29#include "mips-tdep.h"
30#include "solib-svr4.h"
31
89fa5cc8
MK
32/* The MIPS64 Floating-Point Quad-Precision format is similar to
33 big-endian IA-64 Quad-Precision format. */
34#define floatformats_mips64_quad floatformats_ia64_quad
35
abc08782
MK
36#define MIPS64OBSD_NUM_REGS 73
37
38/* Core file support. */
39
40/* Supply register REGNUM from the buffer specified by GREGS and LEN
41 in the general-purpose register set REGSET to register cache
42 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
43
44static void
45mips64obsd_supply_gregset (const struct regset *regset,
46 struct regcache *regcache, int regnum,
47 const void *gregs, size_t len)
48{
19ba03f4 49 const char *regs = (const char *) gregs;
abc08782
MK
50 int i;
51
52 for (i = 0; i < MIPS64OBSD_NUM_REGS; i++)
53 {
54 if (regnum == i || regnum == -1)
73e1c03f 55 regcache->raw_supply (i, regs + i * 8);
abc08782
MK
56 }
57}
58
59/* OpenBSD/mips64 register set. */
60
3ca7dae4 61static const struct regset mips64obsd_gregset =
abc08782
MK
62{
63 NULL,
64 mips64obsd_supply_gregset
65};
66
d4036235 67/* Iterate over core file register note sections. */
abc08782 68
d4036235
AA
69static void
70mips64obsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
71 iterate_over_regset_sections_cb *cb,
72 void *cb_data,
73 const struct regcache *regcache)
abc08782 74{
a616bb94
AH
75 cb (".reg", MIPS64OBSD_NUM_REGS * 8, MIPS64OBSD_NUM_REGS * 8,
76 &mips64obsd_gregset, NULL, cb_data);
abc08782
MK
77}
78\f
79
8e763687
MK
80/* Signal trampolines. */
81
82static void
83mips64obsd_sigframe_init (const struct tramp_frame *self,
b8a22b94 84 struct frame_info *this_frame,
8e763687
MK
85 struct trad_frame_cache *cache,
86 CORE_ADDR func)
87{
b8a22b94 88 struct gdbarch *gdbarch = get_frame_arch (this_frame);
8e763687
MK
89 CORE_ADDR sp, sigcontext_addr, addr;
90 int regnum;
91
92 /* We find the appropriate instance of `struct sigcontext' at a
93 fixed offset in the signal frame. */
b8a22b94
DJ
94 sp = get_frame_register_signed (this_frame,
95 MIPS_SP_REGNUM + gdbarch_num_regs (gdbarch));
8e763687
MK
96 sigcontext_addr = sp + 32;
97
98 /* PC. */
99 regnum = mips_regnum (gdbarch)->pc;
f57d151a 100 trad_frame_set_reg_addr (cache,
2eb4d78b 101 regnum + gdbarch_num_regs (gdbarch),
f57d151a 102 sigcontext_addr + 16);
8e763687
MK
103
104 /* GPRs. */
105 for (regnum = MIPS_AT_REGNUM, addr = sigcontext_addr + 32;
106 regnum <= MIPS_RA_REGNUM; regnum++, addr += 8)
f57d151a 107 trad_frame_set_reg_addr (cache,
2eb4d78b 108 regnum + gdbarch_num_regs (gdbarch),
f57d151a 109 addr);
8e763687
MK
110
111 /* HI and LO. */
112 regnum = mips_regnum (gdbarch)->lo;
f57d151a 113 trad_frame_set_reg_addr (cache,
2eb4d78b 114 regnum + gdbarch_num_regs (gdbarch),
f57d151a 115 sigcontext_addr + 280);
8e763687 116 regnum = mips_regnum (gdbarch)->hi;
f57d151a 117 trad_frame_set_reg_addr (cache,
2eb4d78b 118 regnum + gdbarch_num_regs (gdbarch),
f57d151a 119 sigcontext_addr + 288);
8e763687
MK
120
121 /* TODO: Handle the floating-point registers. */
122
123 trad_frame_set_id (cache, frame_id_build (sp, func));
124}
125
126static const struct tramp_frame mips64obsd_sigframe =
127{
128 SIGTRAMP_FRAME,
129 MIPS_INSN32_SIZE,
130 {
7bc02706
TT
131 { 0x67a40020, ULONGEST_MAX }, /* daddiu a0,sp,32 */
132 { 0x24020067, ULONGEST_MAX }, /* li v0,103 */
133 { 0x0000000c, ULONGEST_MAX }, /* syscall */
134 { 0x0000000d, ULONGEST_MAX }, /* break */
135 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
8e763687
MK
136 },
137 mips64obsd_sigframe_init
138};
139
140\f
abc08782
MK
141static void
142mips64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
143{
8e763687
MK
144 /* OpenBSD/mips64 only supports the n64 ABI, but the braindamaged
145 way GDB works, forces us to pretend we can handle them all. */
146
d4036235
AA
147 set_gdbarch_iterate_over_regset_sections
148 (gdbarch, mips64obsd_iterate_over_regset_sections);
abc08782 149
8e763687
MK
150 tramp_frame_prepend_unwinder (gdbarch, &mips64obsd_sigframe);
151
89fa5cc8
MK
152 set_gdbarch_long_double_bit (gdbarch, 128);
153 set_gdbarch_long_double_format (gdbarch, floatformats_mips64_quad);
154
3cdd631f
MK
155 obsd_init_abi(info, gdbarch);
156
8e763687 157 /* OpenBSD/mips64 has SVR4-style shared libraries. */
abc08782
MK
158 set_solib_svr4_fetch_link_map_offsets
159 (gdbarch, svr4_lp64_fetch_link_map_offsets);
160}
161
6c265988 162void _initialize_mips64obsd_tdep ();
abc08782 163void
6c265988 164_initialize_mips64obsd_tdep ()
abc08782 165{
1736a7bd 166 gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_OPENBSD,
abc08782
MK
167 mips64obsd_init_abi);
168}
This page took 1.407751 seconds and 4 git commands to generate.