]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/armbsd-tdep.c
bfd/
[thirdparty/binutils-gdb.git] / gdb / armbsd-tdep.c
CommitLineData
47ccd048
MK
1/* Target-dependent code for ARM BSD's.
2
4c38e0a4 3 Copyright (C) 2006, 2007, 2008, 2009, 2010 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
25#include "gdb_assert.h"
26#include "gdb_string.h"
27
28#include "arm-tdep.h"
29
30/* Core file support. */
31
32/* Sizeof `struct reg' in <machine/reg.h>. */
33#define ARMBSD_SIZEOF_GREGS (17 * 4)
34
35/* Sizeof `struct fpreg' in <machine/reg.h. */
36#define ARMBSD_SIZEOF_FPREGS ((1 + (8 * 3)) * 4)
37
63807e1d 38static int
47ccd048
MK
39armbsd_fpreg_offset (int regnum)
40{
41 if (regnum == ARM_FPS_REGNUM)
42 return 0;
43
44 return 4 + (regnum - ARM_F0_REGNUM) * 12;
45}
46
47/* Supply register REGNUM from the buffer specified by FPREGS and LEN
48 in the floating-point register set REGSET to register cache
49 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
50
51static void
52armbsd_supply_fpregset (const struct regset *regset,
53 struct regcache *regcache,
54 int regnum, const void *fpregs, size_t len)
55{
56 const gdb_byte *regs = fpregs;
57 int i;
58
59 gdb_assert (len >= ARMBSD_SIZEOF_FPREGS);
60
61 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
62 {
63 if (regnum == i || regnum == -1)
64 regcache_raw_supply (regcache, i, regs + armbsd_fpreg_offset (i));
65 }
66}
67
68/* Supply register REGNUM from the buffer specified by GREGS and LEN
69 in the general-purpose register set REGSET to register cache
70 REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
71
72static void
73armbsd_supply_gregset (const struct regset *regset,
74 struct regcache *regcache,
75 int regnum, const void *gregs, size_t len)
76{
77 const gdb_byte *regs = gregs;
78 int i;
79
80 gdb_assert (len >= ARMBSD_SIZEOF_GREGS);
81
82 for (i = ARM_A1_REGNUM; i <= ARM_PC_REGNUM; i++)
83 {
84 if (regnum == i || regnum == -1)
85 regcache_raw_supply (regcache, i, regs + i * 4);
86 }
87
88 if (regnum == ARM_PS_REGNUM || regnum == -1)
89 regcache_raw_supply (regcache, i, regs + 16 * 4);
90
91 if (len >= ARMBSD_SIZEOF_GREGS + ARMBSD_SIZEOF_FPREGS)
92 {
93 regs += ARMBSD_SIZEOF_GREGS;
94 len -= ARMBSD_SIZEOF_GREGS;
95 armbsd_supply_fpregset (regset, regcache, regnum, regs, len);
96 }
97}
98
99/* ARM register sets. */
100
101static struct regset armbsd_gregset =
102{
103 NULL,
104 armbsd_supply_gregset
105};
106
107static struct regset armbsd_fpregset =
108{
109 NULL,
110 armbsd_supply_fpregset
111};
112
113/* Return the appropriate register set for the core section identified
114 by SECT_NAME and SECT_SIZE. */
115
116const struct regset *
117armbsd_regset_from_core_section (struct gdbarch *gdbarch,
118 const char *sect_name, size_t sect_size)
119{
120 if (strcmp (sect_name, ".reg") == 0 && sect_size >= ARMBSD_SIZEOF_GREGS)
121 return &armbsd_gregset;
122
123 if (strcmp (sect_name, ".reg2") == 0 && sect_size >= ARMBSD_SIZEOF_FPREGS)
124 return &armbsd_fpregset;
125
126 return NULL;
127}