]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mips64-obsd-tdep.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / mips64-obsd-tdep.c
CommitLineData
abc08782
MK
1/* Target-dependent code for OpenBSD/mips64.
2
1d506c26 3 Copyright (C) 2004-2024 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
32#define MIPS64OBSD_NUM_REGS 73
33
34/* Core file support. */
35
36/* Supply register REGNUM from the buffer specified by GREGS and LEN
37 in the general-purpose register set REGSET to register cache
38 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
39
40static void
41mips64obsd_supply_gregset (const struct regset *regset,
42 struct regcache *regcache, int regnum,
43 const void *gregs, size_t len)
44{
19ba03f4 45 const char *regs = (const char *) gregs;
abc08782
MK
46 int i;
47
48 for (i = 0; i < MIPS64OBSD_NUM_REGS; i++)
49 {
50 if (regnum == i || regnum == -1)
73e1c03f 51 regcache->raw_supply (i, regs + i * 8);
abc08782
MK
52 }
53}
54
55/* OpenBSD/mips64 register set. */
56
3ca7dae4 57static const struct regset mips64obsd_gregset =
abc08782
MK
58{
59 NULL,
60 mips64obsd_supply_gregset
61};
62
d4036235 63/* Iterate over core file register note sections. */
abc08782 64
d4036235
AA
65static void
66mips64obsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
67 iterate_over_regset_sections_cb *cb,
68 void *cb_data,
69 const struct regcache *regcache)
abc08782 70{
a616bb94
AH
71 cb (".reg", MIPS64OBSD_NUM_REGS * 8, MIPS64OBSD_NUM_REGS * 8,
72 &mips64obsd_gregset, NULL, cb_data);
abc08782
MK
73}
74\f
75
8e763687
MK
76/* Signal trampolines. */
77
78static void
79mips64obsd_sigframe_init (const struct tramp_frame *self,
bd2b40ac 80 frame_info_ptr this_frame,
8e763687
MK
81 struct trad_frame_cache *cache,
82 CORE_ADDR func)
83{
b8a22b94 84 struct gdbarch *gdbarch = get_frame_arch (this_frame);
8e763687
MK
85 CORE_ADDR sp, sigcontext_addr, addr;
86 int regnum;
87
88 /* We find the appropriate instance of `struct sigcontext' at a
89 fixed offset in the signal frame. */
b8a22b94
DJ
90 sp = get_frame_register_signed (this_frame,
91 MIPS_SP_REGNUM + gdbarch_num_regs (gdbarch));
8e763687
MK
92 sigcontext_addr = sp + 32;
93
94 /* PC. */
95 regnum = mips_regnum (gdbarch)->pc;
f57d151a 96 trad_frame_set_reg_addr (cache,
2eb4d78b 97 regnum + gdbarch_num_regs (gdbarch),
f57d151a 98 sigcontext_addr + 16);
8e763687
MK
99
100 /* GPRs. */
101 for (regnum = MIPS_AT_REGNUM, addr = sigcontext_addr + 32;
102 regnum <= MIPS_RA_REGNUM; regnum++, addr += 8)
f57d151a 103 trad_frame_set_reg_addr (cache,
2eb4d78b 104 regnum + gdbarch_num_regs (gdbarch),
f57d151a 105 addr);
8e763687
MK
106
107 /* HI and LO. */
108 regnum = mips_regnum (gdbarch)->lo;
f57d151a 109 trad_frame_set_reg_addr (cache,
2eb4d78b 110 regnum + gdbarch_num_regs (gdbarch),
f57d151a 111 sigcontext_addr + 280);
8e763687 112 regnum = mips_regnum (gdbarch)->hi;
f57d151a 113 trad_frame_set_reg_addr (cache,
2eb4d78b 114 regnum + gdbarch_num_regs (gdbarch),
f57d151a 115 sigcontext_addr + 288);
8e763687
MK
116
117 /* TODO: Handle the floating-point registers. */
118
119 trad_frame_set_id (cache, frame_id_build (sp, func));
120}
121
122static const struct tramp_frame mips64obsd_sigframe =
123{
124 SIGTRAMP_FRAME,
125 MIPS_INSN32_SIZE,
126 {
7bc02706
TT
127 { 0x67a40020, ULONGEST_MAX }, /* daddiu a0,sp,32 */
128 { 0x24020067, ULONGEST_MAX }, /* li v0,103 */
129 { 0x0000000c, ULONGEST_MAX }, /* syscall */
130 { 0x0000000d, ULONGEST_MAX }, /* break */
131 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
8e763687
MK
132 },
133 mips64obsd_sigframe_init
134};
135
136\f
abc08782
MK
137static void
138mips64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
139{
8e763687
MK
140 /* OpenBSD/mips64 only supports the n64 ABI, but the braindamaged
141 way GDB works, forces us to pretend we can handle them all. */
142
d4036235
AA
143 set_gdbarch_iterate_over_regset_sections
144 (gdbarch, mips64obsd_iterate_over_regset_sections);
abc08782 145
8e763687
MK
146 tramp_frame_prepend_unwinder (gdbarch, &mips64obsd_sigframe);
147
89fa5cc8 148 set_gdbarch_long_double_bit (gdbarch, 128);
552f1157 149 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_quad);
89fa5cc8 150
3cdd631f
MK
151 obsd_init_abi(info, gdbarch);
152
8e763687 153 /* OpenBSD/mips64 has SVR4-style shared libraries. */
abc08782
MK
154 set_solib_svr4_fetch_link_map_offsets
155 (gdbarch, svr4_lp64_fetch_link_map_offsets);
156}
157
6c265988 158void _initialize_mips64obsd_tdep ();
abc08782 159void
6c265988 160_initialize_mips64obsd_tdep ()
abc08782 161{
1736a7bd 162 gdbarch_register_osabi (bfd_arch_mips, 0, GDB_OSABI_OPENBSD,
abc08782
MK
163 mips64obsd_init_abi);
164}