arm-linux-nat.c: Add cast
[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.
32d0add0 2 Copyright (C) 1995-2015 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
201 ZERO_REGNUM. We also can not set BADVADDR, CAUSE, or FCRIR via
202 ptrace(). */
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
0d62e5e8 245static CORE_ADDR
442ea881 246mips_get_pc (struct regcache *regcache)
0d62e5e8 247{
186947f7 248 union mips_register pc;
442ea881 249 collect_register_by_name (regcache, "pc", pc.buf);
3aee8918 250 return register_size (regcache->tdesc, 0) == 4 ? pc.reg32 : pc.reg64;
0d62e5e8
DJ
251}
252
253static void
442ea881 254mips_set_pc (struct regcache *regcache, CORE_ADDR pc)
0d62e5e8 255{
186947f7 256 union mips_register newpc;
3aee8918 257 if (register_size (regcache->tdesc, 0) == 4)
186947f7
DJ
258 newpc.reg32 = pc;
259 else
260 newpc.reg64 = pc;
261
442ea881 262 supply_register_by_name (regcache, "pc", newpc.buf);
0d62e5e8
DJ
263}
264
265/* Correct in either endianness. */
186947f7 266static const unsigned int mips_breakpoint = 0x0005000d;
0d62e5e8
DJ
267#define mips_breakpoint_len 4
268
dd373349
AT
269/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
270
271static const gdb_byte *
272mips_sw_breakpoint_from_kind (int kind, int *size)
273{
274 *size = mips_breakpoint_len;
275 return (const gdb_byte *) &mips_breakpoint;
276}
277
0d62e5e8
DJ
278/* We only place breakpoints in empty marker functions, and thread locking
279 is outside of the function. So rather than importing software single-step,
280 we can just run until exit. */
281static CORE_ADDR
442ea881 282mips_reinsert_addr (void)
0d62e5e8 283{
0bfdf32f 284 struct regcache *regcache = get_thread_regcache (current_thread, 1);
186947f7 285 union mips_register ra;
442ea881 286 collect_register_by_name (regcache, "r31", ra.buf);
3aee8918 287 return register_size (regcache->tdesc, 0) == 4 ? ra.reg32 : ra.reg64;
0d62e5e8
DJ
288}
289
290static int
291mips_breakpoint_at (CORE_ADDR where)
292{
186947f7 293 unsigned int insn;
0d62e5e8 294
f450004a 295 (*the_target->read_memory) (where, (unsigned char *) &insn, 4);
0d62e5e8
DJ
296 if (insn == mips_breakpoint)
297 return 1;
298
299 /* If necessary, recognize more trap instructions here. GDB only uses the
300 one. */
301 return 0;
302}
303
7a60ad40
YQ
304/* Mark the watch registers of lwp, represented by ENTRY, as changed,
305 if the lwp's process id is *PID_P. */
306
307static int
308update_watch_registers_callback (struct inferior_list_entry *entry,
309 void *pid_p)
310{
d86d4aaf
DE
311 struct thread_info *thread = (struct thread_info *) entry;
312 struct lwp_info *lwp = get_thread_lwp (thread);
7a60ad40
YQ
313 int pid = *(int *) pid_p;
314
315 /* Only update the threads of this process. */
d86d4aaf 316 if (pid_of (thread) == pid)
7a60ad40
YQ
317 {
318 /* The actual update is done later just before resuming the lwp,
319 we just mark that the registers need updating. */
320 lwp->arch_private->watch_registers_changed = 1;
321
322 /* If the lwp isn't stopped, force it to momentarily pause, so
323 we can update its watch registers. */
324 if (!lwp->stopped)
325 linux_stop_lwp (lwp);
326 }
327
328 return 0;
329}
330
331/* This is the implementation of linux_target_ops method
332 new_process. */
333
334static struct arch_process_info *
335mips_linux_new_process (void)
336{
8d749320 337 struct arch_process_info *info = XCNEW (struct arch_process_info);
7a60ad40
YQ
338
339 return info;
340}
341
342/* This is the implementation of linux_target_ops method new_thread.
343 Mark the watch registers as changed, so the threads' copies will
344 be updated. */
345
34c703da
GB
346static void
347mips_linux_new_thread (struct lwp_info *lwp)
7a60ad40 348{
8d749320 349 struct arch_lwp_info *info = XCNEW (struct arch_lwp_info);
7a60ad40
YQ
350
351 info->watch_registers_changed = 1;
352
34c703da 353 lwp->arch_private = info;
7a60ad40
YQ
354}
355
3a8a0396
DB
356/* Create a new mips_watchpoint and add it to the list. */
357
358static void
359mips_add_watchpoint (struct arch_process_info *private, CORE_ADDR addr,
360 int len, int watch_type)
361{
362 struct mips_watchpoint *new_watch;
363 struct mips_watchpoint **pw;
364
8d749320 365 new_watch = XNEW (struct mips_watchpoint);
3a8a0396
DB
366 new_watch->addr = addr;
367 new_watch->len = len;
368 new_watch->type = watch_type;
369 new_watch->next = NULL;
370
371 pw = &private->current_watches;
372 while (*pw != NULL)
373 pw = &(*pw)->next;
374 *pw = new_watch;
375}
376
377/* Hook to call when a new fork is attached. */
378
379static void
380mips_linux_new_fork (struct process_info *parent,
381 struct process_info *child)
382{
383 struct arch_process_info *parent_private;
384 struct arch_process_info *child_private;
385 struct mips_watchpoint *wp;
386
387 /* These are allocated by linux_add_process. */
61a7418c
DB
388 gdb_assert (parent->priv != NULL
389 && parent->priv->arch_private != NULL);
390 gdb_assert (child->priv != NULL
391 && child->priv->arch_private != NULL);
3a8a0396
DB
392
393 /* Linux kernel before 2.6.33 commit
394 72f674d203cd230426437cdcf7dd6f681dad8b0d
395 will inherit hardware debug registers from parent
396 on fork/vfork/clone. Newer Linux kernels create such tasks with
397 zeroed debug registers.
398
399 GDB core assumes the child inherits the watchpoints/hw
400 breakpoints of the parent, and will remove them all from the
401 forked off process. Copy the debug registers mirrors into the
402 new process so that all breakpoints and watchpoints can be
403 removed together. The debug registers mirror will become zeroed
404 in the end before detaching the forked off process, thus making
405 this compatible with older Linux kernels too. */
406
61a7418c
DB
407 parent_private = parent->priv->arch_private;
408 child_private = child->priv->arch_private;
3a8a0396
DB
409
410 child_private->watch_readback_valid = parent_private->watch_readback_valid;
411 child_private->watch_readback = parent_private->watch_readback;
412
413 for (wp = parent_private->current_watches; wp != NULL; wp = wp->next)
414 mips_add_watchpoint (child_private, wp->addr, wp->len, wp->type);
415
416 child_private->watch_mirror = parent_private->watch_mirror;
417}
7a60ad40
YQ
418/* This is the implementation of linux_target_ops method
419 prepare_to_resume. If the watch regs have changed, update the
420 thread's copies. */
421
422static void
423mips_linux_prepare_to_resume (struct lwp_info *lwp)
424{
d86d4aaf 425 ptid_t ptid = ptid_of (get_lwp_thread (lwp));
7a60ad40 426 struct process_info *proc = find_process_pid (ptid_get_pid (ptid));
fe978cb0 427 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
428
429 if (lwp->arch_private->watch_registers_changed)
430 {
431 /* Only update the watch registers if we have set or unset a
432 watchpoint already. */
fe978cb0 433 if (mips_linux_watch_get_num_valid (&priv->watch_mirror) > 0)
7a60ad40
YQ
434 {
435 /* Write the mirrored watch register values. */
436 int tid = ptid_get_lwp (ptid);
437
438 if (-1 == ptrace (PTRACE_SET_WATCH_REGS, tid,
aa58a496 439 &priv->watch_mirror, NULL))
7a60ad40
YQ
440 perror_with_name ("Couldn't write watch register");
441 }
442
443 lwp->arch_private->watch_registers_changed = 0;
444 }
445}
446
802e8e6d
PA
447static int
448mips_supports_z_point_type (char z_type)
449{
450 switch (z_type)
451 {
452 case Z_PACKET_WRITE_WP:
453 case Z_PACKET_READ_WP:
454 case Z_PACKET_ACCESS_WP:
455 return 1;
456 default:
457 return 0;
458 }
459}
460
7a60ad40
YQ
461/* This is the implementation of linux_target_ops method
462 insert_point. */
463
464static int
802e8e6d
PA
465mips_insert_point (enum raw_bkpt_type type, CORE_ADDR addr,
466 int len, struct raw_breakpoint *bp)
7a60ad40
YQ
467{
468 struct process_info *proc = current_process ();
fe978cb0 469 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40 470 struct pt_watch_regs regs;
7a60ad40
YQ
471 int pid;
472 long lwpid;
473 enum target_hw_bp_type watch_type;
474 uint32_t irw;
475
0bfdf32f 476 lwpid = lwpid_of (current_thread);
7a60ad40 477 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
478 &priv->watch_readback,
479 &priv->watch_readback_valid,
7a60ad40
YQ
480 0))
481 return -1;
482
483 if (len <= 0)
484 return -1;
485
fe978cb0 486 regs = priv->watch_readback;
7a60ad40 487 /* Add the current watches. */
fe978cb0 488 mips_linux_watch_populate_regs (priv->current_watches, &regs);
7a60ad40
YQ
489
490 /* Now try to add the new watch. */
802e8e6d 491 watch_type = raw_bkpt_type_to_target_hw_bp_type (type);
7a60ad40
YQ
492 irw = mips_linux_watch_type_to_irw (watch_type);
493 if (!mips_linux_watch_try_one_watch (&regs, addr, len, irw))
494 return -1;
495
496 /* It fit. Stick it on the end of the list. */
3a8a0396 497 mips_add_watchpoint (priv, addr, len, watch_type);
7a60ad40 498
fe978cb0 499 priv->watch_mirror = regs;
7a60ad40
YQ
500
501 /* Only update the threads of this process. */
502 pid = pid_of (proc);
d86d4aaf 503 find_inferior (&all_threads, update_watch_registers_callback, &pid);
7a60ad40
YQ
504
505 return 0;
506}
507
508/* This is the implementation of linux_target_ops method
509 remove_point. */
510
511static int
802e8e6d
PA
512mips_remove_point (enum raw_bkpt_type type, CORE_ADDR addr,
513 int len, struct raw_breakpoint *bp)
7a60ad40
YQ
514{
515 struct process_info *proc = current_process ();
fe978cb0 516 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
517
518 int deleted_one;
519 int pid;
520 enum target_hw_bp_type watch_type;
521
522 struct mips_watchpoint **pw;
523 struct mips_watchpoint *w;
524
7a60ad40 525 /* Search for a known watch that matches. Then unlink and free it. */
802e8e6d 526 watch_type = raw_bkpt_type_to_target_hw_bp_type (type);
7a60ad40 527 deleted_one = 0;
fe978cb0 528 pw = &priv->current_watches;
7a60ad40
YQ
529 while ((w = *pw))
530 {
531 if (w->addr == addr && w->len == len && w->type == watch_type)
532 {
533 *pw = w->next;
534 free (w);
535 deleted_one = 1;
536 break;
537 }
538 pw = &(w->next);
539 }
540
541 if (!deleted_one)
542 return -1; /* We don't know about it, fail doing nothing. */
543
544 /* At this point watch_readback is known to be valid because we
545 could not have added the watch without reading it. */
fe978cb0 546 gdb_assert (priv->watch_readback_valid == 1);
7a60ad40 547
fe978cb0
PA
548 priv->watch_mirror = priv->watch_readback;
549 mips_linux_watch_populate_regs (priv->current_watches,
550 &priv->watch_mirror);
7a60ad40
YQ
551
552 /* Only update the threads of this process. */
553 pid = pid_of (proc);
d86d4aaf 554 find_inferior (&all_threads, update_watch_registers_callback, &pid);
7a60ad40
YQ
555 return 0;
556}
557
558/* This is the implementation of linux_target_ops method
559 stopped_by_watchpoint. The watchhi R and W bits indicate
560 the watch register triggered. */
561
562static int
563mips_stopped_by_watchpoint (void)
564{
565 struct process_info *proc = current_process ();
fe978cb0 566 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
567 int n;
568 int num_valid;
0bfdf32f 569 long lwpid = lwpid_of (current_thread);
7a60ad40
YQ
570
571 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
572 &priv->watch_readback,
573 &priv->watch_readback_valid,
7a60ad40
YQ
574 1))
575 return 0;
576
fe978cb0 577 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback);
7a60ad40
YQ
578
579 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++)
fe978cb0 580 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
581 & (R_MASK | W_MASK))
582 return 1;
583
584 return 0;
585}
586
587/* This is the implementation of linux_target_ops method
588 stopped_data_address. */
589
590static CORE_ADDR
591mips_stopped_data_address (void)
592{
593 struct process_info *proc = current_process ();
fe978cb0 594 struct arch_process_info *priv = proc->priv->arch_private;
7a60ad40
YQ
595 int n;
596 int num_valid;
0bfdf32f 597 long lwpid = lwpid_of (current_thread);
7a60ad40
YQ
598
599 /* On MIPS we don't know the low order 3 bits of the data address.
600 GDB does not support remote targets that can't report the
601 watchpoint address. So, make our best guess; return the starting
602 address of a watchpoint request which overlaps the one that
603 triggered. */
604
605 if (!mips_linux_read_watch_registers (lwpid,
fe978cb0
PA
606 &priv->watch_readback,
607 &priv->watch_readback_valid,
7a60ad40
YQ
608 0))
609 return 0;
610
fe978cb0 611 num_valid = mips_linux_watch_get_num_valid (&priv->watch_readback);
7a60ad40
YQ
612
613 for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++)
fe978cb0 614 if (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
615 & (R_MASK | W_MASK))
616 {
617 CORE_ADDR t_low, t_hi;
618 int t_irw;
619 struct mips_watchpoint *watch;
620
fe978cb0 621 t_low = mips_linux_watch_get_watchlo (&priv->watch_readback, n);
7a60ad40 622 t_irw = t_low & IRW_MASK;
fe978cb0 623 t_hi = (mips_linux_watch_get_watchhi (&priv->watch_readback, n)
7a60ad40
YQ
624 | IRW_MASK);
625 t_low &= ~(CORE_ADDR)t_hi;
626
fe978cb0 627 for (watch = priv->current_watches;
7a60ad40
YQ
628 watch != NULL;
629 watch = watch->next)
630 {
631 CORE_ADDR addr = watch->addr;
632 CORE_ADDR last_byte = addr + watch->len - 1;
633
634 if ((t_irw & mips_linux_watch_type_to_irw (watch->type)) == 0)
635 {
636 /* Different type. */
637 continue;
638 }
639 /* Check for overlap of even a single byte. */
640 if (last_byte >= t_low && addr <= t_low + t_hi)
641 return addr;
642 }
643 }
644
645 /* Shouldn't happen. */
646 return 0;
647}
648
21b0f40c
DJ
649/* Fetch the thread-local storage pointer for libthread_db. */
650
651ps_err_e
652ps_get_thread_area (const struct ps_prochandle *ph,
1b3f6016 653 lwpid_t lwpid, int idx, void **base)
21b0f40c
DJ
654{
655 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
656 return PS_ERR;
657
658 /* IDX is the bias from the thread pointer to the beginning of the
659 thread descriptor. It has to be subtracted due to implementation
660 quirks in libthread_db. */
661 *base = (void *) ((char *)*base - idx);
662
663 return PS_OK;
664}
665
186947f7
DJ
666#ifdef HAVE_PTRACE_GETREGS
667
668static void
442ea881
PA
669mips_collect_register (struct regcache *regcache,
670 int use_64bit, int regno, union mips_register *reg)
186947f7
DJ
671{
672 union mips_register tmp_reg;
673
674 if (use_64bit)
675 {
442ea881 676 collect_register (regcache, regno, &tmp_reg.reg64);
186947f7
DJ
677 *reg = tmp_reg;
678 }
679 else
680 {
442ea881 681 collect_register (regcache, regno, &tmp_reg.reg32);
186947f7
DJ
682 reg->reg64 = tmp_reg.reg32;
683 }
684}
685
686static void
442ea881
PA
687mips_supply_register (struct regcache *regcache,
688 int use_64bit, int regno, const union mips_register *reg)
186947f7
DJ
689{
690 int offset = 0;
691
692 /* For big-endian 32-bit targets, ignore the high four bytes of each
693 eight-byte slot. */
694 if (__BYTE_ORDER == __BIG_ENDIAN && !use_64bit)
695 offset = 4;
696
442ea881 697 supply_register (regcache, regno, reg->buf + offset);
186947f7
DJ
698}
699
700static void
442ea881
PA
701mips_collect_register_32bit (struct regcache *regcache,
702 int use_64bit, int regno, unsigned char *buf)
186947f7
DJ
703{
704 union mips_register tmp_reg;
705 int reg32;
706
442ea881 707 mips_collect_register (regcache, use_64bit, regno, &tmp_reg);
186947f7
DJ
708 reg32 = tmp_reg.reg64;
709 memcpy (buf, &reg32, 4);
710}
711
712static void
442ea881
PA
713mips_supply_register_32bit (struct regcache *regcache,
714 int use_64bit, int regno, const unsigned char *buf)
186947f7
DJ
715{
716 union mips_register tmp_reg;
717 int reg32;
718
719 memcpy (&reg32, buf, 4);
720 tmp_reg.reg64 = reg32;
442ea881 721 mips_supply_register (regcache, use_64bit, regno, &tmp_reg);
186947f7
DJ
722}
723
724static void
442ea881 725mips_fill_gregset (struct regcache *regcache, void *buf)
186947f7
DJ
726{
727 union mips_register *regset = buf;
728 int i, use_64bit;
3aee8918 729 const struct target_desc *tdesc = regcache->tdesc;
186947f7 730
3aee8918 731 use_64bit = (register_size (tdesc, 0) == 8);
186947f7 732
117ce543 733 for (i = 1; i < 32; i++)
442ea881
PA
734 mips_collect_register (regcache, use_64bit, i, regset + i);
735
736 mips_collect_register (regcache, use_64bit,
3aee8918 737 find_regno (tdesc, "lo"), regset + 32);
442ea881 738 mips_collect_register (regcache, use_64bit,
3aee8918 739 find_regno (tdesc, "hi"), regset + 33);
442ea881 740 mips_collect_register (regcache, use_64bit,
3aee8918 741 find_regno (tdesc, "pc"), regset + 34);
442ea881 742 mips_collect_register (regcache, use_64bit,
3aee8918 743 find_regno (tdesc, "badvaddr"), regset + 35);
442ea881 744 mips_collect_register (regcache, use_64bit,
3aee8918 745 find_regno (tdesc, "status"), regset + 36);
442ea881 746 mips_collect_register (regcache, use_64bit,
3aee8918 747 find_regno (tdesc, "cause"), regset + 37);
442ea881
PA
748
749 mips_collect_register (regcache, use_64bit,
3aee8918 750 find_regno (tdesc, "restart"), regset + 0);
186947f7
DJ
751}
752
753static void
442ea881 754mips_store_gregset (struct regcache *regcache, const void *buf)
186947f7
DJ
755{
756 const union mips_register *regset = buf;
757 int i, use_64bit;
758
3aee8918 759 use_64bit = (register_size (regcache->tdesc, 0) == 8);
186947f7
DJ
760
761 for (i = 0; i < 32; i++)
442ea881
PA
762 mips_supply_register (regcache, use_64bit, i, regset + i);
763
442ea881 764 mips_supply_register (regcache, use_64bit,
3aee8918
PA
765 find_regno (regcache->tdesc, "lo"), regset + 32);
766 mips_supply_register (regcache, use_64bit,
767 find_regno (regcache->tdesc, "hi"), regset + 33);
442ea881 768 mips_supply_register (regcache, use_64bit,
3aee8918 769 find_regno (regcache->tdesc, "pc"), regset + 34);
442ea881 770 mips_supply_register (regcache, use_64bit,
3aee8918
PA
771 find_regno (regcache->tdesc, "badvaddr"), regset + 35);
772 mips_supply_register (regcache, use_64bit,
773 find_regno (regcache->tdesc, "status"), regset + 36);
774 mips_supply_register (regcache, use_64bit,
775 find_regno (regcache->tdesc, "cause"), regset + 37);
442ea881
PA
776
777 mips_supply_register (regcache, use_64bit,
3aee8918 778 find_regno (regcache->tdesc, "restart"), regset + 0);
186947f7
DJ
779}
780
781static void
442ea881 782mips_fill_fpregset (struct regcache *regcache, void *buf)
186947f7
DJ
783{
784 union mips_register *regset = buf;
785 int i, use_64bit, first_fp, big_endian;
786
3aee8918
PA
787 use_64bit = (register_size (regcache->tdesc, 0) == 8);
788 first_fp = find_regno (regcache->tdesc, "f0");
186947f7
DJ
789 big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
790
791 /* See GDB for a discussion of this peculiar layout. */
792 for (i = 0; i < 32; i++)
793 if (use_64bit)
442ea881 794 collect_register (regcache, first_fp + i, regset[i].buf);
186947f7 795 else
442ea881 796 collect_register (regcache, first_fp + i,
186947f7
DJ
797 regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
798
442ea881 799 mips_collect_register_32bit (regcache, use_64bit,
3aee8918
PA
800 find_regno (regcache->tdesc, "fcsr"), regset[32].buf);
801 mips_collect_register_32bit (regcache, use_64bit,
802 find_regno (regcache->tdesc, "fir"),
186947f7
DJ
803 regset[32].buf + 4);
804}
805
806static void
442ea881 807mips_store_fpregset (struct regcache *regcache, const void *buf)
186947f7
DJ
808{
809 const union mips_register *regset = buf;
810 int i, use_64bit, first_fp, big_endian;
811
3aee8918
PA
812 use_64bit = (register_size (regcache->tdesc, 0) == 8);
813 first_fp = find_regno (regcache->tdesc, "f0");
186947f7
DJ
814 big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
815
816 /* See GDB for a discussion of this peculiar layout. */
817 for (i = 0; i < 32; i++)
818 if (use_64bit)
442ea881 819 supply_register (regcache, first_fp + i, regset[i].buf);
186947f7 820 else
442ea881 821 supply_register (regcache, first_fp + i,
186947f7
DJ
822 regset[i & ~1].buf + 4 * (big_endian != (i & 1)));
823
442ea881 824 mips_supply_register_32bit (regcache, use_64bit,
3aee8918
PA
825 find_regno (regcache->tdesc, "fcsr"),
826 regset[32].buf);
827 mips_supply_register_32bit (regcache, use_64bit,
828 find_regno (regcache->tdesc, "fir"),
186947f7
DJ
829 regset[32].buf + 4);
830}
831#endif /* HAVE_PTRACE_GETREGS */
832
3aee8918 833static struct regset_info mips_regsets[] = {
186947f7 834#ifdef HAVE_PTRACE_GETREGS
1570b33e 835 { PTRACE_GETREGS, PTRACE_SETREGS, 0, 38 * 8, GENERAL_REGS,
186947f7 836 mips_fill_gregset, mips_store_gregset },
1570b33e 837 { PTRACE_GETFPREGS, PTRACE_SETFPREGS, 0, 33 * 8, FP_REGS,
186947f7
DJ
838 mips_fill_fpregset, mips_store_fpregset },
839#endif /* HAVE_PTRACE_GETREGS */
50bc912a 840 NULL_REGSET
186947f7
DJ
841};
842
3aee8918
PA
843static struct regsets_info mips_regsets_info =
844 {
845 mips_regsets, /* regsets */
846 0, /* num_regsets */
847 NULL, /* disabled_regsets */
848 };
849
850static struct usrregs_info mips_dsp_usrregs_info =
851 {
852 mips_dsp_num_regs,
853 mips_dsp_regmap,
854 };
855
856static struct usrregs_info mips_usrregs_info =
857 {
858 mips_num_regs,
859 mips_regmap,
860 };
861
862static struct regs_info dsp_regs_info =
863 {
864 mips_dsp_regset_bitmap,
865 &mips_dsp_usrregs_info,
866 &mips_regsets_info
867 };
868
869static struct regs_info regs_info =
870 {
871 NULL, /* regset_bitmap */
872 &mips_usrregs_info,
873 &mips_regsets_info
874 };
875
876static const struct regs_info *
877mips_regs_info (void)
878{
879 if (have_dsp)
880 return &dsp_regs_info;
881 else
882 return &regs_info;
883}
884
2ec06d2e 885struct linux_target_ops the_low_target = {
1faeff08 886 mips_arch_setup,
3aee8918 887 mips_regs_info,
2ec06d2e
DJ
888 mips_cannot_fetch_register,
889 mips_cannot_store_register,
c14dfd32 890 NULL, /* fetch_register */
0d62e5e8
DJ
891 mips_get_pc,
892 mips_set_pc,
dd373349
AT
893 NULL, /* breakpoint_kind_from_pc */
894 mips_sw_breakpoint_from_kind,
0d62e5e8
DJ
895 mips_reinsert_addr,
896 0,
897 mips_breakpoint_at,
802e8e6d 898 mips_supports_z_point_type,
7a60ad40
YQ
899 mips_insert_point,
900 mips_remove_point,
901 mips_stopped_by_watchpoint,
902 mips_stopped_data_address,
903 NULL,
904 NULL,
905 NULL, /* siginfo_fixup */
906 mips_linux_new_process,
907 mips_linux_new_thread,
3a8a0396 908 mips_linux_new_fork,
7a60ad40 909 mips_linux_prepare_to_resume
2ec06d2e 910};
3aee8918
PA
911
912void
913initialize_low_arch (void)
914{
915 /* Initialize the Linux target descriptions. */
916 init_registers_mips_linux ();
917 init_registers_mips_dsp_linux ();
918 init_registers_mips64_linux ();
919 init_registers_mips64_dsp_linux ();
920
921 initialize_regsets_info (&mips_regsets_info);
922}
This page took 1.381551 seconds and 4 git commands to generate.