]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/hppa-obsd-tdep.c
Allow "unlimited" abbreviations
[thirdparty/binutils-gdb.git] / gdb / hppa-obsd-tdep.c
CommitLineData
af5ca30d
NH
1/* Target-dependent code for OpenBSD/hppa
2
42a4f53d 3 Copyright (C) 2004-2019 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
af5ca30d 25#include "hppa-tdep.h"
03b62bbb 26#include "hppa-bsd-tdep.h"
af5ca30d
NH
27
28/* Core file support. */
29
30/* Sizeof `struct reg' in <machine/reg.h>. */
cbb6aada
MK
31#define HPPAOBSD_SIZEOF_GREGS (34 * 4) /* OpenBSD 5.1 and earlier. */
32#define HPPANBSD_SIZEOF_GREGS (46 * 4) /* NetBSD and OpenBSD 5.2 and later. */
7c54a108
MK
33
34/* Sizeof `struct fpreg' in <machine/reg.h>. */
35#define HPPAOBSD_SIZEOF_FPREGS (32 * 8)
af5ca30d
NH
36
37/* Supply register REGNUM from the buffer specified by GREGS and LEN
38 in the general-purpose register set REGSET to register cache
39 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
40
41static void
7c54a108
MK
42hppaobsd_supply_gregset (const struct regset *regset,
43 struct regcache *regcache,
44 int regnum, const void *gregs, size_t len)
af5ca30d 45{
cbb6aada 46 gdb_byte zero[4] = { 0 };
9a3c8263 47 const gdb_byte *regs = (const gdb_byte *) gregs;
af5ca30d
NH
48 size_t offset;
49 int i;
50
7c54a108 51 gdb_assert (len >= HPPAOBSD_SIZEOF_GREGS);
af5ca30d 52
cbb6aada 53 if (regnum == -1 || regnum == HPPA_R0_REGNUM)
73e1c03f 54 regcache->raw_supply (HPPA_R0_REGNUM, &zero);
af5ca30d
NH
55 for (i = HPPA_R1_REGNUM, offset = 4; i <= HPPA_R31_REGNUM; i++, offset += 4)
56 {
57 if (regnum == -1 || regnum == i)
73e1c03f 58 regcache->raw_supply (i, regs + offset);
af5ca30d
NH
59 }
60
cbb6aada
MK
61 if (len >= HPPANBSD_SIZEOF_GREGS)
62 {
63 if (regnum == -1 || regnum == HPPA_IPSW_REGNUM)
73e1c03f 64 regcache->raw_supply (HPPA_IPSW_REGNUM, regs);
cbb6aada 65 if (regnum == -1 || regnum == HPPA_SAR_REGNUM)
73e1c03f 66 regcache->raw_supply (HPPA_SAR_REGNUM, regs + 32 * 4);
cbb6aada 67 if (regnum == -1 || regnum == HPPA_PCSQ_HEAD_REGNUM)
73e1c03f 68 regcache->raw_supply (HPPA_PCSQ_HEAD_REGNUM, regs + 33 * 4);
cbb6aada 69 if (regnum == -1 || regnum == HPPA_PCSQ_TAIL_REGNUM)
73e1c03f 70 regcache->raw_supply (HPPA_PCSQ_TAIL_REGNUM, regs + 34 * 4);
cbb6aada 71 if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
73e1c03f 72 regcache->raw_supply (HPPA_PCOQ_HEAD_REGNUM, regs + 35 * 4);
cbb6aada 73 if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
73e1c03f 74 regcache->raw_supply (HPPA_PCOQ_TAIL_REGNUM, regs + 36 * 4);
cbb6aada 75 if (regnum == -1 || regnum == HPPA_SR0_REGNUM)
73e1c03f 76 regcache->raw_supply (HPPA_SR0_REGNUM, regs + 37 * 4);
cbb6aada 77 if (regnum == -1 || regnum == HPPA_SR1_REGNUM)
73e1c03f 78 regcache->raw_supply (HPPA_SR1_REGNUM, regs + 38 * 4);
cbb6aada 79 if (regnum == -1 || regnum == HPPA_SR2_REGNUM)
73e1c03f 80 regcache->raw_supply (HPPA_SR2_REGNUM, regs + 39 * 4);
cbb6aada 81 if (regnum == -1 || regnum == HPPA_SR3_REGNUM)
73e1c03f 82 regcache->raw_supply (HPPA_SR3_REGNUM, regs + 40 * 4);
cbb6aada 83 if (regnum == -1 || regnum == HPPA_SR4_REGNUM)
73e1c03f 84 regcache->raw_supply (HPPA_SR4_REGNUM, regs + 41 * 4);
cbb6aada 85 if (regnum == -1 || regnum == HPPA_SR5_REGNUM)
73e1c03f 86 regcache->raw_supply (HPPA_SR5_REGNUM, regs + 42 * 4);
cbb6aada 87 if (regnum == -1 || regnum == HPPA_SR6_REGNUM)
73e1c03f 88 regcache->raw_supply (HPPA_SR6_REGNUM, regs + 43 * 4);
cbb6aada 89 if (regnum == -1 || regnum == HPPA_SR7_REGNUM)
73e1c03f 90 regcache->raw_supply (HPPA_SR7_REGNUM, regs + 44 * 4);
cbb6aada 91 if (regnum == -1 || regnum == HPPA_CR26_REGNUM)
73e1c03f 92 regcache->raw_supply (HPPA_CR26_REGNUM, regs + 45 * 4);
cbb6aada 93 if (regnum == -1 || regnum == HPPA_CR27_REGNUM)
73e1c03f 94 regcache->raw_supply (HPPA_CR27_REGNUM, regs + 46 * 4);
cbb6aada
MK
95 }
96 else
97 {
98 if (regnum == -1 || regnum == HPPA_SAR_REGNUM)
73e1c03f 99 regcache->raw_supply (HPPA_SAR_REGNUM, regs);
cbb6aada 100 if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
73e1c03f 101 regcache->raw_supply (HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4);
cbb6aada 102 if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
73e1c03f 103 regcache->raw_supply (HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4);
cbb6aada 104 }
af5ca30d
NH
105}
106
7c54a108
MK
107/* Supply register REGNUM from the buffer specified by FPREGS and LEN
108 in the floating-point register set REGSET to register cache
109 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
110
111static void
112hppaobsd_supply_fpregset (const struct regset *regset,
113 struct regcache *regcache,
114 int regnum, const void *fpregs, size_t len)
115{
9a3c8263 116 const gdb_byte *regs = (const gdb_byte *) fpregs;
7c54a108
MK
117 int i;
118
119 gdb_assert (len >= HPPAOBSD_SIZEOF_FPREGS);
120
121 for (i = HPPA_FP0_REGNUM; i <= HPPA_FP31R_REGNUM; i++)
122 {
123 if (regnum == i || regnum == -1)
73e1c03f 124 regcache->raw_supply (i, regs + (i - HPPA_FP0_REGNUM) * 4);
7c54a108
MK
125 }
126}
127
128/* OpenBSD/hppa register sets. */
af5ca30d 129
3ca7dae4 130static const struct regset hppaobsd_gregset =
af5ca30d
NH
131{
132 NULL,
f962539a
AA
133 hppaobsd_supply_gregset,
134 NULL,
135 REGSET_VARIABLE_SIZE
7c54a108
MK
136};
137
3ca7dae4 138static const struct regset hppaobsd_fpregset =
7c54a108
MK
139{
140 NULL,
141 hppaobsd_supply_fpregset
af5ca30d
NH
142};
143
50c5eb53 144/* Iterate over supported core file register note sections. */
af5ca30d 145
50c5eb53
AA
146static void
147hppaobsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
148 iterate_over_regset_sections_cb *cb,
149 void *cb_data,
150 const struct regcache *regcache)
af5ca30d 151{
a616bb94
AH
152 cb (".reg", HPPAOBSD_SIZEOF_GREGS, HPPAOBSD_SIZEOF_GREGS, &hppaobsd_gregset,
153 NULL, cb_data);
154 cb (".reg2", HPPAOBSD_SIZEOF_FPREGS, HPPAOBSD_SIZEOF_FPREGS,
155 &hppaobsd_fpregset, NULL, cb_data);
af5ca30d
NH
156}
157\f
158
63807e1d 159static void
af5ca30d
NH
160hppaobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
161{
162 /* Obviously OpenBSD is BSD-based. */
163 hppabsd_init_abi (info, gdbarch);
164
165 /* Core file support. */
50c5eb53
AA
166 set_gdbarch_iterate_over_regset_sections
167 (gdbarch, hppaobsd_iterate_over_regset_sections);
af5ca30d 168}
af5ca30d
NH
169
170void
171_initialize_hppabsd_tdep (void)
172{
1736a7bd 173 gdbarch_register_osabi (bfd_arch_hppa, 0, GDB_OSABI_OPENBSD,
af5ca30d
NH
174 hppaobsd_init_abi);
175}