Inherit sh_nbsd_nat_target from nbsd_nat_target
[deliverable/binutils-gdb.git] / gdb / sh-nbsd-nat.c
CommitLineData
bd372731
MK
1/* Native-dependent code for NetBSD/sh.
2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
9f8e0089 4
13a38d45
JT
5 Contributed by Wasabi Systems, Inc.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
13a38d45
JT
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
13a38d45 21
bd372731
MK
22#include "defs.h"
23#include "inferior.h"
24
13a38d45
JT
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
97a5b208 29#include "sh-tdep.h"
bd372731 30#include "inf-ptrace.h"
98097623 31#include "nbsd-nat.h"
4e3269e3
UW
32#include "regcache.h"
33
98097623 34struct sh_nbsd_nat_target final : public nbsd_nat_target
f6ac5f3d
PA
35{
36 void fetch_registers (struct regcache *, int) override;
37 void store_registers (struct regcache *, int) override;
38};
39
40static sh_nbsd_nat_target the_sh_nbsd_nat_target;
13a38d45 41
c378eb4e 42/* Determine if PT_GETREGS fetches this register. */
40a6adc1 43#define GETREGS_SUPPLIES(gdbarch, regno) \
13a38d45 44 (((regno) >= R0_REGNUM && (regno) <= (R0_REGNUM + 15)) \
40a6adc1 45|| (regno) == gdbarch_pc_regnum (gdbarch) || (regno) == PR_REGNUM \
13a38d45
JT
46|| (regno) == MACH_REGNUM || (regno) == MACL_REGNUM \
47|| (regno) == SR_REGNUM)
48
c9ac0a72
AS
49/* Sizeof `struct reg' in <machine/reg.h>. */
50#define SHNBSD_SIZEOF_GREGS (21 * 4)
51
f6ac5f3d
PA
52void
53sh_nbsd_nat_target::fetch_registers (struct regcache *regcache, int regno)
13a38d45 54{
e99b03dc 55 pid_t pid = regcache->ptid ().pid ();
bcc0c096 56
ac7936df 57 if (regno == -1 || GETREGS_SUPPLIES (regcache->arch (), regno))
13a38d45
JT
58 {
59 struct reg inferior_registers;
60
bcc0c096 61 if (ptrace (PT_GETREGS, pid,
dfeafa2f 62 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 63 perror_with_name (_("Couldn't get registers"));
13a38d45 64
c9ac0a72
AS
65 sh_corefile_supply_regset (&sh_corefile_gregset, regcache, regno,
66 (char *) &inferior_registers,
67 SHNBSD_SIZEOF_GREGS);
13a38d45
JT
68
69 if (regno != -1)
70 return;
71 }
72}
73
f6ac5f3d
PA
74void
75sh_nbsd_nat_target::store_registers (struct regcache *regcache, int regno)
13a38d45 76{
e99b03dc 77 pid_t pid = regcache->ptid ().pid ();
bcc0c096 78
ac7936df 79 if (regno == -1 || GETREGS_SUPPLIES (regcache->arch (), regno))
13a38d45
JT
80 {
81 struct reg inferior_registers;
82
bcc0c096 83 if (ptrace (PT_GETREGS, pid,
dfeafa2f 84 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 85 perror_with_name (_("Couldn't get registers"));
13a38d45 86
c9ac0a72
AS
87 sh_corefile_collect_regset (&sh_corefile_gregset, regcache, regno,
88 (char *) &inferior_registers,
89 SHNBSD_SIZEOF_GREGS);
13a38d45 90
bcc0c096 91 if (ptrace (PT_SETREGS, pid,
dfeafa2f 92 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 93 perror_with_name (_("Couldn't set registers"));
13a38d45
JT
94
95 if (regno != -1)
96 return;
97 }
98}
bd372731 99
6c265988 100void _initialize_shnbsd_nat ();
bd372731 101void
6c265988 102_initialize_shnbsd_nat ()
bd372731 103{
d9f719f1 104 add_inf_child_target (&the_sh_nbsd_nat_target);
bd372731 105}
This page took 1.846682 seconds and 4 git commands to generate.