xref: /openbsd-src/gnu/usr.bin/binutils/gdb/mipsnbsd-nat.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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) &regs, 0) == -1)
4852ba75afSkettenis 	perror_with_name ("Couldn't get registers");
494fd35964Sniklas 
5052ba75afSkettenis       mipsnbsd_supply_reg ((char *) &regs, 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) &regs, 0) == -1)
7652ba75afSkettenis 	perror_with_name ("Couldn't get registers");
7752ba75afSkettenis 
7852ba75afSkettenis       mipsnbsd_fill_reg ((char *) &regs, regno);
7952ba75afSkettenis 
8052ba75afSkettenis       if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
81*63addd46Skettenis 		  (PTRACE_TYPE_ARG3) &regs, 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