]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/arm-bsd-tdep.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / gdb / arm-bsd-tdep.c
CommitLineData
47ccd048
MK
1/* Target-dependent code for ARM BSD's.
2
b811d2c2 3 Copyright (C) 2006-2020 Free Software Foundation, Inc.
47ccd048
MK
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
47ccd048
MK
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
47ccd048
MK
19
20#include "defs.h"
21#include "osabi.h"
22#include "regcache.h"
23#include "regset.h"
24
4de283e4
TT
25#include "arm-tdep.h"
26
47ccd048
MK
27/* Core file support. */
28
29/* Sizeof `struct reg' in <machine/reg.h>. */
30#define ARMBSD_SIZEOF_GREGS (17 * 4)
31
32/* Sizeof `struct fpreg' in <machine/reg.h. */
33#define ARMBSD_SIZEOF_FPREGS ((1 + (8 * 3)) * 4)
34
63807e1d 35static int
47ccd048
MK
36armbsd_fpreg_offset (int regnum)
37{
38 if (regnum == ARM_FPS_REGNUM)
39 return 0;
40
41 return 4 + (regnum - ARM_F0_REGNUM) * 12;
42}
43
44/* Supply register REGNUM from the buffer specified by FPREGS and LEN
45 in the floating-point register set REGSET to register cache
46 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
47
48static void
49armbsd_supply_fpregset (const struct regset *regset,
50 struct regcache *regcache,
51 int regnum, const void *fpregs, size_t len)
52{
9a3c8263 53 const gdb_byte *regs = (const gdb_byte *) fpregs;
47ccd048
MK
54 int i;
55
56 gdb_assert (len >= ARMBSD_SIZEOF_FPREGS);
57
58 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
59 {
60 if (regnum == i || regnum == -1)
73e1c03f 61 regcache->raw_supply (i, regs + armbsd_fpreg_offset (i));
47ccd048
MK
62 }
63}
64
65/* Supply register REGNUM from the buffer specified by GREGS and LEN
66 in the general-purpose register set REGSET to register cache
67 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
68
69static void
70armbsd_supply_gregset (const struct regset *regset,
71 struct regcache *regcache,
72 int regnum, const void *gregs, size_t len)
73{
9a3c8263 74 const gdb_byte *regs = (const gdb_byte *) gregs;
47ccd048
MK
75 int i;
76
77 gdb_assert (len >= ARMBSD_SIZEOF_GREGS);
78
79 for (i = ARM_A1_REGNUM; i <= ARM_PC_REGNUM; i++)
80 {
81 if (regnum == i || regnum == -1)
73e1c03f 82 regcache->raw_supply (i, regs + i * 4);
47ccd048
MK
83 }
84
85 if (regnum == ARM_PS_REGNUM || regnum == -1)
73e1c03f 86 regcache->raw_supply (i, regs + 16 * 4);
47ccd048
MK
87
88 if (len >= ARMBSD_SIZEOF_GREGS + ARMBSD_SIZEOF_FPREGS)
89 {
90 regs += ARMBSD_SIZEOF_GREGS;
91 len -= ARMBSD_SIZEOF_GREGS;
92 armbsd_supply_fpregset (regset, regcache, regnum, regs, len);
93 }
94}
95
96/* ARM register sets. */
97
3ca7dae4 98static const struct regset armbsd_gregset =
47ccd048
MK
99{
100 NULL,
f962539a
AA
101 armbsd_supply_gregset,
102 NULL,
103 REGSET_VARIABLE_SIZE
47ccd048
MK
104};
105
3ca7dae4 106static const struct regset armbsd_fpregset =
47ccd048
MK
107{
108 NULL,
109 armbsd_supply_fpregset
110};
111
ed09174e 112/* Iterate over supported core file register note sections. */
47ccd048 113
ed09174e
AA
114void
115armbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
116 iterate_over_regset_sections_cb *cb,
117 void *cb_data,
118 const struct regcache *regcache)
47ccd048 119{
a616bb94
AH
120 cb (".reg", ARMBSD_SIZEOF_GREGS, ARMBSD_SIZEOF_GREGS, &armbsd_gregset, NULL,
121 cb_data);
122 cb (".reg2", ARMBSD_SIZEOF_FPREGS, ARMBSD_SIZEOF_FPREGS, &armbsd_fpregset,
123 NULL, cb_data);
47ccd048 124}