]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mipsnbsd-nat.c
2011-01-08 Michael Snyder <msnyder@vmware.com>
[thirdparty/binutils-gdb.git] / gdb / mipsnbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
7b6bb8da 3 Copyright (C) 2000, 2001, 2002, 2004, 2007, 2008, 2009, 2010, 2011
9b254dd1 4 Free Software Foundation, Inc.
45888261
JT
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
45888261
JT
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/>. */
45888261
JT
20
21#include "defs.h"
22#include "inferior.h"
23#include "regcache.h"
c6d1029f 24#include "target.h"
45888261
JT
25
26#include <sys/types.h>
27#include <sys/ptrace.h>
28#include <machine/reg.h>
29
c6d1029f
MK
30#include "mips-tdep.h"
31#include "mipsnbsd-tdep.h"
32#include "inf-ptrace.h"
33
45888261
JT
34/* Determine if PT_GETREGS fetches this register. */
35static int
74ed0bb4 36getregs_supplies (struct gdbarch *gdbarch, int regno)
45888261 37{
3e8c568d 38 return ((regno) >= MIPS_ZERO_REGNUM
74ed0bb4 39 && (regno) <= gdbarch_pc_regnum (gdbarch));
45888261
JT
40}
41
c6d1029f 42static void
28439f5e
PA
43mipsnbsd_fetch_inferior_registers (struct target_ops *ops,
44 struct regcache *regcache, int regno)
45888261 45{
74ed0bb4
MD
46 struct gdbarch *gdbarch = get_regcache_arch (regcache);
47 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
48 {
49 struct reg regs;
50
51 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 52 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 53 perror_with_name (_("Couldn't get registers"));
45888261 54
56be3814 55 mipsnbsd_supply_reg (regcache, (char *) &regs, regno);
45888261
JT
56 if (regno != -1)
57 return;
58 }
59
025bb325
MS
60 if (regno == -1
61 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
62 {
63 struct fpreg fpregs;
64
65 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 66 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 67 perror_with_name (_("Couldn't get floating point status"));
45888261 68
56be3814 69 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
70 }
71}
72
c6d1029f 73static void
28439f5e
PA
74mipsnbsd_store_inferior_registers (struct target_ops *ops,
75 struct regcache *regcache, int regno)
45888261 76{
74ed0bb4
MD
77 struct gdbarch *gdbarch = get_regcache_arch (regcache);
78 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
79 {
80 struct reg regs;
81
82 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 83 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 84 perror_with_name (_("Couldn't get registers"));
45888261 85
56be3814 86 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261
JT
87
88 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 89 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 90 perror_with_name (_("Couldn't write registers"));
45888261
JT
91
92 if (regno != -1)
93 return;
94 }
95
025bb325
MS
96 if (regno == -1
97 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
98 {
99 struct fpreg fpregs;
100
101 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 102 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 103 perror_with_name (_("Couldn't get floating point status"));
45888261 104
56be3814 105 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
106
107 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 108 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 109 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
110 }
111}
c6d1029f
MK
112\f
113
114/* Provide a prototype to silence -Wmissing-prototypes. */
115void _initialize_mipsnbsd_nat (void);
116
117void
118_initialize_mipsnbsd_nat (void)
119{
120 struct target_ops *t;
121
122 t = inf_ptrace_target ();
123 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers;
124 t->to_store_registers = mipsnbsd_store_inferior_registers;
125 add_target (t);
126}