Eliminate target_ops::to_xclose
[deliverable/binutils-gdb.git] / gdb / mips-nbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
e2882c85 3 Copyright (C) 2000-2018 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 29#include "mips-tdep.h"
03b62bbb 30#include "mips-nbsd-tdep.h"
c6d1029f
MK
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{
bcc0c096
SM
45 pid_t pid = ptid_get_pid (regcache_get_ptid (regcache));
46
ac7936df 47 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 48 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
49 {
50 struct reg regs;
51
bcc0c096 52 if (ptrace (PT_GETREGS, pid, (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 60 if (regno == -1
ac7936df 61 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
62 {
63 struct fpreg fpregs;
64
bcc0c096 65 if (ptrace (PT_GETFPREGS, pid, (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{
bcc0c096
SM
76 pid_t pid = ptid_get_pid (regcache_get_ptid (regcache));
77
ac7936df 78 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 79 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
80 {
81 struct reg regs;
82
bcc0c096 83 if (ptrace (PT_GETREGS, pid, (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 87
bcc0c096 88 if (ptrace (PT_SETREGS, pid, (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 95 if (regno == -1
ac7936df 96 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
97 {
98 struct fpreg fpregs;
99
bcc0c096 100 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 101 perror_with_name (_("Couldn't get floating point status"));
45888261 102
56be3814 103 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261 104
bcc0c096 105 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 106 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
107 }
108}
c6d1029f
MK
109
110void
111_initialize_mipsnbsd_nat (void)
112{
113 struct target_ops *t;
114
115 t = inf_ptrace_target ();
116 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers;
117 t->to_store_registers = mipsnbsd_store_inferior_registers;
118 add_target (t);
119}
This page took 1.45029 seconds and 4 git commands to generate.