]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mipsnbsd-nat.c
*** empty log message ***
[thirdparty/binutils-gdb.git] / gdb / mipsnbsd-nat.c
CommitLineData
45888261 1/* Native-dependent code for MIPS systems running NetBSD.
9f8e0089 2
6aba47ca 3 Copyright (C) 2000, 2001, 2002, 2004, 2007 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
JT
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
c6d1029f 23#include "target.h"
45888261
JT
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
c6d1029f
MK
29#include "mips-tdep.h"
30#include "mipsnbsd-tdep.h"
31#include "inf-ptrace.h"
32
45888261
JT
33/* Determine if PT_GETREGS fetches this register. */
34static int
35getregs_supplies (int regno)
36{
3e8c568d
UW
37 return ((regno) >= MIPS_ZERO_REGNUM
38 && (regno) <= gdbarch_pc_regnum (current_gdbarch));
45888261
JT
39}
40
c6d1029f 41static void
56be3814 42mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
45888261
JT
43{
44 if (regno == -1 || getregs_supplies (regno))
45 {
46 struct reg regs;
47
48 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 49 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 50 perror_with_name (_("Couldn't get registers"));
45888261 51
56be3814 52 mipsnbsd_supply_reg (regcache, (char *) &regs, regno);
45888261
JT
53 if (regno != -1)
54 return;
55 }
56
2eb4d78b 57 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
58 {
59 struct fpreg fpregs;
60
61 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 62 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 63 perror_with_name (_("Couldn't get floating point status"));
45888261 64
56be3814 65 mipsnbsd_supply_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
66 }
67}
68
c6d1029f 69static void
56be3814 70mipsnbsd_store_inferior_registers (struct regcache *regcache, int regno)
45888261
JT
71{
72 if (regno == -1 || getregs_supplies (regno))
73 {
74 struct reg regs;
75
76 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 77 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 78 perror_with_name (_("Couldn't get registers"));
45888261 79
56be3814 80 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261
JT
81
82 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 83 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 84 perror_with_name (_("Couldn't write registers"));
45888261
JT
85
86 if (regno != -1)
87 return;
88 }
89
2eb4d78b 90 if (regno == -1 || regno >= gdbarch_fp0_regnum (get_regcache_arch (regcache)))
45888261
JT
91 {
92 struct fpreg fpregs;
93
94 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 95 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 96 perror_with_name (_("Couldn't get floating point status"));
45888261 97
56be3814 98 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
99
100 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 101 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 102 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
103 }
104}
c6d1029f
MK
105\f
106
107/* Provide a prototype to silence -Wmissing-prototypes. */
108void _initialize_mipsnbsd_nat (void);
109
110void
111_initialize_mipsnbsd_nat (void)
112{
113 struct target_ops *t;
114
115 t = inf_ptrace_target ();
116 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers;
117 t->to_store_registers = mipsnbsd_store_inferior_registers;
118 add_target (t);
119}