x86: Use correct .reg-xstate section size
[deliverable/binutils-gdb.git] / gdb / armbsd-tdep.c
CommitLineData
47ccd048
MK
1/* Target-dependent code for ARM BSD's.
2
32d0add0 3 Copyright (C) 2006-2015 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
47ccd048
MK
25#include "arm-tdep.h"
26
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{
53 const gdb_byte *regs = fpregs;
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)
61 regcache_raw_supply (regcache, i, regs + armbsd_fpreg_offset (i));
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{
74 const gdb_byte *regs = gregs;
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)
82 regcache_raw_supply (regcache, i, regs + i * 4);
83 }
84
85 if (regnum == ARM_PS_REGNUM || regnum == -1)
86 regcache_raw_supply (regcache, i, regs + 16 * 4);
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,
101 armbsd_supply_gregset
102};
103
3ca7dae4 104static const struct regset armbsd_fpregset =
47ccd048
MK
105{
106 NULL,
107 armbsd_supply_fpregset
108};
109
ed09174e 110/* Iterate over supported core file register note sections. */
47ccd048 111
ed09174e
AA
112void
113armbsd_iterate_over_regset_sections (struct gdbarch *gdbarch,
114 iterate_over_regset_sections_cb *cb,
115 void *cb_data,
116 const struct regcache *regcache)
47ccd048 117{
ed09174e
AA
118 cb (".reg", ARMBSD_SIZEOF_GREGS, &armbsd_gregset, NULL, cb_data);
119 cb (".reg2", ARMBSD_SIZEOF_FPREGS, &armbsd_fpregset, NULL, cb_data);
47ccd048 120}
This page took 0.818375 seconds and 4 git commands to generate.