gdb/
[deliverable/binutils-gdb.git] / gdb / alphabsd-nat.c
CommitLineData
448628fe 1/* Native-dependent code for Alpha BSD's.
07681759 2
4c38e0a4 3 Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4816ec69 4 Free Software Foundation, Inc.
448628fe
MK
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
448628fe
MK
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
448628fe
MK
20
21#include "defs.h"
22#include "inferior.h"
4e052eda 23#include "regcache.h"
448628fe 24
dc129d82 25#include "alpha-tdep.h"
12bcb0fe 26#include "alphabsd-tdep.h"
0d6e4ad7 27#include "inf-ptrace.h"
dc129d82 28
448628fe
MK
29#include <sys/types.h>
30#include <sys/ptrace.h>
31#include <machine/reg.h>
32
33#ifdef HAVE_SYS_PROCFS_H
34#include <sys/procfs.h>
35#endif
36
37#ifndef HAVE_GREGSET_T
38typedef struct reg gregset_t;
39#endif
40
12bcb0fe
JT
41#ifndef HAVE_FPREGSET_T
42typedef struct fpreg fpregset_t;
43#endif
448628fe
MK
44
45#include "gregset.h"
46
12bcb0fe
JT
47/* Provide *regset() wrappers around the generic Alpha BSD register
48 supply/fill routines. */
448628fe
MK
49
50void
7f7fe91e 51supply_gregset (struct regcache *regcache, const gregset_t *gregsetp)
448628fe 52{
7f7fe91e 53 alphabsd_supply_reg (regcache, (const char *) gregsetp, -1);
448628fe
MK
54}
55
448628fe 56void
7f7fe91e 57fill_gregset (const struct regcache *regcache, gregset_t *gregsetp, int regno)
448628fe 58{
7f7fe91e 59 alphabsd_fill_reg (regcache, (char *) gregsetp, regno);
448628fe
MK
60}
61
448628fe 62void
7f7fe91e 63supply_fpregset (struct regcache *regcache, const fpregset_t *fpregsetp)
448628fe 64{
7f7fe91e 65 alphabsd_supply_fpreg (regcache, (const char *) fpregsetp, -1);
448628fe
MK
66}
67
448628fe 68void
7f7fe91e 69fill_fpregset (const struct regcache *regcache, fpregset_t *fpregsetp, int regno)
448628fe 70{
7f7fe91e 71 alphabsd_fill_fpreg (regcache, (char *) fpregsetp, regno);
448628fe 72}
12bcb0fe 73\f
e771a871
JT
74/* Determine if PT_GETREGS fetches this register. */
75
76static int
77getregs_supplies (int regno)
78{
dc129d82 79 return ((regno >= ALPHA_V0_REGNUM && regno <= ALPHA_ZERO_REGNUM)
07681759 80 || regno >= ALPHA_PC_REGNUM);
e771a871
JT
81}
82
448628fe
MK
83/* Fetch register REGNO from the inferior. If REGNO is -1, do this
84 for all registers (including the floating point registers). */
85
0d6e4ad7 86static void
28439f5e
PA
87alphabsd_fetch_inferior_registers (struct target_ops *ops,
88 struct regcache *regcache, int regno)
448628fe 89{
e771a871
JT
90 if (regno == -1 || getregs_supplies (regno))
91 {
12bcb0fe 92 struct reg gregs;
e771a871
JT
93
94 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 95 (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
edefbb7c 96 perror_with_name (_("Couldn't get registers"));
448628fe 97
56be3814 98 alphabsd_supply_reg (regcache, (char *) &gregs, regno);
e771a871
JT
99 if (regno != -1)
100 return;
101 }
448628fe 102
600d293e 103 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
448628fe 104 {
12bcb0fe 105 struct fpreg fpregs;
448628fe 106
39f77062 107 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 108 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 109 perror_with_name (_("Couldn't get floating point status"));
448628fe 110
56be3814 111 alphabsd_supply_fpreg (regcache, (char *) &fpregs, regno);
448628fe 112 }
448628fe
MK
113}
114
115/* Store register REGNO back into the inferior. If REGNO is -1, do
116 this for all registers (including the floating point registers). */
117
0d6e4ad7 118static void
28439f5e
PA
119alphabsd_store_inferior_registers (struct target_ops *ops,
120 struct regcache *regcache, int regno)
448628fe 121{
e771a871
JT
122 if (regno == -1 || getregs_supplies (regno))
123 {
12bcb0fe 124 struct reg gregs;
e771a871 125 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 126 (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
edefbb7c 127 perror_with_name (_("Couldn't get registers"));
e771a871 128
56be3814 129 alphabsd_fill_reg (regcache, (char *) &gregs, regno);
448628fe 130
e771a871 131 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 132 (PTRACE_TYPE_ARG3) &gregs, 0) == -1)
edefbb7c 133 perror_with_name (_("Couldn't write registers"));
448628fe 134
e771a871
JT
135 if (regno != -1)
136 return;
137 }
448628fe 138
600d293e 139 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
448628fe 140 {
12bcb0fe 141 struct fpreg fpregs;
448628fe 142
39f77062 143 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 144 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 145 perror_with_name (_("Couldn't get floating point status"));
448628fe 146
56be3814 147 alphabsd_fill_fpreg (regcache, (char *) &fpregs, regno);
448628fe 148
39f77062 149 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 150 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
edefbb7c 151 perror_with_name (_("Couldn't write floating point status"));
448628fe
MK
152 }
153}
4816ec69
MK
154\f
155
156/* Support for debugging kernel virtual memory images. */
157
158#include <sys/types.h>
159#include <sys/signal.h>
160#include <machine/pcb.h>
161
162#include "bsd-kvm.h"
163
164static int
165alphabsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
166{
167 int regnum;
168
169 /* The following is true for OpenBSD 3.9:
170
171 The pcb contains the register state at the context switch inside
172 cpu_switch(). */
173
174 /* The stack pointer shouldn't be zero. */
175 if (pcb->pcb_hw.apcb_ksp == 0)
176 return 0;
177
178 regcache_raw_supply (regcache, ALPHA_SP_REGNUM, &pcb->pcb_hw.apcb_ksp);
179
180 for (regnum = ALPHA_S0_REGNUM; regnum < ALPHA_A0_REGNUM; regnum++)
181 regcache_raw_supply (regcache, regnum,
182 &pcb->pcb_context[regnum - ALPHA_S0_REGNUM]);
183 regcache_raw_supply (regcache, ALPHA_RA_REGNUM, &pcb->pcb_context[7]);
184
185 return 1;
186}
187\f
0d6e4ad7
MK
188
189/* Provide a prototype to silence -Wmissing-prototypes. */
190void _initialize_alphabsd_nat (void);
191
192void
193_initialize_alphabsd_nat (void)
194{
195 struct target_ops *t;
196
197 t = inf_ptrace_target ();
198 t->to_fetch_registers = alphabsd_fetch_inferior_registers;
199 t->to_store_registers = alphabsd_store_inferior_registers;
200 add_target (t);
4816ec69
MK
201
202 /* Support debugging kernel virtual memory images. */
203 bsd_kvm_add_target (alphabsd_supply_pcb);
0d6e4ad7 204}
This page took 0.650615 seconds and 4 git commands to generate.