2007-06-18 Markus Deuling <deuling@de.ibm.com>
[deliverable/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
9 the Free Software Foundation; either version 2 of the License, or
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
18 along with this program; if not, write to the Free Software
197e01b6
EZ
19 Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
45888261
JT
21
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
MK
31#include "mips-tdep.h"
32#include "mipsnbsd-tdep.h"
33#include "inf-ptrace.h"
34
45888261
JT
35/* Determine if PT_GETREGS fetches this register. */
36static int
37getregs_supplies (int regno)
38{
3e8c568d
UW
39 return ((regno) >= MIPS_ZERO_REGNUM
40 && (regno) <= gdbarch_pc_regnum (current_gdbarch));
45888261
JT
41}
42
c6d1029f 43static void
56be3814 44mipsnbsd_fetch_inferior_registers (struct regcache *regcache, int regno)
45888261
JT
45{
46 if (regno == -1 || getregs_supplies (regno))
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
3e8c568d 59 if (regno == -1 || regno >= gdbarch_fp0_regnum (current_gdbarch))
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
JT
73{
74 if (regno == -1 || getregs_supplies (regno))
75 {
76 struct reg regs;
77
78 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
9f8e0089 79 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 80 perror_with_name (_("Couldn't get registers"));
45888261 81
56be3814 82 mipsnbsd_fill_reg (regcache, (char *) &regs, regno);
45888261
JT
83
84 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
9f8e0089 85 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 86 perror_with_name (_("Couldn't write registers"));
45888261
JT
87
88 if (regno != -1)
89 return;
90 }
91
3e8c568d 92 if (regno == -1 || regno >= gdbarch_fp0_regnum (current_gdbarch))
45888261
JT
93 {
94 struct fpreg fpregs;
95
96 if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
9f8e0089 97 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 98 perror_with_name (_("Couldn't get floating point status"));
45888261 99
56be3814 100 mipsnbsd_fill_fpreg (regcache, (char *) &fpregs, regno);
45888261
JT
101
102 if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
9f8e0089 103 (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 104 perror_with_name (_("Couldn't write floating point status"));
45888261
JT
105 }
106}
c6d1029f
MK
107\f
108
109/* Provide a prototype to silence -Wmissing-prototypes. */
110void _initialize_mipsnbsd_nat (void);
111
112void
113_initialize_mipsnbsd_nat (void)
114{
115 struct target_ops *t;
116
117 t = inf_ptrace_target ();
118 t->to_fetch_registers = mipsnbsd_fetch_inferior_registers;
119 t->to_store_registers = mipsnbsd_store_inferior_registers;
120 add_target (t);
121}
This page took 0.68205 seconds and 4 git commands to generate.