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