]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mips-netbsd-nat.c
configure: require libzstd >= 1.4.0
[thirdparty/binutils-gdb.git] / gdb / mips-netbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
4a94e368 3 Copyright (C) 2000-2022 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 19
8110f842
KR
20/* We define this to get types like register_t. */
21#define _KERNTYPES
45888261
JT
22#include "defs.h"
23#include "inferior.h"
24#include "regcache.h"
c6d1029f 25#include "target.h"
45888261
JT
26
27#include <sys/types.h>
28#include <sys/ptrace.h>
29#include <machine/reg.h>
30
c6d1029f 31#include "mips-tdep.h"
1b71cfcf 32#include "mips-netbsd-tdep.h"
8b8b05a4 33#include "netbsd-nat.h"
c6d1029f
MK
34#include "inf-ptrace.h"
35
8b8b05a4 36class mips_nbsd_nat_target final : public nbsd_nat_target
f6ac5f3d
PA
37{
38 void fetch_registers (struct regcache *, int) override;
39 void store_registers (struct regcache *, int) override;
40};
41
42static mips_nbsd_nat_target the_mips_nbsd_nat_target;
43
45888261
JT
44/* Determine if PT_GETREGS fetches this register. */
45static int
74ed0bb4 46getregs_supplies (struct gdbarch *gdbarch, int regno)
45888261 47{
3e8c568d 48 return ((regno) >= MIPS_ZERO_REGNUM
74ed0bb4 49 && (regno) <= gdbarch_pc_regnum (gdbarch));
45888261
JT
50}
51
f6ac5f3d
PA
52void
53mips_nbsd_nat_target::fetch_registers (struct regcache *regcache, int regno)
45888261 54{
e99b03dc 55 pid_t pid = regcache->ptid ().pid ();
bcc0c096 56
ac7936df 57 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 58 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
59 {
60 struct reg regs;
61
bcc0c096 62 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 63 perror_with_name (_("Couldn't get registers"));
45888261 64
56be3814 65 mipsnbsd_supply_reg (regcache, (char *) &regs, regno);
45888261
JT
66 if (regno != -1)
67 return;
68 }
69
025bb325 70 if (regno == -1
ac7936df 71 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
72 {
73 struct fpreg fpregs;
74
bcc0c096 75 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 76 perror_with_name (_("Couldn't get floating point status"));
45888261 77
56be3814 78 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
79 }
80}
81
f6ac5f3d
PA
82void
83mips_nbsd_nat_target::store_registers (struct regcache *regcache, int regno)
45888261 84{
e99b03dc 85 pid_t pid = regcache->ptid ().pid ();
bcc0c096 86
ac7936df 87 struct gdbarch *gdbarch = regcache->arch ();
74ed0bb4 88 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
89 {
90 struct reg regs;
91
bcc0c096 92 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 93 perror_with_name (_("Couldn't get registers"));
45888261 94
56be3814 95 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261 96
bcc0c096 97 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 98 perror_with_name (_("Couldn't write registers"));
45888261
JT
99
100 if (regno != -1)
101 return;
102 }
103
025bb325 104 if (regno == -1
ac7936df 105 || regno >= gdbarch_fp0_regnum (regcache->arch ()))
45888261
JT
106 {
107 struct fpreg fpregs;
108
bcc0c096 109 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 110 perror_with_name (_("Couldn't get floating point status"));
45888261 111
56be3814 112 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261 113
bcc0c096 114 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 115 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
116 }
117}
c6d1029f 118
6c265988 119void _initialize_mipsnbsd_nat ();
c6d1029f 120void
6c265988 121_initialize_mipsnbsd_nat ()
c6d1029f 122{
d9f719f1 123 add_inf_child_target (&the_mips_nbsd_nat_target);
c6d1029f 124}