152ba75afSkettenis /* Native-dependent code for MIPS systems running NetBSD.
2*63addd46Skettenis
3*63addd46Skettenis Copyright 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
44fd35964Sniklas
54fd35964Sniklas This file is part of GDB.
64fd35964Sniklas
74fd35964Sniklas This program is free software; you can redistribute it and/or modify
84fd35964Sniklas it under the terms of the GNU General Public License as published by
94fd35964Sniklas the Free Software Foundation; either version 2 of the License, or
104fd35964Sniklas (at your option) any later version.
114fd35964Sniklas
124fd35964Sniklas This program is distributed in the hope that it will be useful,
134fd35964Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
144fd35964Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
154fd35964Sniklas GNU General Public License for more details.
164fd35964Sniklas
174fd35964Sniklas You should have received a copy of the GNU General Public License
184fd35964Sniklas along with this program; if not, write to the Free Software
1952ba75afSkettenis Foundation, Inc., 59 Temple Place - Suite 330,
2052ba75afSkettenis Boston, MA 02111-1307, USA. */
2152ba75afSkettenis
2252ba75afSkettenis #include "defs.h"
2352ba75afSkettenis #include "inferior.h"
2452ba75afSkettenis #include "regcache.h"
2552ba75afSkettenis
2652ba75afSkettenis #include "mipsnbsd-tdep.h"
274fd35964Sniklas
284fd35964Sniklas #include <sys/types.h>
294fd35964Sniklas #include <sys/ptrace.h>
304fd35964Sniklas #include <machine/reg.h>
314fd35964Sniklas
3252ba75afSkettenis /* Determine if PT_GETREGS fetches this register. */
3352ba75afSkettenis static int
getregs_supplies(int regno)3452ba75afSkettenis getregs_supplies (int regno)
354fd35964Sniklas {
3652ba75afSkettenis return ((regno) >= ZERO_REGNUM && (regno) <= PC_REGNUM);
374fd35964Sniklas }
384fd35964Sniklas
394fd35964Sniklas void
fetch_inferior_registers(int regno)4052ba75afSkettenis fetch_inferior_registers (int regno)
414fd35964Sniklas {
4252ba75afSkettenis if (regno == -1 || getregs_supplies (regno))
434fd35964Sniklas {
4452ba75afSkettenis struct reg regs;
454fd35964Sniklas
4652ba75afSkettenis if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
47*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
4852ba75afSkettenis perror_with_name ("Couldn't get registers");
494fd35964Sniklas
5052ba75afSkettenis mipsnbsd_supply_reg ((char *) ®s, regno);
5152ba75afSkettenis if (regno != -1)
5252ba75afSkettenis return;
534fd35964Sniklas }
544fd35964Sniklas
5552ba75afSkettenis if (regno == -1 || regno >= FP0_REGNUM)
564fd35964Sniklas {
5752ba75afSkettenis struct fpreg fpregs;
584fd35964Sniklas
5952ba75afSkettenis if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
60*63addd46Skettenis (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
6152ba75afSkettenis perror_with_name ("Couldn't get floating point status");
624fd35964Sniklas
6352ba75afSkettenis mipsnbsd_supply_fpreg ((char *) &fpregs, regno);
644fd35964Sniklas }
654fd35964Sniklas }
664fd35964Sniklas
674fd35964Sniklas void
store_inferior_registers(int regno)6852ba75afSkettenis store_inferior_registers (int regno)
694fd35964Sniklas {
7052ba75afSkettenis if (regno == -1 || getregs_supplies (regno))
7152ba75afSkettenis {
7252ba75afSkettenis struct reg regs;
7352ba75afSkettenis
7452ba75afSkettenis if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
75*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
7652ba75afSkettenis perror_with_name ("Couldn't get registers");
7752ba75afSkettenis
7852ba75afSkettenis mipsnbsd_fill_reg ((char *) ®s, regno);
7952ba75afSkettenis
8052ba75afSkettenis if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
81*63addd46Skettenis (PTRACE_TYPE_ARG3) ®s, 0) == -1)
8252ba75afSkettenis perror_with_name ("Couldn't write registers");
8352ba75afSkettenis
8452ba75afSkettenis if (regno != -1)
8552ba75afSkettenis return;
8652ba75afSkettenis }
8752ba75afSkettenis
8852ba75afSkettenis if (regno == -1 || regno >= FP0_REGNUM)
8952ba75afSkettenis {
9052ba75afSkettenis struct fpreg fpregs;
9152ba75afSkettenis
9252ba75afSkettenis if (ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
93*63addd46Skettenis (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
9452ba75afSkettenis perror_with_name ("Couldn't get floating point status");
9552ba75afSkettenis
9652ba75afSkettenis mipsnbsd_fill_fpreg ((char *) &fpregs, regno);
9752ba75afSkettenis
9852ba75afSkettenis if (ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
99*63addd46Skettenis (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
10052ba75afSkettenis perror_with_name ("Couldn't write floating point status");
10152ba75afSkettenis }
1024fd35964Sniklas }
103