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