]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mips64-obsd-nat.c
Fix buffer overrun parsing a corrupt tekhex binary.
[thirdparty/binutils-gdb.git] / gdb / mips64-obsd-nat.c
CommitLineData
abc08782
MK
1/* Native-dependent code for OpenBSD/mips64.
2
61baf725 3 Copyright (C) 2004-2017 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 30#include "inf-ptrace.h"
96c70aba 31#include "obsd-nat.h"
abc08782 32
366e93e8
MK
33/* Shorthand for some register numbers used below. */
34#define MIPS_PC_REGNUM MIPS_EMBED_PC_REGNUM
35#define MIPS_FP0_REGNUM MIPS_EMBED_FP0_REGNUM
36#define MIPS_FSR_REGNUM MIPS_EMBED_FP0_REGNUM + 32
abc08782
MK
37
38/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
39
40static void
41mips64obsd_supply_gregset (struct regcache *regcache, const void *gregs)
42{
43 const char *regs = gregs;
44 int regnum;
45
366e93e8 46 for (regnum = MIPS_ZERO_REGNUM; regnum <= MIPS_PC_REGNUM; regnum++)
abc08782 47 regcache_raw_supply (regcache, regnum, regs + regnum * 8);
366e93e8
MK
48
49 for (regnum = MIPS_FP0_REGNUM; regnum <= MIPS_FSR_REGNUM; regnum++)
50 regcache_raw_supply (regcache, regnum, regs + (regnum + 2) * 8);
abc08782
MK
51}
52
53/* Collect the general-purpose registers from REGCACHE and store them
54 in GREGS. */
55
56static void
57mips64obsd_collect_gregset (const struct regcache *regcache,
58 void *gregs, int regnum)
59{
60 char *regs = gregs;
61 int i;
62
366e93e8 63 for (i = MIPS_ZERO_REGNUM; i <= MIPS_PC_REGNUM; i++)
abc08782
MK
64 {
65 if (regnum == -1 || regnum == i)
66 regcache_raw_collect (regcache, i, regs + i * 8);
67 }
366e93e8
MK
68
69 for (i = MIPS_FP0_REGNUM; i <= MIPS_FSR_REGNUM; i++)
70 {
71 if (regnum == -1 || regnum == i)
72 regcache_raw_collect (regcache, i, regs + (i + 2) * 8);
73 }
abc08782
MK
74}
75\f
76
77/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
78 for all registers. */
79
80static void
28439f5e
PA
81mips64obsd_fetch_inferior_registers (struct target_ops *ops,
82 struct regcache *regcache, int regnum)
abc08782
MK
83{
84 struct reg regs;
bcc0c096 85 pid_t pid = ptid_get_pid (regcache_get_ptid (regcache));
abc08782 86
bcc0c096 87 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 88 perror_with_name (_("Couldn't get registers"));
abc08782 89
56be3814 90 mips64obsd_supply_gregset (regcache, &regs);
abc08782
MK
91}
92
93/* Store register REGNUM back into the inferior. If REGNUM is -1, do
94 this for all registers. */
95
96static void
28439f5e
PA
97mips64obsd_store_inferior_registers (struct target_ops *ops,
98 struct regcache *regcache, int regnum)
abc08782
MK
99{
100 struct reg regs;
bcc0c096 101 pid_t pid = ptid_get_pid (regcache_get_ptid (regcache));
abc08782 102
bcc0c096 103 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 104 perror_with_name (_("Couldn't get registers"));
abc08782 105
56be3814 106 mips64obsd_collect_gregset (regcache, &regs, regnum);
abc08782 107
bcc0c096 108 if (ptrace (PT_SETREGS, pid, (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;
96c70aba 124 obsd_add_target (t);
abc08782 125}