]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mips-nbsd-nat.c
[binutils, ARM, 4/16] BF insns infrastructure with array of relocs in struct arm_it
[thirdparty/binutils-gdb.git] / gdb / mips-nbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
42a4f53d 3 Copyright (C) 2000-2019 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
f6ac5f3d
PA
33class mips_nbsd_nat_target final : public inf_ptrace_target
34{
35 void fetch_registers (struct regcache *, int) override;
36 void store_registers (struct regcache *, int) override;
37};
38
39static mips_nbsd_nat_target the_mips_nbsd_nat_target;
40
45888261
JT
41/* Determine if PT_GETREGS fetches this register. */
42static int
74ed0bb4 43getregs_supplies (struct gdbarch *gdbarch, int regno)
45888261 44{
3e8c568d 45 return ((regno) >= MIPS_ZERO_REGNUM
74ed0bb4 46 && (regno) <= gdbarch_pc_regnum (gdbarch));
45888261
JT
47}
48
f6ac5f3d
PA
49void
50mips_nbsd_nat_target::fetch_registers (struct regcache *regcache, int regno)
45888261 51{
e99b03dc 52 pid_t pid = regcache->ptid ().pid ();
bcc0c096 53
ac7936df 54 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 55 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
56 {
57 struct reg regs;
58
bcc0c096 59 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 60 perror_with_name (_("Couldn't get registers"));
45888261 61
56be3814 62 mipsnbsd_supply_reg (regcache, (char *) &regs, regno);
45888261
JT
63 if (regno != -1)
64 return;
65 }
66
025bb325 67 if (regno == -1
ac7936df 68 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
69 {
70 struct fpreg fpregs;
71
bcc0c096 72 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 73 perror_with_name (_("Couldn't get floating point status"));
45888261 74
56be3814 75 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
76 }
77}
78
f6ac5f3d
PA
79void
80mips_nbsd_nat_target::store_registers (struct regcache *regcache, int regno)
45888261 81{
e99b03dc 82 pid_t pid = regcache->ptid ().pid ();
bcc0c096 83
ac7936df 84 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 85 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
86 {
87 struct reg regs;
88
bcc0c096 89 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 90 perror_with_name (_("Couldn't get registers"));
45888261 91
56be3814 92 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261 93
bcc0c096 94 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 95 perror_with_name (_("Couldn't write registers"));
45888261
JT
96
97 if (regno != -1)
98 return;
99 }
100
025bb325 101 if (regno == -1
ac7936df 102 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
103 {
104 struct fpreg fpregs;
105
bcc0c096 106 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 107 perror_with_name (_("Couldn't get floating point status"));
45888261 108
56be3814 109 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261 110
bcc0c096 111 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 112 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
113 }
114}
c6d1029f
MK
115
116void
117_initialize_mipsnbsd_nat (void)
118{
d9f719f1 119 add_inf_child_target (&the_mips_nbsd_nat_target);
c6d1029f 120}