gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / mips-linux-nat.c
CommitLineData
75c9abc6 1/* Native-dependent code for GNU/Linux on MIPS processors.
a094c6fb 2
b811d2c2 3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
2aa830e4
DJ
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
2aa830e4
DJ
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/>. */
2aa830e4
DJ
19
20#include "defs.h"
b9412953
DD
21#include "command.h"
22#include "gdbcmd.h"
d37eb719 23#include "inferior.h"
6b753f60 24#include "mips-tdep.h"
10d6c8cd 25#include "target.h"
28f5035f 26#include "regcache.h"
6798487f 27#include "linux-nat-trad.h"
d37eb719 28#include "mips-linux-tdep.h"
822b6570 29#include "target-descriptions.h"
2aa830e4 30
dc60ece8 31#include "gdb_proc_service.h"
3e00823e 32#include "gregset.h"
dc60ece8 33
822b6570 34#include <sgidefs.h>
5826e159 35#include "nat/gdb_ptrace.h"
9be14b81 36#include <asm/ptrace.h>
bcc0c096 37#include "inf-ptrace.h"
d37eb719 38
125f8a3d 39#include "nat/mips-linux-watch.h"
aaee2056 40
dc60ece8
DJ
41#ifndef PTRACE_GET_THREAD_AREA
42#define PTRACE_GET_THREAD_AREA 25
43#endif
44
f6ac5f3d
PA
45class mips_linux_nat_target final : public linux_nat_trad_target
46{
47public:
48 /* Add our register access methods. */
49 void fetch_registers (struct regcache *, int) override;
50 void store_registers (struct regcache *, int) override;
51
52 void close () override;
53
54 int can_use_hw_breakpoint (enum bptype, int, int) override;
55
56 int remove_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
57 struct expression *) override;
58
59 int insert_watchpoint (CORE_ADDR, int, enum target_hw_bp_type,
60 struct expression *) override;
61
57810aa7 62 bool stopped_by_watchpoint () override;
f6ac5f3d 63
57810aa7 64 bool stopped_data_address (CORE_ADDR *) override;
d37eb719 65
f6ac5f3d 66 int region_ok_for_hw_watchpoint (CORE_ADDR, int) override;
d37eb719 67
f6ac5f3d 68 const struct target_desc *read_description () override;
b9412953 69
f6ac5f3d
PA
70protected:
71 /* Override linux_nat_trad_target methods. */
72 CORE_ADDR register_u_offset (struct gdbarch *gdbarch,
73 int regno, int store_p) override;
74
135340af
PA
75 /* Override linux_nat_target low methods. */
76 void low_new_thread (struct lwp_info *lp) override;
77
f6ac5f3d
PA
78private:
79 /* Helpers. See definitions. */
80 void mips64_regsets_store_registers (struct regcache *regcache,
81 int regno);
82 void mips64_regsets_fetch_registers (struct regcache *regcache,
83 int regno);
84};
85
86static mips_linux_nat_target the_mips_linux_nat_target;
87
88/* Assume that we have PTRACE_GETREGS et al. support. If we do not,
89 we'll clear this and use PTRACE_PEEKUSER instead. */
90static int have_ptrace_regsets = 1;
d37eb719 91
dda0c97e 92/* Map gdb internal register number to ptrace ``address''.
7714d83a
UW
93 These ``addresses'' are normally defined in <asm/ptrace.h>.
94
95 ptrace does not provide a way to read (or set) MIPS_PS_REGNUM,
96 and there's no point in reading or setting MIPS_ZERO_REGNUM.
97 We also can not set BADVADDR, CAUSE, or FCRIR via ptrace(). */
dda0c97e
UW
98
99static CORE_ADDR
7714d83a 100mips_linux_register_addr (struct gdbarch *gdbarch, int regno, int store)
dda0c97e 101{
7714d83a 102 CORE_ADDR regaddr;
dda0c97e 103
2eb4d78b 104 if (regno < 0 || regno >= gdbarch_num_regs (gdbarch))
dda0c97e
UW
105 error (_("Bogon register number %d."), regno);
106
7714d83a 107 if (regno > MIPS_ZERO_REGNUM && regno < MIPS_ZERO_REGNUM + 32)
dda0c97e 108 regaddr = regno;
7714d83a
UW
109 else if ((regno >= mips_regnum (gdbarch)->fp0)
110 && (regno < mips_regnum (gdbarch)->fp0 + 32))
111 regaddr = FPR_BASE + (regno - mips_regnum (gdbarch)->fp0);
112 else if (regno == mips_regnum (gdbarch)->pc)
dda0c97e 113 regaddr = PC;
7714d83a
UW
114 else if (regno == mips_regnum (gdbarch)->cause)
115 regaddr = store? (CORE_ADDR) -1 : CAUSE;
116 else if (regno == mips_regnum (gdbarch)->badvaddr)
117 regaddr = store? (CORE_ADDR) -1 : BADVADDR;
118 else if (regno == mips_regnum (gdbarch)->lo)
dda0c97e 119 regaddr = MMLO;
7714d83a 120 else if (regno == mips_regnum (gdbarch)->hi)
dda0c97e 121 regaddr = MMHI;
7714d83a 122 else if (regno == mips_regnum (gdbarch)->fp_control_status)
dda0c97e 123 regaddr = FPC_CSR;
7714d83a
UW
124 else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
125 regaddr = store? (CORE_ADDR) -1 : FPC_EIR;
1faeff08
MR
126 else if (mips_regnum (gdbarch)->dspacc != -1
127 && regno >= mips_regnum (gdbarch)->dspacc
128 && regno < mips_regnum (gdbarch)->dspacc + 6)
129 regaddr = DSP_BASE + (regno - mips_regnum (gdbarch)->dspacc);
130 else if (regno == mips_regnum (gdbarch)->dspctl)
131 regaddr = DSP_CONTROL;
822b6570
DJ
132 else if (mips_linux_restart_reg_p (gdbarch) && regno == MIPS_RESTART_REGNUM)
133 regaddr = 0;
dda0c97e 134 else
7714d83a 135 regaddr = (CORE_ADDR) -1;
dda0c97e
UW
136
137 return regaddr;
138}
139
140static CORE_ADDR
7714d83a 141mips64_linux_register_addr (struct gdbarch *gdbarch, int regno, int store)
dda0c97e 142{
7714d83a 143 CORE_ADDR regaddr;
dda0c97e 144
2eb4d78b 145 if (regno < 0 || regno >= gdbarch_num_regs (gdbarch))
dda0c97e
UW
146 error (_("Bogon register number %d."), regno);
147
75d74cca
MR
148 /* On n32 we can't access 64-bit registers via PTRACE_PEEKUSR
149 or PTRACE_POKEUSR. */
150 if (register_size (gdbarch, regno) > sizeof (PTRACE_TYPE_RET))
151 return (CORE_ADDR) -1;
152
7714d83a 153 if (regno > MIPS_ZERO_REGNUM && regno < MIPS_ZERO_REGNUM + 32)
dda0c97e 154 regaddr = regno;
7714d83a
UW
155 else if ((regno >= mips_regnum (gdbarch)->fp0)
156 && (regno < mips_regnum (gdbarch)->fp0 + 32))
2eb4d78b 157 regaddr = MIPS64_FPR_BASE + (regno - gdbarch_fp0_regnum (gdbarch));
7714d83a 158 else if (regno == mips_regnum (gdbarch)->pc)
dda0c97e 159 regaddr = MIPS64_PC;
7714d83a
UW
160 else if (regno == mips_regnum (gdbarch)->cause)
161 regaddr = store? (CORE_ADDR) -1 : MIPS64_CAUSE;
162 else if (regno == mips_regnum (gdbarch)->badvaddr)
163 regaddr = store? (CORE_ADDR) -1 : MIPS64_BADVADDR;
164 else if (regno == mips_regnum (gdbarch)->lo)
dda0c97e 165 regaddr = MIPS64_MMLO;
7714d83a 166 else if (regno == mips_regnum (gdbarch)->hi)
dda0c97e 167 regaddr = MIPS64_MMHI;
7714d83a 168 else if (regno == mips_regnum (gdbarch)->fp_control_status)
dda0c97e 169 regaddr = MIPS64_FPC_CSR;
7714d83a
UW
170 else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
171 regaddr = store? (CORE_ADDR) -1 : MIPS64_FPC_EIR;
1faeff08
MR
172 else if (mips_regnum (gdbarch)->dspacc != -1
173 && regno >= mips_regnum (gdbarch)->dspacc
174 && regno < mips_regnum (gdbarch)->dspacc + 6)
175 regaddr = DSP_BASE + (regno - mips_regnum (gdbarch)->dspacc);
176 else if (regno == mips_regnum (gdbarch)->dspctl)
177 regaddr = DSP_CONTROL;
822b6570
DJ
178 else if (mips_linux_restart_reg_p (gdbarch) && regno == MIPS_RESTART_REGNUM)
179 regaddr = 0;
dda0c97e 180 else
7714d83a 181 regaddr = (CORE_ADDR) -1;
dda0c97e
UW
182
183 return regaddr;
184}
185
dc60ece8
DJ
186/* Fetch the thread-local storage pointer for libthread_db. */
187
188ps_err_e
754653a7 189ps_get_thread_area (struct ps_prochandle *ph,
dc60ece8
DJ
190 lwpid_t lwpid, int idx, void **base)
191{
192 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
193 return PS_ERR;
194
195 /* IDX is the bias from the thread pointer to the beginning of the
196 thread descriptor. It has to be subtracted due to implementation
197 quirks in libthread_db. */
198 *base = (void *) ((char *)*base - idx);
199
200 return PS_OK;
201}
202
3e00823e
UW
203/* Wrapper functions. These are only used by libthread_db. */
204
205void
7f7fe91e 206supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
3e00823e 207{
ac7936df 208 if (mips_isa_regsize (regcache->arch ()) == 4)
7f7fe91e 209 mips_supply_gregset (regcache, (const mips_elf_gregset_t *) gregsetp);
3e00823e 210 else
7f7fe91e 211 mips64_supply_gregset (regcache, (const mips64_elf_gregset_t *) gregsetp);
3e00823e
UW
212}
213
214void
7f7fe91e
UW
215fill_gregset (const struct regcache *regcache,
216 gdb_gregset_t *gregsetp, int regno)
3e00823e 217{
ac7936df 218 if (mips_isa_regsize (regcache->arch ()) == 4)
7f7fe91e 219 mips_fill_gregset (regcache, (mips_elf_gregset_t *) gregsetp, regno);
3e00823e 220 else
7f7fe91e 221 mips64_fill_gregset (regcache, (mips64_elf_gregset_t *) gregsetp, regno);
3e00823e
UW
222}
223
224void
7f7fe91e 225supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
3e00823e 226{
d8dab6c3 227 mips64_supply_fpregset (regcache, (const mips64_elf_fpregset_t *) fpregsetp);
3e00823e
UW
228}
229
230void
7f7fe91e
UW
231fill_fpregset (const struct regcache *regcache,
232 gdb_fpregset_t *fpregsetp, int regno)
3e00823e 233{
d8dab6c3 234 mips64_fill_fpregset (regcache, (mips64_elf_fpregset_t *) fpregsetp, regno);
3e00823e
UW
235}
236
237
d37eb719
DJ
238/* Fetch REGNO (or all registers if REGNO == -1) from the target
239 using PTRACE_GETREGS et al. */
240
f6ac5f3d
PA
241void
242mips_linux_nat_target::mips64_regsets_fetch_registers
243 (struct regcache *regcache, int regno)
d37eb719 244{
ac7936df 245 struct gdbarch *gdbarch = regcache->arch ();
1faeff08
MR
246 int is_fp, is_dsp;
247 int have_dsp;
248 int regi;
d37eb719
DJ
249 int tid;
250
2eb4d78b
UW
251 if (regno >= mips_regnum (gdbarch)->fp0
252 && regno <= mips_regnum (gdbarch)->fp0 + 32)
d37eb719 253 is_fp = 1;
2eb4d78b 254 else if (regno == mips_regnum (gdbarch)->fp_control_status)
d37eb719 255 is_fp = 1;
2eb4d78b 256 else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
d37eb719
DJ
257 is_fp = 1;
258 else
259 is_fp = 0;
260
1faeff08
MR
261 /* DSP registers are optional and not a part of any set. */
262 have_dsp = mips_regnum (gdbarch)->dspctl != -1;
263 if (!have_dsp)
264 is_dsp = 0;
265 else if (regno >= mips_regnum (gdbarch)->dspacc
266 && regno < mips_regnum (gdbarch)->dspacc + 6)
267 is_dsp = 1;
268 else if (regno == mips_regnum (gdbarch)->dspctl)
269 is_dsp = 1;
270 else
271 is_dsp = 0;
272
222312d3 273 tid = get_ptrace_pid (regcache->ptid ());
d37eb719 274
1faeff08 275 if (regno == -1 || (!is_fp && !is_dsp))
d37eb719
DJ
276 {
277 mips64_elf_gregset_t regs;
278
279 if (ptrace (PTRACE_GETREGS, tid, 0L, (PTRACE_TYPE_ARG3) &regs) == -1)
280 {
281 if (errno == EIO)
282 {
283 have_ptrace_regsets = 0;
284 return;
285 }
286 perror_with_name (_("Couldn't get registers"));
287 }
288
56be3814 289 mips64_supply_gregset (regcache,
28f5035f 290 (const mips64_elf_gregset_t *) &regs);
d37eb719
DJ
291 }
292
293 if (regno == -1 || is_fp)
294 {
295 mips64_elf_fpregset_t fp_regs;
296
297 if (ptrace (PTRACE_GETFPREGS, tid, 0L,
298 (PTRACE_TYPE_ARG3) &fp_regs) == -1)
299 {
300 if (errno == EIO)
301 {
302 have_ptrace_regsets = 0;
303 return;
304 }
305 perror_with_name (_("Couldn't get FP registers"));
306 }
307
56be3814 308 mips64_supply_fpregset (regcache,
28f5035f 309 (const mips64_elf_fpregset_t *) &fp_regs);
d37eb719 310 }
1faeff08
MR
311
312 if (is_dsp)
f6ac5f3d 313 linux_nat_trad_target::fetch_registers (regcache, regno);
1faeff08
MR
314 else if (regno == -1 && have_dsp)
315 {
316 for (regi = mips_regnum (gdbarch)->dspacc;
317 regi < mips_regnum (gdbarch)->dspacc + 6;
318 regi++)
f6ac5f3d
PA
319 linux_nat_trad_target::fetch_registers (regcache, regi);
320 linux_nat_trad_target::fetch_registers (regcache,
321 mips_regnum (gdbarch)->dspctl);
1faeff08 322 }
d37eb719
DJ
323}
324
325/* Store REGNO (or all registers if REGNO == -1) to the target
326 using PTRACE_SETREGS et al. */
327
f6ac5f3d
PA
328void
329mips_linux_nat_target::mips64_regsets_store_registers
330 (struct regcache *regcache, int regno)
d37eb719 331{
ac7936df 332 struct gdbarch *gdbarch = regcache->arch ();
1faeff08
MR
333 int is_fp, is_dsp;
334 int have_dsp;
335 int regi;
d37eb719
DJ
336 int tid;
337
2eb4d78b
UW
338 if (regno >= mips_regnum (gdbarch)->fp0
339 && regno <= mips_regnum (gdbarch)->fp0 + 32)
d37eb719 340 is_fp = 1;
2eb4d78b 341 else if (regno == mips_regnum (gdbarch)->fp_control_status)
d37eb719 342 is_fp = 1;
2eb4d78b 343 else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
d37eb719
DJ
344 is_fp = 1;
345 else
346 is_fp = 0;
347
1faeff08
MR
348 /* DSP registers are optional and not a part of any set. */
349 have_dsp = mips_regnum (gdbarch)->dspctl != -1;
350 if (!have_dsp)
351 is_dsp = 0;
6ce4c112 352 else if (regno >= mips_regnum (gdbarch)->dspacc
1faeff08
MR
353 && regno < mips_regnum (gdbarch)->dspacc + 6)
354 is_dsp = 1;
355 else if (regno == mips_regnum (gdbarch)->dspctl)
356 is_dsp = 1;
357 else
358 is_dsp = 0;
359
222312d3 360 tid = get_ptrace_pid (regcache->ptid ());
d37eb719 361
1faeff08 362 if (regno == -1 || (!is_fp && !is_dsp))
d37eb719
DJ
363 {
364 mips64_elf_gregset_t regs;
365
366 if (ptrace (PTRACE_GETREGS, tid, 0L, (PTRACE_TYPE_ARG3) &regs) == -1)
367 perror_with_name (_("Couldn't get registers"));
368
56be3814 369 mips64_fill_gregset (regcache, &regs, regno);
d37eb719
DJ
370
371 if (ptrace (PTRACE_SETREGS, tid, 0L, (PTRACE_TYPE_ARG3) &regs) == -1)
372 perror_with_name (_("Couldn't set registers"));
373 }
374
375 if (regno == -1 || is_fp)
376 {
377 mips64_elf_fpregset_t fp_regs;
378
379 if (ptrace (PTRACE_GETFPREGS, tid, 0L,
380 (PTRACE_TYPE_ARG3) &fp_regs) == -1)
381 perror_with_name (_("Couldn't get FP registers"));
382
56be3814 383 mips64_fill_fpregset (regcache, &fp_regs, regno);
d37eb719
DJ
384
385 if (ptrace (PTRACE_SETFPREGS, tid, 0L,
386 (PTRACE_TYPE_ARG3) &fp_regs) == -1)
387 perror_with_name (_("Couldn't set FP registers"));
388 }
1faeff08
MR
389
390 if (is_dsp)
f6ac5f3d 391 linux_nat_trad_target::store_registers (regcache, regno);
1faeff08
MR
392 else if (regno == -1 && have_dsp)
393 {
394 for (regi = mips_regnum (gdbarch)->dspacc;
395 regi < mips_regnum (gdbarch)->dspacc + 6;
396 regi++)
f6ac5f3d
PA
397 linux_nat_trad_target::store_registers (regcache, regi);
398 linux_nat_trad_target::store_registers (regcache,
399 mips_regnum (gdbarch)->dspctl);
1faeff08 400 }
d37eb719
DJ
401}
402
403/* Fetch REGNO (or all registers if REGNO == -1) from the target
404 using any working method. */
405
f6ac5f3d
PA
406void
407mips_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
d37eb719
DJ
408{
409 /* Unless we already know that PTRACE_GETREGS does not work, try it. */
410 if (have_ptrace_regsets)
f6ac5f3d 411 mips64_regsets_fetch_registers (regcache, regnum);
d37eb719
DJ
412
413 /* If we know, or just found out, that PTRACE_GETREGS does not work, fall
414 back to PTRACE_PEEKUSER. */
415 if (!have_ptrace_regsets)
4e6ff0e1
MR
416 {
417 linux_nat_trad_target::fetch_registers (regcache, regnum);
418
419 /* Fill the inaccessible zero register with zero. */
420 if (regnum == MIPS_ZERO_REGNUM || regnum == -1)
421 regcache->raw_supply_zeroed (MIPS_ZERO_REGNUM);
422 }
d37eb719
DJ
423}
424
425/* Store REGNO (or all registers if REGNO == -1) to the target
426 using any working method. */
427
f6ac5f3d
PA
428void
429mips_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
d37eb719
DJ
430{
431 /* Unless we already know that PTRACE_GETREGS does not work, try it. */
432 if (have_ptrace_regsets)
f6ac5f3d 433 mips64_regsets_store_registers (regcache, regnum);
d37eb719
DJ
434
435 /* If we know, or just found out, that PTRACE_GETREGS does not work, fall
436 back to PTRACE_PEEKUSER. */
437 if (!have_ptrace_regsets)
f6ac5f3d 438 linux_nat_trad_target::store_registers (regcache, regnum);
d37eb719
DJ
439}
440
910122bf
UW
441/* Return the address in the core dump or inferior of register
442 REGNO. */
443
f6ac5f3d
PA
444CORE_ADDR
445mips_linux_nat_target::register_u_offset (struct gdbarch *gdbarch,
446 int regno, int store_p)
910122bf 447{
7714d83a
UW
448 if (mips_abi_regsize (gdbarch) == 8)
449 return mips64_linux_register_addr (gdbarch, regno, store_p);
dda0c97e 450 else
7714d83a 451 return mips_linux_register_addr (gdbarch, regno, store_p);
910122bf
UW
452}
453
f6ac5f3d
PA
454const struct target_desc *
455mips_linux_nat_target::read_description ()
822b6570 456{
1faeff08
MR
457 static int have_dsp = -1;
458
459 if (have_dsp < 0)
460 {
2d389915 461 int tid = get_ptrace_pid (inferior_ptid);
1faeff08 462
ac740bc7 463 errno = 0;
1faeff08
MR
464 ptrace (PTRACE_PEEKUSER, tid, DSP_CONTROL, 0);
465 switch (errno)
466 {
467 case 0:
468 have_dsp = 1;
469 break;
470 case EIO:
471 have_dsp = 0;
472 break;
473 default:
837a1b32 474 perror_with_name (_("Couldn't check DSP support"));
1faeff08
MR
475 break;
476 }
477 }
478
81adfced
DJ
479 /* Report that target registers are a size we know for sure
480 that we can get from ptrace. */
481 if (_MIPS_SIM == _ABIO32)
1faeff08 482 return have_dsp ? tdesc_mips_dsp_linux : tdesc_mips_linux;
81adfced 483 else
1faeff08 484 return have_dsp ? tdesc_mips64_dsp_linux : tdesc_mips64_linux;
822b6570
DJ
485}
486
b9412953
DD
487/* -1 if the kernel and/or CPU do not support watch registers.
488 1 if watch_readback is valid and we can read style, num_valid
489 and the masks.
490 0 if we need to read the watch_readback. */
491
492static int watch_readback_valid;
493
494/* Cached watch register read values. */
495
496static struct pt_watch_regs watch_readback;
497
b9412953
DD
498static struct mips_watchpoint *current_watches;
499
500/* The current set of watch register values for writing the
501 registers. */
502
503static struct pt_watch_regs watch_mirror;
504
b9412953
DD
505static void
506mips_show_dr (const char *func, CORE_ADDR addr,
507 int len, enum target_hw_bp_type type)
508{
509 int i;
510
511 puts_unfiltered (func);
512 if (addr || len)
5af949e3 513 printf_unfiltered (" (addr=%s, len=%d, type=%s)",
f5656ead 514 paddress (target_gdbarch (), addr), len,
b9412953
DD
515 type == hw_write ? "data-write"
516 : (type == hw_read ? "data-read"
517 : (type == hw_access ? "data-read/write"
518 : (type == hw_execute ? "instruction-execute"
519 : "??unknown??"))));
520 puts_unfiltered (":\n");
521
522 for (i = 0; i < MAX_DEBUG_REGISTER; i++)
5af949e3 523 printf_unfiltered ("\tDR%d: lo=%s, hi=%s\n", i,
f5656ead 524 paddress (target_gdbarch (),
b3436450
YQ
525 mips_linux_watch_get_watchlo (&watch_mirror,
526 i)),
f5656ead 527 paddress (target_gdbarch (),
b3436450
YQ
528 mips_linux_watch_get_watchhi (&watch_mirror,
529 i)));
b9412953
DD
530}
531
b9412953
DD
532/* Target to_can_use_hw_breakpoint implementation. Return 1 if we can
533 handle the specified watch type. */
534
f6ac5f3d
PA
535int
536mips_linux_nat_target::can_use_hw_breakpoint (enum bptype type,
537 int cnt, int ot)
b9412953
DD
538{
539 int i;
540 uint32_t wanted_mask, irw_mask;
541
e38504b3 542 if (!mips_linux_read_watch_registers (inferior_ptid.lwp (),
b3436450
YQ
543 &watch_readback,
544 &watch_readback_valid, 0))
b9412953
DD
545 return 0;
546
547 switch (type)
548 {
549 case bp_hardware_watchpoint:
550 wanted_mask = W_MASK;
551 break;
552 case bp_read_watchpoint:
553 wanted_mask = R_MASK;
554 break;
555 case bp_access_watchpoint:
556 wanted_mask = R_MASK | W_MASK;
557 break;
558 default:
559 return 0;
560 }
561
b3436450
YQ
562 for (i = 0;
563 i < mips_linux_watch_get_num_valid (&watch_readback) && cnt;
564 i++)
b9412953 565 {
b3436450 566 irw_mask = mips_linux_watch_get_irw_mask (&watch_readback, i);
b9412953
DD
567 if ((irw_mask & wanted_mask) == wanted_mask)
568 cnt--;
569 }
570 return (cnt == 0) ? 1 : 0;
571}
572
573/* Target to_stopped_by_watchpoint implementation. Return 1 if
574 stopped by watchpoint. The watchhi R and W bits indicate the watch
025bb325 575 register triggered. */
b9412953 576
57810aa7 577bool
f6ac5f3d 578mips_linux_nat_target::stopped_by_watchpoint ()
b9412953
DD
579{
580 int n;
581 int num_valid;
582
e38504b3 583 if (!mips_linux_read_watch_registers (inferior_ptid.lwp (),
b3436450
YQ
584 &watch_readback,
585 &watch_readback_valid, 1))
57810aa7 586 return false;
b9412953 587
b3436450 588 num_valid = mips_linux_watch_get_num_valid (&watch_readback);
b9412953
DD
589
590 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++)
b3436450 591 if (mips_linux_watch_get_watchhi (&watch_readback, n) & (R_MASK | W_MASK))
57810aa7 592 return true;
b9412953 593
57810aa7 594 return false;
b9412953
DD
595}
596
597/* Target to_stopped_data_address implementation. Set the address
598 where the watch triggered (if known). Return 1 if the address was
599 known. */
600
57810aa7 601bool
f6ac5f3d 602mips_linux_nat_target::stopped_data_address (CORE_ADDR *paddr)
b9412953
DD
603{
604 /* On mips we don't know the low order 3 bits of the data address,
605 so we must return false. */
57810aa7 606 return false;
b9412953
DD
607}
608
b9412953
DD
609/* Target to_region_ok_for_hw_watchpoint implementation. Return 1 if
610 the specified region can be covered by the watch registers. */
611
f6ac5f3d
PA
612int
613mips_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
b9412953
DD
614{
615 struct pt_watch_regs dummy_regs;
616 int i;
617
e38504b3 618 if (!mips_linux_read_watch_registers (inferior_ptid.lwp (),
b3436450
YQ
619 &watch_readback,
620 &watch_readback_valid, 0))
b9412953
DD
621 return 0;
622
623 dummy_regs = watch_readback;
624 /* Clear them out. */
b3436450
YQ
625 for (i = 0; i < mips_linux_watch_get_num_valid (&dummy_regs); i++)
626 mips_linux_watch_set_watchlo (&dummy_regs, i, 0);
627 return mips_linux_watch_try_one_watch (&dummy_regs, addr, len, 0);
b9412953
DD
628}
629
b9412953
DD
630/* Write the mirrored watch register values for each thread. */
631
632static int
633write_watchpoint_regs (void)
634{
635 struct lwp_info *lp;
b9412953
DD
636 int tid;
637
4c38200f 638 ALL_LWPS (lp)
b9412953 639 {
e38504b3 640 tid = lp->ptid.lwp ();
aa58a496 641 if (ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL) == -1)
b9412953
DD
642 perror_with_name (_("Couldn't write debug register"));
643 }
644 return 0;
645}
646
135340af
PA
647/* linux_nat_target::low_new_thread implementation. Write the
648 mirrored watch register values for the new thread. */
b9412953 649
135340af
PA
650void
651mips_linux_nat_target::low_new_thread (struct lwp_info *lp)
b9412953 652{
339053c2 653 long tid = lp->ptid.lwp ();
b9412953 654
7974a605 655 if (!mips_linux_read_watch_registers (tid,
b3436450
YQ
656 &watch_readback,
657 &watch_readback_valid, 0))
b9412953
DD
658 return;
659
aa58a496 660 if (ptrace (PTRACE_SET_WATCH_REGS, tid, &watch_mirror, NULL) == -1)
b9412953
DD
661 perror_with_name (_("Couldn't write debug register"));
662}
663
b9412953
DD
664/* Target to_insert_watchpoint implementation. Try to insert a new
665 watch. Return zero on success. */
666
f6ac5f3d
PA
667int
668mips_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
669 enum target_hw_bp_type type,
670 struct expression *cond)
b9412953
DD
671{
672 struct pt_watch_regs regs;
673 struct mips_watchpoint *new_watch;
674 struct mips_watchpoint **pw;
675
b9412953
DD
676 int retval;
677
e38504b3 678 if (!mips_linux_read_watch_registers (inferior_ptid.lwp (),
b3436450
YQ
679 &watch_readback,
680 &watch_readback_valid, 0))
b9412953
DD
681 return -1;
682
683 if (len <= 0)
684 return -1;
685
686 regs = watch_readback;
687 /* Add the current watches. */
b3436450 688 mips_linux_watch_populate_regs (current_watches, &regs);
b9412953
DD
689
690 /* Now try to add the new watch. */
b3436450
YQ
691 if (!mips_linux_watch_try_one_watch (&regs, addr, len,
692 mips_linux_watch_type_to_irw (type)))
b9412953
DD
693 return -1;
694
695 /* It fit. Stick it on the end of the list. */
8d749320 696 new_watch = XNEW (struct mips_watchpoint);
b9412953
DD
697 new_watch->addr = addr;
698 new_watch->len = len;
699 new_watch->type = type;
700 new_watch->next = NULL;
701
702 pw = &current_watches;
703 while (*pw != NULL)
704 pw = &(*pw)->next;
705 *pw = new_watch;
706
707 watch_mirror = regs;
708 retval = write_watchpoint_regs ();
709
c5e92cca 710 if (show_debug_regs)
b9412953
DD
711 mips_show_dr ("insert_watchpoint", addr, len, type);
712
713 return retval;
714}
715
716/* Target to_remove_watchpoint implementation. Try to remove a watch.
717 Return zero on success. */
718
f6ac5f3d
PA
719int
720mips_linux_nat_target::remove_watchpoint (CORE_ADDR addr, int len,
721 enum target_hw_bp_type type,
722 struct expression *cond)
b9412953
DD
723{
724 int retval;
725 int deleted_one;
726
727 struct mips_watchpoint **pw;
728 struct mips_watchpoint *w;
729
730 /* Search for a known watch that matches. Then unlink and free
731 it. */
732 deleted_one = 0;
733 pw = &current_watches;
734 while ((w = *pw))
735 {
736 if (w->addr == addr && w->len == len && w->type == type)
737 {
738 *pw = w->next;
739 xfree (w);
740 deleted_one = 1;
741 break;
742 }
743 pw = &(w->next);
744 }
745
746 if (!deleted_one)
747 return -1; /* We don't know about it, fail doing nothing. */
748
749 /* At this point watch_readback is known to be valid because we
750 could not have added the watch without reading it. */
751 gdb_assert (watch_readback_valid == 1);
752
753 watch_mirror = watch_readback;
b3436450 754 mips_linux_watch_populate_regs (current_watches, &watch_mirror);
b9412953
DD
755
756 retval = write_watchpoint_regs ();
757
c5e92cca 758 if (show_debug_regs)
b9412953
DD
759 mips_show_dr ("remove_watchpoint", addr, len, type);
760
761 return retval;
762}
763
764/* Target to_close implementation. Free any watches and call the
765 super implementation. */
766
f6ac5f3d
PA
767void
768mips_linux_nat_target::close ()
b9412953
DD
769{
770 struct mips_watchpoint *w;
771 struct mips_watchpoint *nw;
772
773 /* Clean out the current_watches list. */
774 w = current_watches;
775 while (w)
776 {
777 nw = w->next;
778 xfree (w);
779 w = nw;
780 }
781 current_watches = NULL;
782
f6ac5f3d 783 linux_nat_trad_target::close ();
b9412953
DD
784}
785
6c265988 786void _initialize_mips_linux_nat ();
10d6c8cd 787void
6c265988 788_initialize_mips_linux_nat ()
10d6c8cd 789{
cbe54154 790 add_setshow_boolean_cmd ("show-debug-regs", class_maintenance,
c5e92cca 791 &show_debug_regs, _("\
cbe54154
PA
792Set whether to show variables that mirror the mips debug registers."), _("\
793Show whether to show variables that mirror the mips debug registers."), _("\
b9412953
DD
794Use \"on\" to enable, \"off\" to disable.\n\
795If enabled, the debug registers values are shown when GDB inserts\n\
796or removes a hardware breakpoint or watchpoint, and when the inferior\n\
797triggers a breakpoint or watchpoint."),
cbe54154
PA
798 NULL,
799 NULL,
800 &maintenance_set_cmdlist,
801 &maintenance_show_cmdlist);
b9412953 802
f6ac5f3d 803 linux_target = &the_mips_linux_nat_target;
d9f719f1 804 add_inf_child_target (&the_mips_linux_nat_target);
10d6c8cd 805}
This page took 1.756617 seconds and 4 git commands to generate.