Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / gdbserver / linux-mips-low.c
CommitLineData
0a30fbc4 1/* GNU/Linux/MIPS specific low level interface, for the remote server for GDB.
e2882c85 2 Copyright (C) 1995-2018 Free Software Foundation, Inc.
0a30fbc4
DJ
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
0a30fbc4
DJ
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0a30fbc4
DJ
18
19#include "server.h"
58caa3dc 20#include "linux-low.h"
0a30fbc4 21
5826e159 22#include "nat/gdb_ptrace.h"
186947f7 23#include <endian.h>
21b0f40c 24
125f8a3d 25#include "nat/mips-linux-watch.h"
21b0f40c
DJ
26#include "gdb_proc_service.h"
27
d05b4ac3
UW
28/* Defined in auto-generated file mips-linux.c. */
29void init_registers_mips_linux (void);
3aee8918
PA
30extern const struct target_desc *tdesc_mips_linux;
31
1faeff08
MR
32/* Defined in auto-generated file mips-dsp-linux.c. */
33void init_registers_mips_dsp_linux (void);
3aee8918
PA
34extern const struct target_desc *tdesc_mips_dsp_linux;
35
d05b4ac3
UW
36/* Defined in auto-generated file mips64-linux.c. */
37void init_registers_mips64_linux (void);
3aee8918
PA
38extern const struct target_desc *tdesc_mips64_linux;
39
1faeff08
MR
40/* Defined in auto-generated file mips64-dsp-linux.c. */
41void init_registers_mips64_dsp_linux (void);
3aee8918 42extern const struct target_desc *tdesc_mips64_dsp_linux;
1faeff08
MR
43
44#ifdef __mips64
3aee8918
PA
45#define tdesc_mips_linux tdesc_mips64_linux
46#define tdesc_mips_dsp_linux tdesc_mips64_dsp_linux
1faeff08 47#endif
d05b4ac3 48
21b0f40c
DJ
49#ifndef PTRACE_GET_THREAD_AREA
50#define PTRACE_GET_THREAD_AREA 25
51#endif
52
0a30fbc4
DJ
53#ifdef HAVE_SYS_REG_H
54#include <sys/reg.h>
55#endif
56
117ce543 57#define mips_num_regs 73
1faeff08 58#define mips_dsp_num_regs 80
0a30fbc4
DJ
59
60#include <asm/ptrace.h>
61
1faeff08
MR
62#ifndef DSP_BASE
63#define DSP_BASE 71
64#define DSP_CONTROL 77
65#endif
66
186947f7
DJ
67union mips_register
68{
69 unsigned char buf[8];
70
71 /* Deliberately signed, for proper sign extension. */
72 int reg32;
73 long long reg64;
74};
75
0a30fbc4
DJ
76/* Return the ptrace ``address'' of register REGNO. */
77
1faeff08
MR
78#define mips_base_regs \
79 -1, 1, 2, 3, 4, 5, 6, 7, \
80 8, 9, 10, 11, 12, 13, 14, 15, \
81 16, 17, 18, 19, 20, 21, 22, 23, \
82 24, 25, 26, 27, 28, 29, 30, 31, \
83 \
84 -1, MMLO, MMHI, BADVADDR, CAUSE, PC, \
85 \
86 FPR_BASE, FPR_BASE + 1, FPR_BASE + 2, FPR_BASE + 3, \
87 FPR_BASE + 4, FPR_BASE + 5, FPR_BASE + 6, FPR_BASE + 7, \
88 FPR_BASE + 8, FPR_BASE + 9, FPR_BASE + 10, FPR_BASE + 11, \
89 FPR_BASE + 12, FPR_BASE + 13, FPR_BASE + 14, FPR_BASE + 15, \
90 FPR_BASE + 16, FPR_BASE + 17, FPR_BASE + 18, FPR_BASE + 19, \
91 FPR_BASE + 20, FPR_BASE + 21, FPR_BASE + 22, FPR_BASE + 23, \
92 FPR_BASE + 24, FPR_BASE + 25, FPR_BASE + 26, FPR_BASE + 27, \
93 FPR_BASE + 28, FPR_BASE + 29, FPR_BASE + 30, FPR_BASE + 31, \
94 FPC_CSR, FPC_EIR
95
96#define mips_dsp_regs \
97 DSP_BASE, DSP_BASE + 1, DSP_BASE + 2, DSP_BASE + 3, \
98 DSP_BASE + 4, DSP_BASE + 5, \
99 DSP_CONTROL
100
101static int mips_regmap[mips_num_regs] = {
102 mips_base_regs,
103 0
104};
0a30fbc4 105
1faeff08
MR
106static int mips_dsp_regmap[mips_dsp_num_regs] = {
107 mips_base_regs,
108 mips_dsp_regs,
109 0
110};
0a30fbc4 111
1faeff08
MR
112/* DSP registers are not in any regset and can only be accessed
113 individually. */
0a30fbc4 114
1faeff08
MR
115static unsigned char mips_dsp_regset_bitmap[(mips_dsp_num_regs + 7) / 8] = {
116 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80
0a30fbc4
DJ
117};
118
3aee8918
PA
119static int have_dsp = -1;
120
1faeff08
MR
121/* Try peeking at an arbitrarily chosen DSP register and pick the available
122 user register set accordingly. */
123
3aee8918
PA
124static const struct target_desc *
125mips_read_description (void)
1faeff08 126{
3aee8918 127 if (have_dsp < 0)
1faeff08 128 {
0bfdf32f 129 int pid = lwpid_of (current_thread);
1faeff08 130
ac740bc7 131 errno = 0;
1faeff08
MR
132 ptrace (PTRACE_PEEKUSER, pid, DSP_CONTROL, 0);
133 switch (errno)
134 {
135 case 0:
3aee8918 136 have_dsp = 1;
1faeff08
MR
137 break;
138 case EIO:
3aee8918 139 have_dsp = 0;
1faeff08
MR
140 break;
141 default:
142 perror_with_name ("ptrace");
143 break;
144 }
145 }
3aee8918
PA
146
147 return have_dsp ? tdesc_mips_dsp_linux : tdesc_mips_linux;
148}
149
150static void
151mips_arch_setup (void)
152{
153 current_process ()->tdesc = mips_read_description ();
154}
155
156static struct usrregs_info *
157get_usrregs_info (void)
158{
159 const struct regs_info *regs_info = the_low_target.regs_info ();
160
161 return regs_info->usrregs;
1faeff08
MR
162}
163
7a60ad40
YQ
164/* Per-process arch-specific data we want to keep. */
165
166struct arch_process_info
167{
168 /* -1 if the kernel and/or CPU do not support watch registers.
169 1 if watch_readback is valid and we can read style, num_valid
170 and the masks.
171 0 if we need to read the watch_readback. */
172
173 int watch_readback_valid;
174
175 /* Cached watch register read values. */
176
177 struct pt_watch_regs watch_readback;
178
179 /* Current watchpoint requests for this process. */
180
181 struct mips_watchpoint *current_watches;
182
183 /* The current set of watch register values for writing the
184 registers. */
185
186 struct pt_watch_regs watch_mirror;
187};
188
189/* Per-thread arch-specific data we want to keep. */
190
191struct arch_lwp_info
192{
193 /* Non-zero if our copy differs from what's recorded in the thread. */
194 int watch_registers_changed;
195};
196
0a30fbc4
DJ
197/* From mips-linux-nat.c. */
198
199/* Pseudo registers can not be read. ptrace does not provide a way to
200 read (or set) PS_REGNUM, and there's no point in reading or setting
e4439e43
MR
201 ZERO_REGNUM, it's always 0. We also can not set BADVADDR, CAUSE,
202 or FCRIR via ptrace(). */
0a30fbc4 203
2ec06d2e
DJ
204static int
205mips_cannot_fetch_register (int regno)
0a30fbc4 206{
3aee8918
PA
207 const struct target_desc *tdesc;
208
209 if (get_usrregs_info ()->regmap[regno] == -1)
0a30fbc4
DJ
210 return 1;
211
3aee8918
PA
212 tdesc = current_process ()->tdesc;
213
214 if (find_regno (tdesc, "r0") == regno)
0a30fbc4
DJ
215 return 1;
216
217 return 0;
218}
219
2ec06d2e
DJ
220static int
221mips_cannot_store_register (int regno)
0a30fbc4 222{
3aee8918
PA
223 const struct target_desc *tdesc;
224
225 if (get_usrregs_info ()->regmap[regno] == -1)
0a30fbc4
DJ
226 return 1;
227
3aee8918
PA
228 tdesc = current_process ()->tdesc;
229
230 if (find_regno (tdesc, "r0") == regno)
0a30fbc4
DJ
231 return 1;
232
3aee8918 233 if (find_regno (tdesc, "cause") == regno)
0a30fbc4
DJ
234 return 1;
235
3aee8918 236 if (find_regno (tdesc, "badvaddr") == regno)
0a30fbc4
DJ
237 return 1;
238
3aee8918 239 if (find_regno (tdesc, "fir") == regno)
0a30fbc4
DJ
240 return 1;
241
242 return 0;
243}
2ec06d2e 244
e4439e43
MR
245static int
246mips_fetch_register (struct regcache *regcache, int regno)
247{
248 const struct target_desc *tdesc = current_process ()->tdesc;
249
250 if (find_regno (tdesc, "r0") == regno)
251 {
252 supply_register_zeroed (regcache, regno);
253 return 1;
254 }
255
256 return 0;
257}
258
0d62e5e8 259static CORE_ADDR
442ea881 260mips_get_pc (struct regcache *regcache)
0d62e5e8 261{
186947f7 262 union mips_register pc;
442ea881 263 collect_register_by_name (regcache, "pc", pc.buf);
3aee8918 264 return register_size (regcache->tdesc, 0) == 4 ? pc.reg32 : pc.reg64;
0d62e5e8
DJ
265}
266
267static void
442ea881 268mips_set_pc (struct regcache *regcache, CORE_ADDR pc)
0d62e5e8 269{
186947f7 270 union mips_register newpc;
3aee8918 271 if (register_size (regcache->tdesc, 0) == 4)
186947f7
DJ
272 newpc.reg32 = pc;
273 else
274 newpc.reg64 = pc;
275
442ea881 276 supply_register_by_name (regcache, "pc", newpc.buf);
0d62e5e8
DJ
277}
278
279/* Correct in either endianness. */
186947f7 280static const unsigned int mips_breakpoint = 0x0005000d;
0d62e5e8
DJ
281#define mips_breakpoint_len 4
282
dd373349
AT
283/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
284
285static const gdb_byte *
286mips_sw_breakpoint_from_kind (int kind, int *size)
287{
288 *size = mips_breakpoint_len;
289 return (const gdb_byte *) &mips_breakpoint;
290}
291
0d62e5e8
DJ
292static int
293mips_breakpoint_at (CORE_ADDR where)
294{
186947f7 295 unsigned int insn;
0d62e5e8 296
f450004a 297 (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
0d62e5e8
DJ
298 if (insn == mips_breakpoint)
299 return 1;
300
301 /* If necessary, recognize more trap instructions here. GDB only uses the
302 one. */
303 return 0;
304}
305
da25033c 306/* Mark the watch registers of lwp, represented by ENTRY, as changed. */
7a60ad40 307
da25033c
SM
308static void
309update_watch_registers_callback (thread_info *thread)
7a60ad40 310{
d86d4aaf 311 struct lwp_info *lwp = get_thread_lwp (thread);
7a60ad40 312
da25033c
SM
313 /* The actual update is done later just before resuming the lwp,
314 we just mark that the registers need updating. */
315 lwp->arch_private->watch_registers_changed = 1;
7a60ad40 316
da25033c
SM
317 /* If the lwp isn't stopped, force it to momentarily pause, so
318 we can update its watch registers. */
319 if (!lwp->stopped)
320 linux_stop_lwp (lwp);
7a60ad40
YQ
321}
322
323/* This is the implementation of linux_target_ops method
324 new_process. */
325
326static struct arch_process_info *
327mips_linux_new_process (void)
328{
8d749320 329 struct arch_process_info *info = XCNEW (struct arch_process_info);
7a60ad40
YQ
330
331 return info;
332}
333
04ec7890
SM
334/* This is the implementation of linux_target_ops method
335 delete_process. */
336
337static void
338mips_linux_delete_process (struct arch_process_info *info)
339{
340 xfree (info);
341}
342
7a60ad40
YQ
343/* This is the implementation of linux_target_ops method new_thread.
344 Mark the watch registers as changed, so the threads' copies will
345 be updated. */
346
34c703da
GB
347static void
348mips_linux_new_thread (struct lwp_info *lwp)
7a60ad40 349{
8d749320 350 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
7a60ad40
YQ
351
352 info->watch_registers_changed = 1;
353
34c703da 354 lwp->arch_private = info;
7a60ad40
YQ
355}
356
466eecee
SM
357/* Function to call when a thread is being deleted. */
358
359static void
360mips_linux_delete_thread (struct arch_lwp_info *arch_lwp)
361{
362 xfree (arch_lwp);
363}
364
3a8a0396
DB
365/* Create a new mips_watchpoint and add it to the list. */
366
367static void
cbec665b 368mips_add_watchpoint (struct arch_process_info *priv, CORE_ADDR addr, int len,
eb3e3c67 369 enum target_hw_bp_type watch_type)
3a8a0396
DB
370{
371 struct mips_watchpoint *new_watch;
372 struct mips_watchpoint **pw;
373
8d749320 374 new_watch = XNEW (struct mips_watchpoint);
3a8a0396
DB
375 new_watch->addr = addr;
376 new_watch->len = len;
377 new_watch->type = watch_type;
378 new_watch->next = NULL;
379
cbec665b 380 pw = &priv->current_watches;
3a8a0396
DB
381 while (*pw != NULL)
382 pw = &(*pw)->next;
383 *pw = new_watch;
384}
385
386/* Hook to call when a new fork is attached. */
387
388static void
389mips_linux_new_fork (struct process_info *parent,
390 struct process_info *child)
391{
392 struct arch_process_info *parent_private;
393 struct arch_process_info *child_private;
394 struct mips_watchpoint *wp;
395
396 /* These are allocated by linux_add_process. */
61a7418c
DB
397 gdb_assert (parent->priv != NULL
398 && parent->priv->arch_private != NULL);
399 gdb_assert (child->priv != NULL
400 && child->priv->arch_private != NULL);
3a8a0396
DB
401
402 /* Linux kernel before 2.6.33 commit
403 72f674d203cd230426437cdcf7dd6f681dad8b0d
404 will inherit hardware debug registers from parent
405 on fork/vfork/clone. Newer Linux kernels create such tasks with
406 zeroed debug registers.
407
408 GDB core assumes the child inherits the watchpoints/hw
409 breakpoints of the parent, and will remove them all from the
410 forked off process. Copy the debug registers mirrors into the
411 new process so that all breakpoints and watchpoints can be
412 removed together. The debug registers mirror will become zeroed
413 in the end before detaching the forked off process, thus making
414 this compatible with older Linux kernels too. */
415
61a7418c
DB
416 parent_private = parent->priv->arch_private;
417 child_private = child->priv->arch_private;
3a8a0396
DB
418
419 child_private->watch_readback_valid = parent_private->watch_readback_valid;
420 child_private->watch_readback = parent_private->watch_readback;
421
422 for (wp = parent_private->current_watches; wp != NULL; wp = wp->next)
423 mips_add_watchpoint (child_private, wp->addr, wp->len, wp->type);
424
425 child_private->watch_mirror = parent_private->watch_mirror;
426}
7a60ad40
YQ
427/* This is the implementation of linux_target_ops method
428 prepare_to_resume. If the watch regs have changed, update the
429 thread's copies. */
430
431static void
432mips_linux_prepare_to_resume (struct lwp_info *lwp)
433{
d86d4aaf 434 ptid_t ptid = ptid_of (get_lwp_thread (lwp));
7a60ad40 435 struct process_info *proc = find_process_pid (ptid_get_pid (ptid));
fe978cb0 436 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
437
438 if (lwp->arch_private->watch_registers_changed)
439 {
440 /* Only update the watch registers if we have set or unset a
441 watchpoint already. */
fe978cb0 442 if (mips_linux_watch_get_num_valid (&priv->watch_mirror) > 0)
7a60ad40
YQ
443 {
444 /* Write the mirrored watch register values. */
445 int tid = ptid_get_lwp (ptid);
446
447 if (-1 == ptrace (PTRACE_SET_WATCH_REGS, tid,
aa58a496 448 &priv->watch_mirror, NULL))
7a60ad40
YQ
449 perror_with_name ("Couldn't write watch register");
450 }
451
452 lwp->arch_private->watch_registers_changed = 0;
453 }
454}
455
802e8e6d
PA
456static int
457mips_supports_z_point_type (char z_type)
458{
459 switch (z_type)
460 {
461 case Z_PACKET_WRITE_WP:
462 case Z_PACKET_READ_WP:
463 case Z_PACKET_ACCESS_WP:
464 return 1;
465 default:
466 return 0;
467 }
468}
469
7a60ad40
YQ
470/* This is the implementation of linux_target_ops method
471 insert_point. */
472
473static int
802e8e6d
PA
474mips_insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
475 int len, struct raw_breakpoint *bp)
7a60ad40
YQ
476{
477 struct process_info *proc = current_process ();
fe978cb0 478 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40 479 struct pt_watch_regs regs;
7a60ad40
YQ
480 long lwpid;
481 enum target_hw_bp_type watch_type;
482 uint32_t irw;
483
0bfdf32f 484 lwpid = lwpid_of (current_thread);
7a60ad40 485 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
486 &priv->watch_readback,
487 &priv->watch_readback_valid,
7a60ad40
YQ
488 0))
489 return -1;
490
491 if (len <= 0)
492 return -1;
493
fe978cb0 494 regs = priv->watch_readback;
7a60ad40 495 /* Add the current watches. */
fe978cb0 496 mips_linux_watch_populate_regs (priv->current_watches, &regs);
7a60ad40
YQ
497
498 /* Now try to add the new watch. */
802e8e6d 499 watch_type = raw_bkpt_type_to_target_hw_bp_type (type);
7a60ad40
YQ
500 irw = mips_linux_watch_type_to_irw (watch_type);
501 if (!mips_linux_watch_try_one_watch (&regs, addr, len, irw))
502 return -1;
503
504 /* It fit. Stick it on the end of the list. */
3a8a0396 505 mips_add_watchpoint (priv, addr, len, watch_type);
7a60ad40 506
fe978cb0 507 priv->watch_mirror = regs;
7a60ad40
YQ
508
509 /* Only update the threads of this process. */
da25033c 510 for_each_thread (proc->pid, update_watch_registers_callback);
7a60ad40
YQ
511
512 return 0;
513}
514
515/* This is the implementation of linux_target_ops method
516 remove_point. */
517
518static int
802e8e6d
PA
519mips_remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
520 int len, struct raw_breakpoint *bp)
7a60ad40
YQ
521{
522 struct process_info *proc = current_process ();
fe978cb0 523 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
524
525 int deleted_one;
7a60ad40
YQ
526 enum target_hw_bp_type watch_type;
527
528 struct mips_watchpoint **pw;
529 struct mips_watchpoint *w;
530
7a60ad40 531 /* Search for a known watch that matches. Then unlink and free it. */
802e8e6d 532 watch_type = raw_bkpt_type_to_target_hw_bp_type (type);
7a60ad40 533 deleted_one = 0;
fe978cb0 534 pw = &priv->current_watches;
7a60ad40
YQ
535 while ((w = *pw))
536 {
537 if (w->addr == addr && w->len == len && w->type == watch_type)
538 {
539 *pw = w->next;
540 free (w);
541 deleted_one = 1;
542 break;
543 }
544 pw = &(w->next);
545 }
546
547 if (!deleted_one)
548 return -1; /* We don't know about it, fail doing nothing. */
549
550 /* At this point watch_readback is known to be valid because we
551 could not have added the watch without reading it. */
fe978cb0 552 gdb_assert (priv->watch_readback_valid == 1);
7a60ad40 553
fe978cb0
PA
554 priv->watch_mirror = priv->watch_readback;
555 mips_linux_watch_populate_regs (priv->current_watches,
556 &priv->watch_mirror);
7a60ad40
YQ
557
558 /* Only update the threads of this process. */
da25033c
SM
559 for_each_thread (proc->pid, update_watch_registers_callback);
560
7a60ad40
YQ
561 return 0;
562}
563
564/* This is the implementation of linux_target_ops method
565 stopped_by_watchpoint. The watchhi R and W bits indicate
566 the watch register triggered. */
567
568static int
569mips_stopped_by_watchpoint (void)
570{
571 struct process_info *proc = current_process ();
fe978cb0 572 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
573 int n;
574 int num_valid;
0bfdf32f 575 long lwpid = lwpid_of (current_thread);
7a60ad40
YQ
576
577 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
578 &priv->watch_readback,
579 &priv->watch_readback_valid,
7a60ad40
YQ
580 1))
581 return 0;
582
fe978cb0 583 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback);
7a60ad40
YQ
584
585 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++)
fe978cb0 586 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
587 & (R_MASK | W_MASK))
588 return 1;
589
590 return 0;
591}
592
593/* This is the implementation of linux_target_ops method
594 stopped_data_address. */
595
596static CORE_ADDR
597mips_stopped_data_address (void)
598{
599 struct process_info *proc = current_process ();
fe978cb0 600 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
601 int n;
602 int num_valid;
0bfdf32f 603 long lwpid = lwpid_of (current_thread);
7a60ad40
YQ
604
605 /* On MIPS we don't know the low order 3 bits of the data address.
606 GDB does not support remote targets that can't report the
607 watchpoint address. So, make our best guess; return the starting
608 address of a watchpoint request which overlaps the one that
609 triggered. */
610
611 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
612 &priv->watch_readback,
613 &priv->watch_readback_valid,
7a60ad40
YQ
614 0))
615 return 0;
616
fe978cb0 617 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback);
7a60ad40
YQ
618
619 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++)
fe978cb0 620 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
621 & (R_MASK | W_MASK))
622 {
623 CORE_ADDR t_low, t_hi;
624 int t_irw;
625 struct mips_watchpoint *watch;
626
fe978cb0 627 t_low = mips_linux_watch_get_watchlo (&priv->watch_readback, n);
7a60ad40 628 t_irw = t_low & IRW_MASK;
fe978cb0 629 t_hi = (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
630 | IRW_MASK);
631 t_low &= ~(CORE_ADDR)t_hi;
632
fe978cb0 633 for (watch = priv->current_watches;
7a60ad40
YQ
634 watch != NULL;
635 watch = watch->next)
636 {
637 CORE_ADDR addr = watch->addr;
638 CORE_ADDR last_byte = addr + watch->len - 1;
639
640 if ((t_irw & mips_linux_watch_type_to_irw (watch->type)) == 0)
641 {
642 /* Different type. */
643 continue;
644 }
645 /* Check for overlap of even a single byte. */
646 if (last_byte >= t_low && addr <= t_low + t_hi)
647 return addr;
648 }
649 }
650
651 /* Shouldn't happen. */
652 return 0;
653}
654
21b0f40c
DJ
655/* Fetch the thread-local storage pointer for libthread_db. */
656
657ps_err_e
754653a7 658ps_get_thread_area (struct ps_prochandle *ph,
1b3f6016 659 lwpid_t lwpid, int idx, void **base)
21b0f40c
DJ
660{
661 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
662 return PS_ERR;
663
664 /* IDX is the bias from the thread pointer to the beginning of the
665 thread descriptor. It has to be subtracted due to implementation
666 quirks in libthread_db. */
667 *base = (void *) ((char *)*base - idx);
668
669 return PS_OK;
670}
671
186947f7
DJ
672#ifdef HAVE_PTRACE_GETREGS
673
674static void
442ea881
PA
675mips_collect_register (struct regcache *regcache,
676 int use_64bit, int regno, union mips_register *reg)
186947f7
DJ
677{
678 union mips_register tmp_reg;
679
680 if (use_64bit)
681 {
442ea881 682 collect_register (regcache, regno, &tmp_reg.reg64);
186947f7
DJ
683 *reg = tmp_reg;
684 }
685 else
686 {
442ea881 687 collect_register (regcache, regno, &tmp_reg.reg32);
186947f7
DJ
688 reg->reg64 = tmp_reg.reg32;
689 }
690}
691
692static void
442ea881
PA
693mips_supply_register (struct regcache *regcache,
694 int use_64bit, int regno, const union mips_register *reg)
186947f7
DJ
695{
696 int offset = 0;
697
698 /* For big-endian 32-bit targets, ignore the high four bytes of each
699 eight-byte slot. */
700 if (__BYTE_ORDER == __BIG_ENDIAN && !use_64bit)
701 offset = 4;
702
442ea881 703 supply_register (regcache, regno, reg->buf + offset);
186947f7
DJ
704}
705
706static void
442ea881
PA
707mips_collect_register_32bit (struct regcache *regcache,
708 int use_64bit, int regno, unsigned char *buf)
186947f7
DJ
709{
710 union mips_register tmp_reg;
711 int reg32;
712
442ea881 713 mips_collect_register (regcache, use_64bit, regno, &tmp_reg);
186947f7
DJ
714 reg32 = tmp_reg.reg64;
715 memcpy (buf, &reg32, 4);
716}
717
718static void
442ea881
PA
719mips_supply_register_32bit (struct regcache *regcache,
720 int use_64bit, int regno, const unsigned char *buf)
186947f7
DJ
721{
722 union mips_register tmp_reg;
723 int reg32;
724
725 memcpy (&reg32, buf, 4);
726 tmp_reg.reg64 = reg32;
442ea881 727 mips_supply_register (regcache, use_64bit, regno, &tmp_reg);
186947f7
DJ
728}
729
730static void
442ea881 731mips_fill_gregset (struct regcache *regcache, void *buf)
186947f7 732{
1996e237 733 union mips_register *regset = (union mips_register *) buf;
186947f7 734 int i, use_64bit;
3aee8918 735 const struct target_desc *tdesc = regcache->tdesc;
186947f7 736
3aee8918 737 use_64bit = (register_size (tdesc, 0) == 8);
186947f7 738
117ce543 739 for (i = 1; i < 32; i++)
442ea881
PA
740 mips_collect_register (regcache, use_64bit, i, regset + i);
741
742 mips_collect_register (regcache, use_64bit,
3aee8918 743 find_regno (tdesc, "lo"), regset + 32);
442ea881 744 mips_collect_register (regcache, use_64bit,
3aee8918 745 find_regno (tdesc, "hi"), regset + 33);
442ea881 746 mips_collect_register (regcache, use_64bit,
3aee8918 747 find_regno (tdesc, "pc"), regset + 34);
442ea881 748 mips_collect_register (regcache, use_64bit,
3aee8918 749 find_regno (tdesc, "badvaddr"), regset + 35);
442ea881 750 mips_collect_register (regcache, use_64bit,
3aee8918 751 find_regno (tdesc, "status"), regset + 36);
442ea881 752 mips_collect_register (regcache, use_64bit,
3aee8918 753 find_regno (tdesc, "cause"), regset + 37);
442ea881
PA
754
755 mips_collect_register (regcache, use_64bit,
3aee8918 756 find_regno (tdesc, "restart"), regset + 0);
186947f7
DJ
757}
758
759static void
442ea881 760mips_store_gregset (struct regcache *regcache, const void *buf)
186947f7 761{
1996e237 762 const union mips_register *regset = (const union mips_register *) buf;
186947f7
DJ
763 int i, use_64bit;
764
3aee8918 765 use_64bit = (register_size (regcache->tdesc, 0) == 8);
186947f7 766
e4439e43
MR
767 supply_register_by_name_zeroed (regcache, "r0");
768
769 for (i = 1; i < 32; i++)
442ea881
PA
770 mips_supply_register (regcache, use_64bit, i, regset + i);
771
442ea881 772 mips_supply_register (regcache, use_64bit,
3aee8918
PA
773 find_regno (regcache->tdesc, "lo"), regset + 32);
774 mips_supply_register (regcache, use_64bit,
775 find_regno (regcache->tdesc, "hi"), regset + 33);
442ea881 776 mips_supply_register (regcache, use_64bit,
3aee8918 777 find_regno (regcache->tdesc, "pc"), regset + 34);
442ea881 778 mips_supply_register (regcache, use_64bit,
3aee8918
PA
779 find_regno (regcache->tdesc, "badvaddr"), regset + 35);
780 mips_supply_register (regcache, use_64bit,
781 find_regno (regcache->tdesc, "status"), regset + 36);
782 mips_supply_register (regcache, use_64bit,
783 find_regno (regcache->tdesc, "cause"), regset + 37);
442ea881
PA
784
785 mips_supply_register (regcache, use_64bit,
3aee8918 786 find_regno (regcache->tdesc, "restart"), regset + 0);
186947f7
DJ
787}
788
789static void
442ea881 790mips_fill_fpregset (struct regcache *regcache, void *buf)
186947f7 791{
1996e237 792 union mips_register *regset = (union mips_register *) buf;
186947f7
DJ
793 int i, use_64bit, first_fp, big_endian;
794
3aee8918
PA
795 use_64bit = (register_size (regcache->tdesc, 0) == 8);
796 first_fp = find_regno (regcache->tdesc, "f0");
186947f7
DJ
797 big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
798
799 /* See GDB for a discussion of this peculiar layout. */
800 for (i = 0; i < 32; i++)
801 if (use_64bit)
442ea881 802 collect_register (regcache, first_fp + i, regset[i].buf);
186947f7 803 else
442ea881 804 collect_register (regcache, first_fp + i,
186947f7
DJ
805 regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
806
442ea881 807 mips_collect_register_32bit (regcache, use_64bit,
3aee8918
PA
808 find_regno (regcache->tdesc, "fcsr"), regset[32].buf);
809 mips_collect_register_32bit (regcache, use_64bit,
810 find_regno (regcache->tdesc, "fir"),
186947f7
DJ
811 regset[32].buf + 4);
812}
813
814static void
442ea881 815mips_store_fpregset (struct regcache *regcache, const void *buf)
186947f7 816{
1996e237 817 const union mips_register *regset = (const union mips_register *) buf;
186947f7
DJ
818 int i, use_64bit, first_fp, big_endian;
819
3aee8918
PA
820 use_64bit = (register_size (regcache->tdesc, 0) == 8);
821 first_fp = find_regno (regcache->tdesc, "f0");
186947f7
DJ
822 big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
823
824 /* See GDB for a discussion of this peculiar layout. */
825 for (i = 0; i < 32; i++)
826 if (use_64bit)
442ea881 827 supply_register (regcache, first_fp + i, regset[i].buf);
186947f7 828 else
442ea881 829 supply_register (regcache, first_fp + i,
186947f7
DJ
830 regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
831
442ea881 832 mips_supply_register_32bit (regcache, use_64bit,
3aee8918
PA
833 find_regno (regcache->tdesc, "fcsr"),
834 regset[32].buf);
835 mips_supply_register_32bit (regcache, use_64bit,
836 find_regno (regcache->tdesc, "fir"),
186947f7
DJ
837 regset[32].buf + 4);
838}
839#endif /* HAVE_PTRACE_GETREGS */
840
3aee8918 841static struct regset_info mips_regsets[] = {
186947f7 842#ifdef HAVE_PTRACE_GETREGS
1570b33e 843 { PTRACE_GETREGS, PTRACE_SETREGS, 0, 38 * 8, GENERAL_REGS,
186947f7 844 mips_fill_gregset, mips_store_gregset },
1570b33e 845 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, 33 * 8, FP_REGS,
186947f7
DJ
846 mips_fill_fpregset, mips_store_fpregset },
847#endif /* HAVE_PTRACE_GETREGS */
50bc912a 848 NULL_REGSET
186947f7
DJ
849};
850
3aee8918
PA
851static struct regsets_info mips_regsets_info =
852 {
853 mips_regsets, /* regsets */
854 0, /* num_regsets */
855 NULL, /* disabled_regsets */
856 };
857
858static struct usrregs_info mips_dsp_usrregs_info =
859 {
860 mips_dsp_num_regs,
861 mips_dsp_regmap,
862 };
863
864static struct usrregs_info mips_usrregs_info =
865 {
866 mips_num_regs,
867 mips_regmap,
868 };
869
870static struct regs_info dsp_regs_info =
871 {
872 mips_dsp_regset_bitmap,
873 &mips_dsp_usrregs_info,
874 &mips_regsets_info
875 };
876
877static struct regs_info regs_info =
878 {
879 NULL, /* regset_bitmap */
880 &mips_usrregs_info,
881 &mips_regsets_info
882 };
883
884static const struct regs_info *
885mips_regs_info (void)
886{
887 if (have_dsp)
888 return &dsp_regs_info;
889 else
890 return &regs_info;
891}
892
2ec06d2e 893struct linux_target_ops the_low_target = {
1faeff08 894 mips_arch_setup,
3aee8918 895 mips_regs_info,
2ec06d2e
DJ
896 mips_cannot_fetch_register,
897 mips_cannot_store_register,
e4439e43 898 mips_fetch_register,
0d62e5e8
DJ
899 mips_get_pc,
900 mips_set_pc,
dd373349
AT
901 NULL, /* breakpoint_kind_from_pc */
902 mips_sw_breakpoint_from_kind,
fa5308bd 903 NULL, /* get_next_pcs */
0d62e5e8
DJ
904 0,
905 mips_breakpoint_at,
802e8e6d 906 mips_supports_z_point_type,
7a60ad40
YQ
907 mips_insert_point,
908 mips_remove_point,
909 mips_stopped_by_watchpoint,
910 mips_stopped_data_address,
911 NULL,
912 NULL,
913 NULL, /* siginfo_fixup */
914 mips_linux_new_process,
04ec7890 915 mips_linux_delete_process,
7a60ad40 916 mips_linux_new_thread,
466eecee 917 mips_linux_delete_thread,
3a8a0396 918 mips_linux_new_fork,
7a60ad40 919 mips_linux_prepare_to_resume
2ec06d2e 920};
3aee8918
PA
921
922void
923initialize_low_arch (void)
924{
925 /* Initialize the Linux target descriptions. */
926 init_registers_mips_linux ();
927 init_registers_mips_dsp_linux ();
928 init_registers_mips64_linux ();
929 init_registers_mips64_dsp_linux ();
930
931 initialize_regsets_info (&mips_regsets_info);
932}
This page took 1.241298 seconds and 4 git commands to generate.