2009-07-07 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / mips64obsd-nat.c
CommitLineData
abc08782
MK
1/* Native-dependent code for OpenBSD/mips64.
2
0fb0cc75 3 Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
abc08782
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
abc08782
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
abc08782
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
23#include "target.h"
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
366e93e8 29#include "mips-tdep.h"
abc08782
MK
30#include "inf-ptrace.h"
31
366e93e8
MK
32/* Shorthand for some register numbers used below. */
33#define MIPS_PC_REGNUM MIPS_EMBED_PC_REGNUM
34#define MIPS_FP0_REGNUM MIPS_EMBED_FP0_REGNUM
35#define MIPS_FSR_REGNUM MIPS_EMBED_FP0_REGNUM + 32
abc08782
MK
36
37/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
38
39static void
40mips64obsd_supply_gregset (struct regcache *regcache, const void *gregs)
41{
42 const char *regs = gregs;
43 int regnum;
44
366e93e8 45 for (regnum = MIPS_ZERO_REGNUM; regnum <= MIPS_PC_REGNUM; regnum++)
abc08782 46 regcache_raw_supply (regcache, regnum, regs + regnum * 8);
366e93e8
MK
47
48 for (regnum = MIPS_FP0_REGNUM; regnum <= MIPS_FSR_REGNUM; regnum++)
49 regcache_raw_supply (regcache, regnum, regs + (regnum + 2) * 8);
abc08782
MK
50}
51
52/* Collect the general-purpose registers from REGCACHE and store them
53 in GREGS. */
54
55static void
56mips64obsd_collect_gregset (const struct regcache *regcache,
57 void *gregs, int regnum)
58{
59 char *regs = gregs;
60 int i;
61
366e93e8 62 for (i = MIPS_ZERO_REGNUM; i <= MIPS_PC_REGNUM; i++)
abc08782
MK
63 {
64 if (regnum == -1 || regnum == i)
65 regcache_raw_collect (regcache, i, regs + i * 8);
66 }
366e93e8
MK
67
68 for (i = MIPS_FP0_REGNUM; i <= MIPS_FSR_REGNUM; i++)
69 {
70 if (regnum == -1 || regnum == i)
71 regcache_raw_collect (regcache, i, regs + (i + 2) * 8);
72 }
abc08782
MK
73}
74\f
75
76/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
77 for all registers. */
78
79static void
28439f5e
PA
80mips64obsd_fetch_inferior_registers (struct target_ops *ops,
81 struct regcache *regcache, int regnum)
abc08782
MK
82{
83 struct reg regs;
84
85 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
86 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 87 perror_with_name (_("Couldn't get registers"));
abc08782 88
56be3814 89 mips64obsd_supply_gregset (regcache, &regs);
abc08782
MK
90}
91
92/* Store register REGNUM back into the inferior. If REGNUM is -1, do
93 this for all registers. */
94
95static void
28439f5e
PA
96mips64obsd_store_inferior_registers (struct target_ops *ops,
97 struct regcache *regcache, int regnum)
abc08782
MK
98{
99 struct reg regs;
100
101 if (ptrace (PT_GETREGS, PIDGET (inferior_ptid),
102 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 103 perror_with_name (_("Couldn't get registers"));
abc08782 104
56be3814 105 mips64obsd_collect_gregset (regcache, &regs, regnum);
abc08782
MK
106
107 if (ptrace (PT_SETREGS, PIDGET (inferior_ptid),
108 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 109 perror_with_name (_("Couldn't write registers"));
abc08782
MK
110}
111\f
112
113/* Provide a prototype to silence -Wmissing-prototypes. */
114void _initialize_mips64obsd_nat (void);
115
116void
117_initialize_mips64obsd_nat (void)
118{
119 struct target_ops *t;
120
121 t = inf_ptrace_target ();
122 t->to_fetch_registers = mips64obsd_fetch_inferior_registers;
123 t->to_store_registers = mips64obsd_store_inferior_registers;
124 add_target (t);
125}
This page took 0.347372 seconds and 4 git commands to generate.