1 /* GNU/Linux/MIPS specific low level interface, for the remote server for GDB.
2 Copyright (C) 1995-2017 Free Software Foundation, Inc.
4 This file is part of GDB.
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
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
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.
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "linux-low.h"
22 #include "nat/gdb_ptrace.h"
25 #include "nat/mips-linux-watch.h"
26 #include "gdb_proc_service.h"
28 /* Defined in auto-generated file mips-linux.c. */
29 void init_registers_mips_linux (void);
30 extern const struct target_desc
*tdesc_mips_linux
;
32 /* Defined in auto-generated file mips-dsp-linux.c. */
33 void init_registers_mips_dsp_linux (void);
34 extern const struct target_desc
*tdesc_mips_dsp_linux
;
36 /* Defined in auto-generated file mips64-linux.c. */
37 void init_registers_mips64_linux (void);
38 extern const struct target_desc
*tdesc_mips64_linux
;
40 /* Defined in auto-generated file mips64-dsp-linux.c. */
41 void init_registers_mips64_dsp_linux (void);
42 extern const struct target_desc
*tdesc_mips64_dsp_linux
;
45 #define tdesc_mips_linux tdesc_mips64_linux
46 #define tdesc_mips_dsp_linux tdesc_mips64_dsp_linux
49 #ifndef PTRACE_GET_THREAD_AREA
50 #define PTRACE_GET_THREAD_AREA 25
57 #define mips_num_regs 73
58 #define mips_dsp_num_regs 80
60 #include <asm/ptrace.h>
64 #define DSP_CONTROL 77
71 /* Deliberately signed, for proper sign extension. */
76 /* Return the ptrace ``address'' of register REGNO. */
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, \
84 -1, MMLO, MMHI, BADVADDR, CAUSE, PC, \
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, \
96 #define mips_dsp_regs \
97 DSP_BASE, DSP_BASE + 1, DSP_BASE + 2, DSP_BASE + 3, \
98 DSP_BASE + 4, DSP_BASE + 5, \
101 static int mips_regmap
[mips_num_regs
] = {
106 static int mips_dsp_regmap
[mips_dsp_num_regs
] = {
112 /* DSP registers are not in any regset and can only be accessed
115 static unsigned char mips_dsp_regset_bitmap
[(mips_dsp_num_regs
+ 7) / 8] = {
116 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80
119 static int have_dsp
= -1;
121 /* Try peeking at an arbitrarily chosen DSP register and pick the available
122 user register set accordingly. */
124 static const struct target_desc
*
125 mips_read_description (void)
129 int pid
= lwpid_of (current_thread
);
132 ptrace (PTRACE_PEEKUSER
, pid
, DSP_CONTROL
, 0);
142 perror_with_name ("ptrace");
147 return have_dsp
? tdesc_mips_dsp_linux
: tdesc_mips_linux
;
151 mips_arch_setup (void)
153 current_process ()->tdesc
= mips_read_description ();
156 static struct usrregs_info
*
157 get_usrregs_info (void)
159 const struct regs_info
*regs_info
= the_low_target
.regs_info ();
161 return regs_info
->usrregs
;
164 /* Per-process arch-specific data we want to keep. */
166 struct arch_process_info
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
171 0 if we need to read the watch_readback. */
173 int watch_readback_valid
;
175 /* Cached watch register read values. */
177 struct pt_watch_regs watch_readback
;
179 /* Current watchpoint requests for this process. */
181 struct mips_watchpoint
*current_watches
;
183 /* The current set of watch register values for writing the
186 struct pt_watch_regs watch_mirror
;
189 /* Per-thread arch-specific data we want to keep. */
193 /* Non-zero if our copy differs from what's recorded in the thread. */
194 int watch_registers_changed
;
197 /* From mips-linux-nat.c. */
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
205 mips_cannot_fetch_register (int regno
)
207 const struct target_desc
*tdesc
;
209 if (get_usrregs_info ()->regmap
[regno
] == -1)
212 tdesc
= current_process ()->tdesc
;
214 if (find_regno (tdesc
, "r0") == regno
)
221 mips_cannot_store_register (int regno
)
223 const struct target_desc
*tdesc
;
225 if (get_usrregs_info ()->regmap
[regno
] == -1)
228 tdesc
= current_process ()->tdesc
;
230 if (find_regno (tdesc
, "r0") == regno
)
233 if (find_regno (tdesc
, "cause") == regno
)
236 if (find_regno (tdesc
, "badvaddr") == regno
)
239 if (find_regno (tdesc
, "fir") == regno
)
246 mips_get_pc (struct regcache
*regcache
)
248 union mips_register pc
;
249 collect_register_by_name (regcache
, "pc", pc
.buf
);
250 return register_size (regcache
->tdesc
, 0) == 4 ? pc
.reg32
: pc
.reg64
;
254 mips_set_pc (struct regcache
*regcache
, CORE_ADDR pc
)
256 union mips_register newpc
;
257 if (register_size (regcache
->tdesc
, 0) == 4)
262 supply_register_by_name (regcache
, "pc", newpc
.buf
);
265 /* Correct in either endianness. */
266 static const unsigned int mips_breakpoint
= 0x0005000d;
267 #define mips_breakpoint_len 4
269 /* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
271 static const gdb_byte
*
272 mips_sw_breakpoint_from_kind (int kind
, int *size
)
274 *size
= mips_breakpoint_len
;
275 return (const gdb_byte
*) &mips_breakpoint
;
279 mips_breakpoint_at (CORE_ADDR where
)
283 (*the_target
->read_memory
) (where
, (unsigned char *) &insn
, 4);
284 if (insn
== mips_breakpoint
)
287 /* If necessary, recognize more trap instructions here. GDB only uses the
292 /* Mark the watch registers of lwp, represented by ENTRY, as changed,
293 if the lwp's process id is *PID_P. */
296 update_watch_registers_callback (struct inferior_list_entry
*entry
,
299 struct thread_info
*thread
= (struct thread_info
*) entry
;
300 struct lwp_info
*lwp
= get_thread_lwp (thread
);
301 int pid
= *(int *) pid_p
;
303 /* Only update the threads of this process. */
304 if (pid_of (thread
) == pid
)
306 /* The actual update is done later just before resuming the lwp,
307 we just mark that the registers need updating. */
308 lwp
->arch_private
->watch_registers_changed
= 1;
310 /* If the lwp isn't stopped, force it to momentarily pause, so
311 we can update its watch registers. */
313 linux_stop_lwp (lwp
);
319 /* This is the implementation of linux_target_ops method
322 static struct arch_process_info
*
323 mips_linux_new_process (void)
325 struct arch_process_info
*info
= XCNEW (struct arch_process_info
);
330 /* This is the implementation of linux_target_ops method new_thread.
331 Mark the watch registers as changed, so the threads' copies will
335 mips_linux_new_thread (struct lwp_info
*lwp
)
337 struct arch_lwp_info
*info
= XCNEW (struct arch_lwp_info
);
339 info
->watch_registers_changed
= 1;
341 lwp
->arch_private
= info
;
344 /* Create a new mips_watchpoint and add it to the list. */
347 mips_add_watchpoint (struct arch_process_info
*priv
, CORE_ADDR addr
, int len
,
348 enum target_hw_bp_type watch_type
)
350 struct mips_watchpoint
*new_watch
;
351 struct mips_watchpoint
**pw
;
353 new_watch
= XNEW (struct mips_watchpoint
);
354 new_watch
->addr
= addr
;
355 new_watch
->len
= len
;
356 new_watch
->type
= watch_type
;
357 new_watch
->next
= NULL
;
359 pw
= &priv
->current_watches
;
365 /* Hook to call when a new fork is attached. */
368 mips_linux_new_fork (struct process_info
*parent
,
369 struct process_info
*child
)
371 struct arch_process_info
*parent_private
;
372 struct arch_process_info
*child_private
;
373 struct mips_watchpoint
*wp
;
375 /* These are allocated by linux_add_process. */
376 gdb_assert (parent
->priv
!= NULL
377 && parent
->priv
->arch_private
!= NULL
);
378 gdb_assert (child
->priv
!= NULL
379 && child
->priv
->arch_private
!= NULL
);
381 /* Linux kernel before 2.6.33 commit
382 72f674d203cd230426437cdcf7dd6f681dad8b0d
383 will inherit hardware debug registers from parent
384 on fork/vfork/clone. Newer Linux kernels create such tasks with
385 zeroed debug registers.
387 GDB core assumes the child inherits the watchpoints/hw
388 breakpoints of the parent, and will remove them all from the
389 forked off process. Copy the debug registers mirrors into the
390 new process so that all breakpoints and watchpoints can be
391 removed together. The debug registers mirror will become zeroed
392 in the end before detaching the forked off process, thus making
393 this compatible with older Linux kernels too. */
395 parent_private
= parent
->priv
->arch_private
;
396 child_private
= child
->priv
->arch_private
;
398 child_private
->watch_readback_valid
= parent_private
->watch_readback_valid
;
399 child_private
->watch_readback
= parent_private
->watch_readback
;
401 for (wp
= parent_private
->current_watches
; wp
!= NULL
; wp
= wp
->next
)
402 mips_add_watchpoint (child_private
, wp
->addr
, wp
->len
, wp
->type
);
404 child_private
->watch_mirror
= parent_private
->watch_mirror
;
406 /* This is the implementation of linux_target_ops method
407 prepare_to_resume. If the watch regs have changed, update the
411 mips_linux_prepare_to_resume (struct lwp_info
*lwp
)
413 ptid_t ptid
= ptid_of (get_lwp_thread (lwp
));
414 struct process_info
*proc
= find_process_pid (ptid_get_pid (ptid
));
415 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
417 if (lwp
->arch_private
->watch_registers_changed
)
419 /* Only update the watch registers if we have set or unset a
420 watchpoint already. */
421 if (mips_linux_watch_get_num_valid (&priv
->watch_mirror
) > 0)
423 /* Write the mirrored watch register values. */
424 int tid
= ptid_get_lwp (ptid
);
426 if (-1 == ptrace (PTRACE_SET_WATCH_REGS
, tid
,
427 &priv
->watch_mirror
, NULL
))
428 perror_with_name ("Couldn't write watch register");
431 lwp
->arch_private
->watch_registers_changed
= 0;
436 mips_supports_z_point_type (char z_type
)
440 case Z_PACKET_WRITE_WP
:
441 case Z_PACKET_READ_WP
:
442 case Z_PACKET_ACCESS_WP
:
449 /* This is the implementation of linux_target_ops method
453 mips_insert_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
454 int len
, struct raw_breakpoint
*bp
)
456 struct process_info
*proc
= current_process ();
457 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
458 struct pt_watch_regs regs
;
461 enum target_hw_bp_type watch_type
;
464 lwpid
= lwpid_of (current_thread
);
465 if (!mips_linux_read_watch_registers (lwpid
,
466 &priv
->watch_readback
,
467 &priv
->watch_readback_valid
,
474 regs
= priv
->watch_readback
;
475 /* Add the current watches. */
476 mips_linux_watch_populate_regs (priv
->current_watches
, ®s
);
478 /* Now try to add the new watch. */
479 watch_type
= raw_bkpt_type_to_target_hw_bp_type (type
);
480 irw
= mips_linux_watch_type_to_irw (watch_type
);
481 if (!mips_linux_watch_try_one_watch (®s
, addr
, len
, irw
))
484 /* It fit. Stick it on the end of the list. */
485 mips_add_watchpoint (priv
, addr
, len
, watch_type
);
487 priv
->watch_mirror
= regs
;
489 /* Only update the threads of this process. */
491 find_inferior (&all_threads
, update_watch_registers_callback
, &pid
);
496 /* This is the implementation of linux_target_ops method
500 mips_remove_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
501 int len
, struct raw_breakpoint
*bp
)
503 struct process_info
*proc
= current_process ();
504 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
508 enum target_hw_bp_type watch_type
;
510 struct mips_watchpoint
**pw
;
511 struct mips_watchpoint
*w
;
513 /* Search for a known watch that matches. Then unlink and free it. */
514 watch_type
= raw_bkpt_type_to_target_hw_bp_type (type
);
516 pw
= &priv
->current_watches
;
519 if (w
->addr
== addr
&& w
->len
== len
&& w
->type
== watch_type
)
530 return -1; /* We don't know about it, fail doing nothing. */
532 /* At this point watch_readback is known to be valid because we
533 could not have added the watch without reading it. */
534 gdb_assert (priv
->watch_readback_valid
== 1);
536 priv
->watch_mirror
= priv
->watch_readback
;
537 mips_linux_watch_populate_regs (priv
->current_watches
,
538 &priv
->watch_mirror
);
540 /* Only update the threads of this process. */
542 find_inferior (&all_threads
, update_watch_registers_callback
, &pid
);
546 /* This is the implementation of linux_target_ops method
547 stopped_by_watchpoint. The watchhi R and W bits indicate
548 the watch register triggered. */
551 mips_stopped_by_watchpoint (void)
553 struct process_info
*proc
= current_process ();
554 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
557 long lwpid
= lwpid_of (current_thread
);
559 if (!mips_linux_read_watch_registers (lwpid
,
560 &priv
->watch_readback
,
561 &priv
->watch_readback_valid
,
565 num_valid
= mips_linux_watch_get_num_valid (&priv
->watch_readback
);
567 for (n
= 0; n
< MAX_DEBUG_REGISTER
&& n
< num_valid
; n
++)
568 if (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
575 /* This is the implementation of linux_target_ops method
576 stopped_data_address. */
579 mips_stopped_data_address (void)
581 struct process_info
*proc
= current_process ();
582 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
585 long lwpid
= lwpid_of (current_thread
);
587 /* On MIPS we don't know the low order 3 bits of the data address.
588 GDB does not support remote targets that can't report the
589 watchpoint address. So, make our best guess; return the starting
590 address of a watchpoint request which overlaps the one that
593 if (!mips_linux_read_watch_registers (lwpid
,
594 &priv
->watch_readback
,
595 &priv
->watch_readback_valid
,
599 num_valid
= mips_linux_watch_get_num_valid (&priv
->watch_readback
);
601 for (n
= 0; n
< MAX_DEBUG_REGISTER
&& n
< num_valid
; n
++)
602 if (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
605 CORE_ADDR t_low
, t_hi
;
607 struct mips_watchpoint
*watch
;
609 t_low
= mips_linux_watch_get_watchlo (&priv
->watch_readback
, n
);
610 t_irw
= t_low
& IRW_MASK
;
611 t_hi
= (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
613 t_low
&= ~(CORE_ADDR
)t_hi
;
615 for (watch
= priv
->current_watches
;
619 CORE_ADDR addr
= watch
->addr
;
620 CORE_ADDR last_byte
= addr
+ watch
->len
- 1;
622 if ((t_irw
& mips_linux_watch_type_to_irw (watch
->type
)) == 0)
624 /* Different type. */
627 /* Check for overlap of even a single byte. */
628 if (last_byte
>= t_low
&& addr
<= t_low
+ t_hi
)
633 /* Shouldn't happen. */
637 /* Fetch the thread-local storage pointer for libthread_db. */
640 ps_get_thread_area (struct ps_prochandle
*ph
,
641 lwpid_t lwpid
, int idx
, void **base
)
643 if (ptrace (PTRACE_GET_THREAD_AREA
, lwpid
, NULL
, base
) != 0)
646 /* IDX is the bias from the thread pointer to the beginning of the
647 thread descriptor. It has to be subtracted due to implementation
648 quirks in libthread_db. */
649 *base
= (void *) ((char *)*base
- idx
);
654 #ifdef HAVE_PTRACE_GETREGS
657 mips_collect_register (struct regcache
*regcache
,
658 int use_64bit
, int regno
, union mips_register
*reg
)
660 union mips_register tmp_reg
;
664 collect_register (regcache
, regno
, &tmp_reg
.reg64
);
669 collect_register (regcache
, regno
, &tmp_reg
.reg32
);
670 reg
->reg64
= tmp_reg
.reg32
;
675 mips_supply_register (struct regcache
*regcache
,
676 int use_64bit
, int regno
, const union mips_register
*reg
)
680 /* For big-endian 32-bit targets, ignore the high four bytes of each
682 if (__BYTE_ORDER
== __BIG_ENDIAN
&& !use_64bit
)
685 supply_register (regcache
, regno
, reg
->buf
+ offset
);
689 mips_collect_register_32bit (struct regcache
*regcache
,
690 int use_64bit
, int regno
, unsigned char *buf
)
692 union mips_register tmp_reg
;
695 mips_collect_register (regcache
, use_64bit
, regno
, &tmp_reg
);
696 reg32
= tmp_reg
.reg64
;
697 memcpy (buf
, ®32
, 4);
701 mips_supply_register_32bit (struct regcache
*regcache
,
702 int use_64bit
, int regno
, const unsigned char *buf
)
704 union mips_register tmp_reg
;
707 memcpy (®32
, buf
, 4);
708 tmp_reg
.reg64
= reg32
;
709 mips_supply_register (regcache
, use_64bit
, regno
, &tmp_reg
);
713 mips_fill_gregset (struct regcache
*regcache
, void *buf
)
715 union mips_register
*regset
= (union mips_register
*) buf
;
717 const struct target_desc
*tdesc
= regcache
->tdesc
;
719 use_64bit
= (register_size (tdesc
, 0) == 8);
721 for (i
= 1; i
< 32; i
++)
722 mips_collect_register (regcache
, use_64bit
, i
, regset
+ i
);
724 mips_collect_register (regcache
, use_64bit
,
725 find_regno (tdesc
, "lo"), regset
+ 32);
726 mips_collect_register (regcache
, use_64bit
,
727 find_regno (tdesc
, "hi"), regset
+ 33);
728 mips_collect_register (regcache
, use_64bit
,
729 find_regno (tdesc
, "pc"), regset
+ 34);
730 mips_collect_register (regcache
, use_64bit
,
731 find_regno (tdesc
, "badvaddr"), regset
+ 35);
732 mips_collect_register (regcache
, use_64bit
,
733 find_regno (tdesc
, "status"), regset
+ 36);
734 mips_collect_register (regcache
, use_64bit
,
735 find_regno (tdesc
, "cause"), regset
+ 37);
737 mips_collect_register (regcache
, use_64bit
,
738 find_regno (tdesc
, "restart"), regset
+ 0);
742 mips_store_gregset (struct regcache
*regcache
, const void *buf
)
744 const union mips_register
*regset
= (const union mips_register
*) buf
;
747 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
749 for (i
= 0; i
< 32; i
++)
750 mips_supply_register (regcache
, use_64bit
, i
, regset
+ i
);
752 mips_supply_register (regcache
, use_64bit
,
753 find_regno (regcache
->tdesc
, "lo"), regset
+ 32);
754 mips_supply_register (regcache
, use_64bit
,
755 find_regno (regcache
->tdesc
, "hi"), regset
+ 33);
756 mips_supply_register (regcache
, use_64bit
,
757 find_regno (regcache
->tdesc
, "pc"), regset
+ 34);
758 mips_supply_register (regcache
, use_64bit
,
759 find_regno (regcache
->tdesc
, "badvaddr"), regset
+ 35);
760 mips_supply_register (regcache
, use_64bit
,
761 find_regno (regcache
->tdesc
, "status"), regset
+ 36);
762 mips_supply_register (regcache
, use_64bit
,
763 find_regno (regcache
->tdesc
, "cause"), regset
+ 37);
765 mips_supply_register (regcache
, use_64bit
,
766 find_regno (regcache
->tdesc
, "restart"), regset
+ 0);
770 mips_fill_fpregset (struct regcache
*regcache
, void *buf
)
772 union mips_register
*regset
= (union mips_register
*) buf
;
773 int i
, use_64bit
, first_fp
, big_endian
;
775 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
776 first_fp
= find_regno (regcache
->tdesc
, "f0");
777 big_endian
= (__BYTE_ORDER
== __BIG_ENDIAN
);
779 /* See GDB for a discussion of this peculiar layout. */
780 for (i
= 0; i
< 32; i
++)
782 collect_register (regcache
, first_fp
+ i
, regset
[i
].buf
);
784 collect_register (regcache
, first_fp
+ i
,
785 regset
[i
& ~1].buf
+ 4 * (big_endian
!= (i
& 1)));
787 mips_collect_register_32bit (regcache
, use_64bit
,
788 find_regno (regcache
->tdesc
, "fcsr"), regset
[32].buf
);
789 mips_collect_register_32bit (regcache
, use_64bit
,
790 find_regno (regcache
->tdesc
, "fir"),
795 mips_store_fpregset (struct regcache
*regcache
, const void *buf
)
797 const union mips_register
*regset
= (const union mips_register
*) buf
;
798 int i
, use_64bit
, first_fp
, big_endian
;
800 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
801 first_fp
= find_regno (regcache
->tdesc
, "f0");
802 big_endian
= (__BYTE_ORDER
== __BIG_ENDIAN
);
804 /* See GDB for a discussion of this peculiar layout. */
805 for (i
= 0; i
< 32; i
++)
807 supply_register (regcache
, first_fp
+ i
, regset
[i
].buf
);
809 supply_register (regcache
, first_fp
+ i
,
810 regset
[i
& ~1].buf
+ 4 * (big_endian
!= (i
& 1)));
812 mips_supply_register_32bit (regcache
, use_64bit
,
813 find_regno (regcache
->tdesc
, "fcsr"),
815 mips_supply_register_32bit (regcache
, use_64bit
,
816 find_regno (regcache
->tdesc
, "fir"),
819 #endif /* HAVE_PTRACE_GETREGS */
821 static struct regset_info mips_regsets
[] = {
822 #ifdef HAVE_PTRACE_GETREGS
823 { PTRACE_GETREGS
, PTRACE_SETREGS
, 0, 38 * 8, GENERAL_REGS
,
824 mips_fill_gregset
, mips_store_gregset
},
825 { PTRACE_GETFPREGS
, PTRACE_SETFPREGS
, 0, 33 * 8, FP_REGS
,
826 mips_fill_fpregset
, mips_store_fpregset
},
827 #endif /* HAVE_PTRACE_GETREGS */
831 static struct regsets_info mips_regsets_info
=
833 mips_regsets
, /* regsets */
835 NULL
, /* disabled_regsets */
838 static struct usrregs_info mips_dsp_usrregs_info
=
844 static struct usrregs_info mips_usrregs_info
=
850 static struct regs_info dsp_regs_info
=
852 mips_dsp_regset_bitmap
,
853 &mips_dsp_usrregs_info
,
857 static struct regs_info regs_info
=
859 NULL
, /* regset_bitmap */
864 static const struct regs_info
*
865 mips_regs_info (void)
868 return &dsp_regs_info
;
873 struct linux_target_ops the_low_target
= {
876 mips_cannot_fetch_register
,
877 mips_cannot_store_register
,
878 NULL
, /* fetch_register */
881 NULL
, /* breakpoint_kind_from_pc */
882 mips_sw_breakpoint_from_kind
,
883 NULL
, /* get_next_pcs */
886 mips_supports_z_point_type
,
889 mips_stopped_by_watchpoint
,
890 mips_stopped_data_address
,
893 NULL
, /* siginfo_fixup */
894 mips_linux_new_process
,
895 mips_linux_new_thread
,
897 mips_linux_prepare_to_resume
901 initialize_low_arch (void)
903 /* Initialize the Linux target descriptions. */
904 init_registers_mips_linux ();
905 init_registers_mips_dsp_linux ();
906 init_registers_mips64_linux ();
907 init_registers_mips64_dsp_linux ();
909 initialize_regsets_info (&mips_regsets_info
);