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