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