xref: /openbsd/gnu/usr.bin/binutils/gdb/shnbsd-nat.c (revision 4fe40d6d)
1b725ae77Skettenis /* Native-dependent code for SuperH running NetBSD, for GDB.
211efff7fSkettenis 
311efff7fSkettenis    Copyright 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis    Contributed by Wasabi Systems, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis    (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23*4fe40d6dSkettenis #include "defs.h"
24*4fe40d6dSkettenis #include "inferior.h"
25*4fe40d6dSkettenis 
26b725ae77Skettenis #include <sys/types.h>
27b725ae77Skettenis #include <sys/ptrace.h>
28b725ae77Skettenis #include <machine/reg.h>
29b725ae77Skettenis 
30b725ae77Skettenis #include "sh-tdep.h"
31b725ae77Skettenis #include "shnbsd-tdep.h"
32*4fe40d6dSkettenis #include "inf-ptrace.h"
33b725ae77Skettenis 
34b725ae77Skettenis /* Determine if PT_GETREGS fetches this register. */
35b725ae77Skettenis #define GETREGS_SUPPLIES(regno) \
36b725ae77Skettenis   (((regno) >= R0_REGNUM && (regno) <= (R0_REGNUM + 15)) \
37b725ae77Skettenis || (regno) == PC_REGNUM || (regno) == PR_REGNUM \
38b725ae77Skettenis || (regno) == MACH_REGNUM || (regno) == MACL_REGNUM \
39b725ae77Skettenis || (regno) == SR_REGNUM)
40b725ae77Skettenis 
41*4fe40d6dSkettenis static void
shnbsd_fetch_inferior_registers(int regno)42*4fe40d6dSkettenis shnbsd_fetch_inferior_registers (int regno)
43b725ae77Skettenis {
44b725ae77Skettenis   if (regno == -1 || GETREGS_SUPPLIES (regno))
45b725ae77Skettenis     {
46b725ae77Skettenis       struct reg inferior_registers;
47b725ae77Skettenis 
48b725ae77Skettenis       if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
4911efff7fSkettenis 		  (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
50b725ae77Skettenis 	perror_with_name ("Couldn't get registers");
51b725ae77Skettenis 
52b725ae77Skettenis       shnbsd_supply_reg ((char *) &inferior_registers, regno);
53b725ae77Skettenis 
54b725ae77Skettenis       if (regno != -1)
55b725ae77Skettenis 	return;
56b725ae77Skettenis     }
57b725ae77Skettenis }
58b725ae77Skettenis 
59*4fe40d6dSkettenis static void
shnbsd_store_inferior_registers(int regno)60*4fe40d6dSkettenis shnbsd_store_inferior_registers (int regno)
61b725ae77Skettenis {
62b725ae77Skettenis   if (regno == -1 || GETREGS_SUPPLIES (regno))
63b725ae77Skettenis     {
64b725ae77Skettenis       struct reg inferior_registers;
65b725ae77Skettenis 
66b725ae77Skettenis       if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
6711efff7fSkettenis 		  (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
68b725ae77Skettenis 	perror_with_name ("Couldn't get registers");
69b725ae77Skettenis 
70b725ae77Skettenis       shnbsd_fill_reg ((char *) &inferior_registers, regno);
71b725ae77Skettenis 
72b725ae77Skettenis       if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
7311efff7fSkettenis 		  (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
74b725ae77Skettenis 	perror_with_name ("Couldn't set registers");
75b725ae77Skettenis 
76b725ae77Skettenis       if (regno != -1)
77b725ae77Skettenis 	return;
78b725ae77Skettenis     }
79b725ae77Skettenis }
80*4fe40d6dSkettenis 
81*4fe40d6dSkettenis /* Provide a prototype to silence -Wmissing-prototypes.  */
82*4fe40d6dSkettenis void _initialize_shnbsd_nat (void);
83*4fe40d6dSkettenis 
84*4fe40d6dSkettenis void
_initialize_shnbsd_nat(void)85*4fe40d6dSkettenis _initialize_shnbsd_nat (void)
86*4fe40d6dSkettenis {
87*4fe40d6dSkettenis   struct target_ops *t;
88*4fe40d6dSkettenis 
89*4fe40d6dSkettenis   t = inf_ptrace_target ();
90*4fe40d6dSkettenis   t->to_fetch_registers = shnbsd_fetch_inferior_registers;
91*4fe40d6dSkettenis   t->to_store_registers = shnbsd_store_inferior_registers;
92*4fe40d6dSkettenis   add_target (t);
93*4fe40d6dSkettenis }
94