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