Add inclusive range support for Rust
[deliverable/binutils-gdb.git] / gdb / m32r-linux-nat.c
CommitLineData
9b32d526
KI
1/* Native-dependent code for GNU/Linux m32r.
2
e2882c85 3 Copyright (C) 2004-2018 Free Software Foundation, Inc.
9b32d526
KI
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
9b32d526
KI
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/>. */
9b32d526
KI
19
20#include "defs.h"
21#include "inferior.h"
22#include "gdbcore.h"
23#include "regcache.h"
24#include "linux-nat.h"
10d6c8cd 25#include "target.h"
5826e159 26#include "nat/gdb_ptrace.h"
9b32d526
KI
27#include <sys/user.h>
28#include <sys/procfs.h>
bcc0c096 29#include "inf-ptrace.h"
9b32d526
KI
30
31/* Prototypes for supply_gregset etc. */
32#include "gregset.h"
33
34#include "m32r-tdep.h"
35\f
36
37
38
39/* Since EVB register is not available for native debug, we reduce
40 the number of registers. */
41#define M32R_LINUX_NUM_REGS (M32R_NUM_REGS - 1)
42
43/* Mapping between the general-purpose registers in `struct user'
44 format and GDB's register array layout. */
45static int regmap[] = {
46 4, 5, 6, 7, 0, 1, 2, 8,
47 9, 10, 11, 12, 13, 24, 25, 23,
48 19, 19, 26, 23, 22, 20, 16, 15
49};
50
51#define PSW_REGMAP 19
52#define BBPSW_REGMAP 21
53#define SPU_REGMAP 23
54#define SPI_REGMAP 26
55
025bb325
MS
56/* Doee (??) apply to the corresponding SET requests as well. */
57#define GETREGS_SUPPLIES(regno) (0 <= (regno) \
58 && (regno) <= M32R_LINUX_NUM_REGS)
9b32d526
KI
59\f
60
61
62/* Transfering the general-purpose registers between GDB, inferiors
63 and core files. */
64
65/* Fill GDB's register array with the general-purpose register values
66 in *GREGSETP. */
67
68void
7f7fe91e 69supply_gregset (struct regcache *regcache, const elf_gregset_t * gregsetp)
9b32d526 70{
7f7fe91e 71 const elf_greg_t *regp = (const elf_greg_t *) gregsetp;
9b32d526
KI
72 int i;
73 unsigned long psw, bbpsw;
74
75 psw = *(regp + PSW_REGMAP);
76 bbpsw = *(regp + BBPSW_REGMAP);
77
78 for (i = 0; i < M32R_LINUX_NUM_REGS; i++)
79 {
d817e083
UW
80 elf_greg_t regval;
81
9b32d526
KI
82 switch (i)
83 {
84 case PSW_REGNUM:
d817e083 85 regval = ((0x00c1 & bbpsw) << 8) | ((0xc100 & psw) >> 8);
9b32d526
KI
86 break;
87 case CBR_REGNUM:
d817e083
UW
88 regval = ((psw >> 8) & 1);
89 break;
90 default:
91 regval = *(regp + regmap[i]);
9b32d526
KI
92 break;
93 }
94
95 if (i != M32R_SP_REGNUM)
7f7fe91e 96 regcache_raw_supply (regcache, i, &regval);
9b32d526 97 else if (psw & 0x8000)
7f7fe91e 98 regcache_raw_supply (regcache, i, regp + SPU_REGMAP);
9b32d526 99 else
7f7fe91e 100 regcache_raw_supply (regcache, i, regp + SPI_REGMAP);
9b32d526
KI
101 }
102}
103
104/* Fetch all general-purpose registers from process/thread TID and
105 store their values in GDB's register array. */
106
107static void
56be3814 108fetch_regs (struct regcache *regcache, int tid)
9b32d526
KI
109{
110 elf_gregset_t regs;
111
112 if (ptrace (PTRACE_GETREGS, tid, 0, (int) &regs) < 0)
e2e0b3e5 113 perror_with_name (_("Couldn't get registers"));
9b32d526 114
56be3814 115 supply_gregset (regcache, (const elf_gregset_t *) &regs);
9b32d526
KI
116}
117
118/* Fill register REGNO (if it is a general-purpose register) in
119 *GREGSETPS with the value in GDB's register array. If REGNO is -1,
120 do this for all registers. */
121
122void
7f7fe91e
UW
123fill_gregset (const struct regcache *regcache,
124 elf_gregset_t * gregsetp, int regno)
9b32d526
KI
125{
126 elf_greg_t *regp = (elf_greg_t *) gregsetp;
127 int i;
128 unsigned long psw, bbpsw, tmp;
129
130 psw = *(regp + PSW_REGMAP);
131 bbpsw = *(regp + BBPSW_REGMAP);
132
133 for (i = 0; i < M32R_LINUX_NUM_REGS; i++)
134 {
135 if (regno != -1 && regno != i)
136 continue;
137
138 if (i == CBR_REGNUM || i == PSW_REGNUM)
139 continue;
140
141 if (i == SPU_REGNUM || i == SPI_REGNUM)
142 continue;
143
144 if (i != M32R_SP_REGNUM)
7f7fe91e 145 regcache_raw_collect (regcache, i, regp + regmap[i]);
9b32d526 146 else if (psw & 0x8000)
7f7fe91e 147 regcache_raw_collect (regcache, i, regp + SPU_REGMAP);
9b32d526 148 else
7f7fe91e 149 regcache_raw_collect (regcache, i, regp + SPI_REGMAP);
9b32d526
KI
150 }
151}
152
153/* Store all valid general-purpose registers in GDB's register array
154 into the process/thread specified by TID. */
155
156static void
56be3814 157store_regs (const struct regcache *regcache, int tid, int regno)
9b32d526
KI
158{
159 elf_gregset_t regs;
160
161 if (ptrace (PTRACE_GETREGS, tid, 0, (int) &regs) < 0)
e2e0b3e5 162 perror_with_name (_("Couldn't get registers"));
9b32d526 163
56be3814 164 fill_gregset (regcache, &regs, regno);
9b32d526
KI
165
166 if (ptrace (PTRACE_SETREGS, tid, 0, (int) &regs) < 0)
e2e0b3e5 167 perror_with_name (_("Couldn't write registers"));
9b32d526
KI
168}
169\f
170
171
172/* Transfering floating-point registers between GDB, inferiors and cores.
173 Since M32R has no floating-point registers, these functions do nothing. */
174
175void
7f7fe91e 176supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregs)
9b32d526
KI
177{
178}
179
180void
7f7fe91e
UW
181fill_fpregset (const struct regcache *regcache,
182 gdb_fpregset_t *fpregs, int regno)
9b32d526
KI
183{
184}
185\f
186
187
188/* Transferring arbitrary registers between GDB and inferior. */
189
190/* Fetch register REGNO from the child process. If REGNO is -1, do
191 this for all registers (including the floating point and SSE
192 registers). */
193
10d6c8cd 194static void
28439f5e
PA
195m32r_linux_fetch_inferior_registers (struct target_ops *ops,
196 struct regcache *regcache, int regno)
9b32d526 197{
bcc0c096 198 pid_t tid = get_ptrace_pid (regcache_get_ptid (regcache));
9b32d526
KI
199
200 /* Use the PTRACE_GETREGS request whenever possible, since it
201 transfers more registers in one system call, and we'll cache the
202 results. */
203 if (regno == -1 || GETREGS_SUPPLIES (regno))
204 {
56be3814 205 fetch_regs (regcache, tid);
9b32d526
KI
206 return;
207 }
208
209 internal_error (__FILE__, __LINE__,
e2e0b3e5 210 _("Got request for bad register number %d."), regno);
9b32d526
KI
211}
212
213/* Store register REGNO back into the child process. If REGNO is -1,
214 do this for all registers (including the floating point and SSE
215 registers). */
10d6c8cd 216static void
28439f5e
PA
217m32r_linux_store_inferior_registers (struct target_ops *ops,
218 struct regcache *regcache, int regno)
9b32d526 219{
bcc0c096 220 pid_t tid = get_ptrace_pid (regcache_get_ptid (regcache));
9b32d526
KI
221
222 /* Use the PTRACE_SETREGS request whenever possible, since it
223 transfers more registers in one system call. */
224 if (regno == -1 || GETREGS_SUPPLIES (regno))
225 {
56be3814 226 store_regs (regcache, tid, regno);
9b32d526
KI
227 return;
228 }
229
230 internal_error (__FILE__, __LINE__,
e2e0b3e5 231 _("Got request to store bad register number %d."), regno);
9b32d526 232}
10d6c8cd 233
10d6c8cd
DJ
234void
235_initialize_m32r_linux_nat (void)
236{
237 struct target_ops *t;
238
239 /* Fill in the generic GNU/Linux methods. */
240 t = linux_target ();
241
242 /* Add our register access methods. */
243 t->to_fetch_registers = m32r_linux_fetch_inferior_registers;
244 t->to_store_registers = m32r_linux_store_inferior_registers;
245
246 /* Register the target. */
f973ed9c 247 linux_nat_add_target (t);
10d6c8cd 248}
This page took 1.191117 seconds and 4 git commands to generate.