Switch the license of all .c files to GPLv3.
[deliverable/binutils-gdb.git] / gdb / hppabsd-nat.c
CommitLineData
0e56aeaf
MK
1/* Native-dependent code for HP PA-RISC BSD's.
2
6aba47ca 3 Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
0e56aeaf
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
0e56aeaf
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/>. */
0e56aeaf
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
57cd0b54 23#include "target.h"
0e56aeaf
MK
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
29#include "hppa-tdep.h"
57cd0b54 30#include "inf-ptrace.h"
0e56aeaf
MK
31
32static int
33hppabsd_gregset_supplies_p (int regnum)
34{
35 return (regnum >= HPPA_R0_REGNUM && regnum <= HPPA_PCOQ_TAIL_REGNUM);
36}
37
20776c7d
MK
38static int
39hppabsd_fpregset_supplies_p (int regnum)
40{
41 return (regnum >= HPPA_FP0_REGNUM && regnum <= HPPA_FP31R_REGNUM);
42}
43
0e56aeaf
MK
44/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
45
46static void
47hppabsd_supply_gregset (struct regcache *regcache, const void *gregs)
48{
49 const char *regs = gregs;
50 int regnum;
51
52 for (regnum = HPPA_R1_REGNUM; regnum <= HPPA_R31_REGNUM; regnum++)
53 regcache_raw_supply (regcache, regnum, regs + regnum * 4);
54
55 regcache_raw_supply (regcache, HPPA_SAR_REGNUM, regs);
56 regcache_raw_supply (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4);
57 regcache_raw_supply (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4);
58}
59
20776c7d
MK
60/* Supply the floating-point registers stored in FPREGS to REGCACHE. */
61
62static void
63hppabsd_supply_fpregset (struct regcache *regcache, const void *fpregs)
64{
65 const char *regs = fpregs;
66 int regnum;
67
68 for (regnum = HPPA_FP0_REGNUM; regnum <= HPPA_FP31R_REGNUM;
69 regnum += 2, regs += 8)
70 {
71 regcache_raw_supply (regcache, regnum, regs);
72 regcache_raw_supply (regcache, regnum + 1, regs + 4);
73 }
74}
75
0e56aeaf
MK
76/* Collect the general-purpose registers from REGCACHE and store them
77 in GREGS. */
78
79static void
80hppabsd_collect_gregset (const struct regcache *regcache,
81 void *gregs, int regnum)
82{
83 char *regs = gregs;
84 int i;
85
86 for (i = HPPA_R1_REGNUM; i <= HPPA_R31_REGNUM; i++)
87 {
88 if (regnum == -1 || regnum == i)
89 regcache_raw_collect (regcache, i, regs + i * 4);
90 }
91
92 if (regnum == -1 || regnum == HPPA_SAR_REGNUM)
93 regcache_raw_collect (regcache, HPPA_SAR_REGNUM, regs);
94 if (regnum == -1 || regnum == HPPA_PCOQ_HEAD_REGNUM)
95 regcache_raw_collect (regcache, HPPA_PCOQ_HEAD_REGNUM, regs + 32 * 4);
96 if (regnum == -1 || regnum == HPPA_PCOQ_TAIL_REGNUM)
97 regcache_raw_collect (regcache, HPPA_PCOQ_TAIL_REGNUM, regs + 33 * 4);
98}
20776c7d
MK
99
100/* Collect the floating-point registers from REGCACHE and store them
101 in FPREGS. */
102
103static void
104hppabsd_collect_fpregset (struct regcache *regcache,
105 void *fpregs, int regnum)
106{
107 char *regs = fpregs;
108 int i;
109
110 for (i = HPPA_FP0_REGNUM; i <= HPPA_FP31R_REGNUM; i += 2, regs += 8)
111 {
112 if (regnum == -1 || regnum == i || regnum == i + 1)
113 {
114 regcache_raw_collect (regcache, i, regs);
115 regcache_raw_collect (regcache, i + 1, regs + 4);
116 }
117 }
118}
0e56aeaf
MK
119\f
120
121/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
122 for all registers (including the floating-point registers). */
123
57cd0b54 124static void
56be3814 125hppabsd_fetch_registers (struct regcache *regcache, int regnum)
0e56aeaf 126{
0e56aeaf
MK
127 if (regnum == -1 || hppabsd_gregset_supplies_p (regnum))
128 {
129 struct reg regs;
130
131 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 132 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 133 perror_with_name (_("Couldn't get registers"));
0e56aeaf
MK
134
135 hppabsd_supply_gregset (regcache, &regs);
136 }
20776c7d
MK
137
138 if (regnum == -1 || hppabsd_fpregset_supplies_p (regnum))
139 {
140 struct fpreg fpregs;
141
142 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
143 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
144 perror_with_name (_("Couldn't get floating point status"));
145
56be3814 146 hppabsd_supply_fpregset (regcache, &fpregs);
20776c7d 147 }
0e56aeaf
MK
148}
149
150/* Store register REGNUM back into the inferior. If REGNUM is -1, do
151 this for all registers (including the floating-point registers). */
152
57cd0b54 153static void
56be3814 154hppabsd_store_registers (struct regcache *regcache, int regnum)
0e56aeaf
MK
155{
156 if (regnum == -1 || hppabsd_gregset_supplies_p (regnum))
157 {
158 struct reg regs;
159
160 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 161 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 162 perror_with_name (_("Couldn't get registers"));
0e56aeaf 163
56be3814 164 hppabsd_collect_gregset (regcache, &regs, regnum);
0e56aeaf
MK
165
166 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 167 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 168 perror_with_name (_("Couldn't write registers"));
0e56aeaf 169 }
20776c7d
MK
170
171 if (regnum == -1 || hppabsd_fpregset_supplies_p (regnum))
172 {
173 struct fpreg fpregs;
174
175 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
176 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
177 perror_with_name (_("Couldn't get floating point status"));
178
56be3814 179 hppabsd_collect_fpregset (regcache, &fpregs, regnum);
20776c7d
MK
180
181 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
182 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
183 perror_with_name (_("Couldn't write floating point status"));
184 }
0e56aeaf 185}
57cd0b54
MK
186
187/* Provide a prototype to silence -Wmissing-prototypes. */
188void _initialize_hppabsd_nat (void);
189
190void
191_initialize_hppabsd_nat (void)
192{
193 struct target_ops *t;
194
195 /* Add in local overrides. */
196 t = inf_ptrace_target ();
197 t->to_fetch_registers = hppabsd_fetch_registers;
198 t->to_store_registers = hppabsd_store_registers;
199 add_target (t);
200}
This page took 0.217307 seconds and 4 git commands to generate.