gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / hppa-nbsd-tdep.c
CommitLineData
af5ca30d
NH
1/* Target-dependent code for NetBSD/hppa
2
b811d2c2 3 Copyright (C) 2008-2020 Free Software Foundation, Inc.
af5ca30d
NH
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
5b1ba0e5 9 the Free Software Foundation; either version 3 of the License, or
af5ca30d
NH
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
5b1ba0e5 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
af5ca30d
NH
19
20#include "defs.h"
21#include "osabi.h"
22#include "regcache.h"
23#include "regset.h"
24
25#include "trad-frame.h"
26#include "tramp-frame.h"
27
af5ca30d 28#include "hppa-tdep.h"
03b62bbb 29#include "hppa-bsd-tdep.h"
dea34e8c 30#include "nbsd-tdep.h"
0d12e84c 31#include "gdbarch.h"
af5ca30d
NH
32
33/* From <machine/mcontext.h>. */
34static int hppanbsd_mc_reg_offset[] =
35{
36 /* r0 ... r31 */
37 -1, 1 * 4, 2 * 4, 3 * 4,
38 4 * 4, 5 * 4, 6 * 4, 7 * 4,
39 8 * 4, 9 * 4, 10 * 4, 11 * 4,
40 12 * 4, 13 * 4, 14 * 4, 15 * 4,
41 16 * 4, 17 * 4, 18 * 4, 19 * 4,
42 20 * 4, 21 * 4, 22 * 4, 23 * 4,
43 24 * 4, 25 * 4, 26 * 4, 27 * 4,
44 28 * 4, 29 * 4, 30 * 4, 31 * 4,
45
46 32 * 4, /* HPPA_SAR_REGNUM */
47 35 * 4, /* HPPA_PCOQ_HEAD_REGNUM */
48 33 * 4, /* HPPA_PCSQ_HEAD_REGNUM */
49 36 * 4, /* HPPA_PCOQ_TAIL_REGNUM */
50 34 * 4, /* HPPA_PCSQ_TAIL_REGNUM */
51 -1, /* HPPA_EIEM_REGNUM */
52 -1, /* HPPA_IIR_REGNUM */
53 -1, /* HPPA_ISR_REGNUM */
54 -1, /* HPPA_IOR_REGNUM */
55 0 * 4, /* HPPA_IPSW_REGNUM */
56 -1, /* spare? */
57 41 * 4, /* HPPA_SR4_REGNUM */
58 37 * 4, /* sr0 */
59 38 * 4, /* sr1 */
60 39 * 4, /* sr2 */
61 40 * 4, /* sr3 */
62
63 /* more tbd */
64};
65
66static void hppanbsd_sigtramp_cache_init (const struct tramp_frame *,
67 struct frame_info *,
68 struct trad_frame_cache *,
69 CORE_ADDR);
70
71static const struct tramp_frame hppanbsd_sigtramp_si4 =
72{
73 SIGTRAMP_FRAME,
74 4,
75 {
7bc02706
TT
76 { 0xc7d7c012, ULONGEST_MAX }, /* bb,>=,n %arg3, 30, 1f */
77 { 0xd6e01c1e, ULONGEST_MAX }, /* depwi 0,31,2,%arg3 */
78 { 0x0ee81093, ULONGEST_MAX }, /* ldw 4(%arg3), %r19 */
79 { 0x0ee01097, ULONGEST_MAX }, /* ldw 0(%arg3), %arg3 */
af5ca30d 80 /* 1: */
7bc02706
TT
81 { 0xe8404000, ULONGEST_MAX }, /* blr %r0, %rp */
82 { 0xeae0c002, ULONGEST_MAX }, /* bv,n %r0(%arg3) */
83 { 0x08000240, ULONGEST_MAX }, /* nop */
84
85 { 0x0803025a, ULONGEST_MAX }, /* copy %r3, %arg0 */
86 { 0x20200801, ULONGEST_MAX }, /* ldil -40000000, %r1 */
87 { 0xe420e008, ULONGEST_MAX }, /* be,l 4(%sr7, %r1), %sr0, %r31 */
88 { 0x34160268, ULONGEST_MAX }, /* ldi 134, %t1 ; SYS_setcontext */
89
90 { 0x081c025a, ULONGEST_MAX }, /* copy ret0, %arg0 */
91 { 0x20200801, ULONGEST_MAX }, /* ldil -40000000, %r1 */
92 { 0xe420e008, ULONGEST_MAX }, /* be,l 4(%sr7, %r1), %sr0, %r31 */
93 { 0x34160002, ULONGEST_MAX }, /* ldi 1, %t1 ; SYS_exit */
94 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
af5ca30d
NH
95 },
96 hppanbsd_sigtramp_cache_init
97};
98
99
100static void
101hppanbsd_sigtramp_cache_init (const struct tramp_frame *self,
5366653e 102 struct frame_info *this_frame,
af5ca30d
NH
103 struct trad_frame_cache *this_cache,
104 CORE_ADDR func)
105{
5366653e 106 CORE_ADDR sp = get_frame_register_unsigned (this_frame, HPPA_SP_REGNUM);
af5ca30d
NH
107 CORE_ADDR base;
108 int *reg_offset;
109 int num_regs;
110 int i;
111
112 reg_offset = hppanbsd_mc_reg_offset;
113 num_regs = ARRAY_SIZE (hppanbsd_mc_reg_offset);
114
115 /* frame pointer */
116 base = sp - 0x280;
117 /* offsetof(struct sigframe_siginfo, sf_uc) = 128 */
118 base += 128;
119 /* offsetof(ucontext_t, uc_mcontext) == 40 */
120 base += 40;
121
122 for (i = 0; i < num_regs; i++)
123 if (reg_offset[i] != -1)
124 trad_frame_set_reg_addr (this_cache, i, base + reg_offset[i]);
125
126 /* Construct the frame ID using the function start. */
127 trad_frame_set_id (this_cache, frame_id_build (sp, func));
128}
129
130/* Core file support. */
131
132/* Sizeof `struct reg' in <machine/reg.h>. */
133#define HPPANBSD_SIZEOF_GREGS (44 * 4)
134
135static int hppanbsd_reg_offset[] =
136{
137 /* r0 ... r31 */
138 -1, 1 * 4, 2 * 4, 3 * 4,
139 4 * 4, 5 * 4, 6 * 4, 7 * 4,
140 8 * 4, 9 * 4, 10 * 4, 11 * 4,
141 12 * 4, 13 * 4, 14 * 4, 15 * 4,
142 16 * 4, 17 * 4, 18 * 4, 19 * 4,
143 20 * 4, 21 * 4, 22 * 4, 23 * 4,
144 24 * 4, 25 * 4, 26 * 4, 27 * 4,
145 28 * 4, 29 * 4, 30 * 4, 31 * 4,
146
147 32 * 4, /* HPPA_SAR_REGNUM */
148 35 * 4, /* HPPA_PCOQ_HEAD_REGNUM */
149 33 * 4, /* HPPA_PCSQ_HEAD_REGNUM */
150 36 * 4, /* HPPA_PCOQ_TAIL_REGNUM */
151 34 * 4, /* HPPA_PCSQ_TAIL_REGNUM */
152 -1, /* HPPA_EIEM_REGNUM */
153 -1, /* HPPA_IIR_REGNUM */
154 -1, /* HPPA_ISR_REGNUM */
155 -1, /* HPPA_IOR_REGNUM */
156 0 * 4, /* HPPA_IPSW_REGNUM */
157};
158
159/* Supply register REGNUM from the buffer specified by GREGS and LEN
160 in the general-purpose register set REGSET to register cache
161 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
162
163static void
1777feb0
MS
164hppanbsd_supply_gregset (const struct regset *regset,
165 struct regcache *regcache,
166 int regnum, const void *gregs, size_t len)
af5ca30d 167{
9a3c8263 168 const gdb_byte *regs = (const gdb_byte *) gregs;
af5ca30d
NH
169 int i;
170
171 gdb_assert (len >= HPPANBSD_SIZEOF_GREGS);
172
173 for (i = 0; i < ARRAY_SIZE (hppanbsd_reg_offset); i++)
174 if (hppanbsd_reg_offset[i] != -1)
175 if (regnum == -1 || regnum == i)
73e1c03f 176 regcache->raw_supply (i, regs + hppanbsd_reg_offset[i]);
af5ca30d
NH
177}
178
179/* NetBSD/hppa register set. */
180
3ca7dae4 181static const struct regset hppanbsd_gregset =
af5ca30d
NH
182{
183 NULL,
184 hppanbsd_supply_gregset
185};
186
50c5eb53 187/* Iterate over supported core file register note sections. */
af5ca30d 188
50c5eb53
AA
189static void
190hppanbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
191 iterate_over_regset_sections_cb *cb,
192 void *cb_data,
193 const struct regcache *regcache)
af5ca30d 194{
a616bb94
AH
195 cb (".reg", HPPANBSD_SIZEOF_GREGS, HPPANBSD_SIZEOF_GREGS, &hppanbsd_gregset,
196 NULL, cb_data);
af5ca30d
NH
197}
198\f
af5ca30d
NH
199static void
200hppanbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
201{
202 /* Obviously NetBSD is BSD-based. */
203 hppabsd_init_abi (info, gdbarch);
204
79743962
KR
205 nbsd_init_abi (info, gdbarch);
206
af5ca30d 207 /* Core file support. */
50c5eb53
AA
208 set_gdbarch_iterate_over_regset_sections
209 (gdbarch, hppanbsd_iterate_over_regset_sections);
af5ca30d
NH
210
211 tramp_frame_prepend_unwinder (gdbarch, &hppanbsd_sigtramp_si4);
212}
af5ca30d 213
6c265988 214void _initialize_hppanbsd_tdep ();
af5ca30d 215void
6c265988 216_initialize_hppanbsd_tdep ()
af5ca30d 217{
1736a7bd 218 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_NETBSD,
af5ca30d
NH
219 hppanbsd_init_abi);
220}
This page took 1.034531 seconds and 4 git commands to generate.