2011-01-11 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / shnbsd-nat.c
CommitLineData
bd372731
MK
1/* Native-dependent code for NetBSD/sh.
2
7b6bb8da 3 Copyright (C) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
9b254dd1 4 Free Software Foundation, Inc.
9f8e0089 5
13a38d45
JT
6 Contributed by Wasabi Systems, Inc.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
13a38d45
JT
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
13a38d45 22
bd372731
MK
23#include "defs.h"
24#include "inferior.h"
25
13a38d45
JT
26#include <sys/types.h>
27#include <sys/ptrace.h>
28#include <machine/reg.h>
29
97a5b208 30#include "sh-tdep.h"
bd372731 31#include "inf-ptrace.h"
4e3269e3
UW
32#include "regcache.h"
33
13a38d45 34
c378eb4e 35/* Determine if PT_GETREGS fetches this register. */
40a6adc1 36#define GETREGS_SUPPLIES(gdbarch, regno) \
13a38d45 37 (((regno) >= R0_REGNUM && (regno) <= (R0_REGNUM + 15)) \
40a6adc1 38|| (regno) == gdbarch_pc_regnum (gdbarch) || (regno) == PR_REGNUM \
13a38d45
JT
39|| (regno) == MACH_REGNUM || (regno) == MACL_REGNUM \
40|| (regno) == SR_REGNUM)
41
c9ac0a72
AS
42/* Sizeof `struct reg' in <machine/reg.h>. */
43#define SHNBSD_SIZEOF_GREGS (21 * 4)
44
bd372731 45static void
28439f5e
PA
46shnbsd_fetch_inferior_registers (struct target_ops *ops,
47 struct regcache *regcache, int regno)
13a38d45 48{
40a6adc1 49 if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno))
13a38d45
JT
50 {
51 struct reg inferior_registers;
52
53 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
dfeafa2f 54 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 55 perror_with_name (_("Couldn't get registers"));
13a38d45 56
c9ac0a72
AS
57 sh_corefile_supply_regset (&sh_corefile_gregset, regcache, regno,
58 (char *) &inferior_registers,
59 SHNBSD_SIZEOF_GREGS);
13a38d45
JT
60
61 if (regno != -1)
62 return;
63 }
64}
65
bd372731 66static void
28439f5e
PA
67shnbsd_store_inferior_registers (struct target_ops *ops,
68 struct regcache *regcache, int regno)
13a38d45 69{
40a6adc1 70 if (regno == -1 || GETREGS_SUPPLIES (get_regcache_arch (regcache), regno))
13a38d45
JT
71 {
72 struct reg inferior_registers;
73
74 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
dfeafa2f 75 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 76 perror_with_name (_("Couldn't get registers"));
13a38d45 77
c9ac0a72
AS
78 sh_corefile_collect_regset (&sh_corefile_gregset, regcache, regno,
79 (char *) &inferior_registers,
80 SHNBSD_SIZEOF_GREGS);
13a38d45
JT
81
82 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
dfeafa2f 83 (PTRACE_TYPE_ARG3) &inferior_registers, 0) == -1)
e2e0b3e5 84 perror_with_name (_("Couldn't set registers"));
13a38d45
JT
85
86 if (regno != -1)
87 return;
88 }
89}
bd372731
MK
90
91/* Provide a prototype to silence -Wmissing-prototypes. */
92void _initialize_shnbsd_nat (void);
93
94void
95_initialize_shnbsd_nat (void)
96{
97 struct target_ops *t;
98
99 t = inf_ptrace_target ();
100 t->to_fetch_registers = shnbsd_fetch_inferior_registers;
101 t->to_store_registers = shnbsd_store_inferior_registers;
102 add_target (t);
103}
This page took 1.092273 seconds and 4 git commands to generate.