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