[gdb/testsuite] Fix gdb.threads/watchpoint-fork.exp race
[deliverable/binutils-gdb.git] / gdb / mips64-obsd-nat.c
CommitLineData
abc08782
MK
1/* Native-dependent code for OpenBSD/mips64.
2
b811d2c2 3 Copyright (C) 2004-2020 Free Software Foundation, Inc.
abc08782
MK
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
abc08782
MK
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/>. */
abc08782
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
23#include "target.h"
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
366e93e8 29#include "mips-tdep.h"
abc08782 30#include "inf-ptrace.h"
96c70aba 31#include "obsd-nat.h"
abc08782 32
366e93e8
MK
33/* Shorthand for some register numbers used below. */
34#define MIPS_PC_REGNUM MIPS_EMBED_PC_REGNUM
35#define MIPS_FP0_REGNUM MIPS_EMBED_FP0_REGNUM
36#define MIPS_FSR_REGNUM MIPS_EMBED_FP0_REGNUM + 32
abc08782 37
f6ac5f3d
PA
38struct mips64_obsd_nat_target final : public obsd_nat_target
39{
40 void fetch_registers (struct regcache *, int) override;
41 void store_registers (struct regcache *, int) override;
42};
43
44static mips64_obsd_nat_target the_mips64_obsd_nat_target;
45
abc08782
MK
46/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
47
48static void
49mips64obsd_supply_gregset (struct regcache *regcache, const void *gregs)
50{
51 const char *regs = gregs;
52 int regnum;
53
366e93e8 54 for (regnum = MIPS_ZERO_REGNUM; regnum <= MIPS_PC_REGNUM; regnum++)
73e1c03f 55 regcache->raw_supply (regnum, regs + regnum * 8);
366e93e8
MK
56
57 for (regnum = MIPS_FP0_REGNUM; regnum <= MIPS_FSR_REGNUM; regnum++)
73e1c03f 58 regcache->raw_supply (regnum, regs + (regnum + 2) * 8);
abc08782
MK
59}
60
61/* Collect the general-purpose registers from REGCACHE and store them
62 in GREGS. */
63
64static void
65mips64obsd_collect_gregset (const struct regcache *regcache,
66 void *gregs, int regnum)
67{
68 char *regs = gregs;
69 int i;
70
366e93e8 71 for (i = MIPS_ZERO_REGNUM; i <= MIPS_PC_REGNUM; i++)
abc08782
MK
72 {
73 if (regnum == -1 || regnum == i)
34a79281 74 regcache->raw_collect (i, regs + i * 8);
abc08782 75 }
366e93e8
MK
76
77 for (i = MIPS_FP0_REGNUM; i <= MIPS_FSR_REGNUM; i++)
78 {
79 if (regnum == -1 || regnum == i)
34a79281 80 regcache->raw_collect (i, regs + (i + 2) * 8);
366e93e8 81 }
abc08782
MK
82}
83\f
84
85/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
86 for all registers. */
87
f6ac5f3d
PA
88void
89mips64_obsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
abc08782
MK
90{
91 struct reg regs;
e99b03dc 92 pid_t pid = regcache->ptid ().pid ();
abc08782 93
bcc0c096 94 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 95 perror_with_name (_("Couldn't get registers"));
abc08782 96
56be3814 97 mips64obsd_supply_gregset (regcache, &regs);
abc08782
MK
98}
99
100/* Store register REGNUM back into the inferior. If REGNUM is -1, do
101 this for all registers. */
102
103static void
f6ac5f3d 104mips64_obsd_nat_target::store_registers (struct regcache *regcache, int regnum)
abc08782
MK
105{
106 struct reg regs;
e99b03dc 107 pid_t pid = regcache->ptid ().pid ();
abc08782 108
bcc0c096 109 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 110 perror_with_name (_("Couldn't get registers"));
abc08782 111
56be3814 112 mips64obsd_collect_gregset (regcache, &regs, regnum);
abc08782 113
bcc0c096 114 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 115 perror_with_name (_("Couldn't write registers"));
abc08782 116}
abc08782 117
6c265988 118void _initialize_mips64obsd_nat ();
abc08782 119void
6c265988 120_initialize_mips64obsd_nat ()
abc08782 121{
d9f719f1 122 add_inf_child_target (&the_mips64_obsd_nat_target);
abc08782 123}
This page took 1.590247 seconds and 4 git commands to generate.