Implement '-target-detach pid'.
[deliverable/binutils-gdb.git] / gdb / mipsnbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
9b254dd1
DJ
3 Copyright (C) 2000, 2001, 2002, 2004, 2007, 2008
4 Free Software Foundation, Inc.
45888261
JT
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
45888261
JT
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
45888261
JT
20
21#include "defs.h"
22#include "inferior.h"
23#include "regcache.h"
c6d1029f 24#include "target.h"
45888261
JT
25
26#include <sys/types.h>
27#include <sys/ptrace.h>
28#include <machine/reg.h>
29
c6d1029f
MK
30#include "mips-tdep.h"
31#include "mipsnbsd-tdep.h"
32#include "inf-ptrace.h"
33
45888261
JT
34/* Determine if PT_GETREGS fetches this register. */
35static int
74ed0bb4 36getregs_supplies (struct gdbarch *gdbarch, int regno)
45888261 37{
3e8c568d 38 return ((regno) >= MIPS_ZERO_REGNUM
74ed0bb4 39 && (regno) <= gdbarch_pc_regnum (gdbarch));
45888261
JT
40}
41
c6d1029f 42static void
56be3814 43mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
45888261 44{
74ed0bb4
MD
45 struct gdbarch *gdbarch = get_regcache_arch (regcache);
46 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
47 {
48 struct reg regs;
49
50 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 51 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 52 perror_with_name (_("Couldn't get registers"));
45888261 53
56be3814 54 mipsnbsd_supply_reg (regcache, (char *) &regs, regno);
45888261
JT
55 if (regno != -1)
56 return;
57 }
58
2eb4d78b 59 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
60 {
61 struct fpreg fpregs;
62
63 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 64 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 65 perror_with_name (_("Couldn't get floating point status"));
45888261 66
56be3814 67 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
68 }
69}
70
c6d1029f 71static void
56be3814 72mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno)
45888261 73{
74ed0bb4
MD
74 struct gdbarch *gdbarch = get_regcache_arch (regcache);
75 if (regno == -1 || getregs_supplies (gdbarch, regno))
45888261
JT
76 {
77 struct reg regs;
78
79 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 80 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 81 perror_with_name (_("Couldn't get registers"));
45888261 82
56be3814 83 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261
JT
84
85 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 86 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 87 perror_with_name (_("Couldn't write registers"));
45888261
JT
88
89 if (regno != -1)
90 return;
91 }
92
2eb4d78b 93 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
94 {
95 struct fpreg fpregs;
96
97 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 98 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 99 perror_with_name (_("Couldn't get floating point status"));
45888261 100
56be3814 101 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
102
103 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 104 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 105 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
106 }
107}
c6d1029f
MK
108\f
109
110/* Provide a prototype to silence -Wmissing-prototypes. */
111void _initialize_mipsnbsd_nat (void);
112
113void
114_initialize_mipsnbsd_nat (void)
115{
116 struct target_ops *t;
117
118 t = inf_ptrace_target ();
119 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers;
120 t->to_store_registers = mipsnbsd_store_inferior_registers;
121 add_target (t);
122}
This page took 0.640288 seconds and 4 git commands to generate.