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