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