1 /* GNU/Linux/MIPS specific low level interface, for the remote server for GDB.
2 Copyright (C) 1995-2020 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 /* Linux target op definitions for the MIPS architecture. */
30 class mips_target
: public linux_process_target
34 const regs_info
*get_regs_info () override
;
36 const gdb_byte
*sw_breakpoint_from_kind (int kind
, int *size
) override
;
38 bool supports_z_point_type (char z_type
) override
;
42 void low_arch_setup () override
;
44 bool low_cannot_fetch_register (int regno
) override
;
46 bool low_cannot_store_register (int regno
) override
;
48 bool low_fetch_register (regcache
*regcache
, int regno
) override
;
50 bool low_supports_breakpoints () override
;
52 CORE_ADDR
low_get_pc (regcache
*regcache
) override
;
54 void low_set_pc (regcache
*regcache
, CORE_ADDR newpc
) override
;
56 bool low_breakpoint_at (CORE_ADDR pc
) override
;
58 int low_insert_point (raw_bkpt_type type
, CORE_ADDR addr
,
59 int size
, raw_breakpoint
*bp
) override
;
61 int low_remove_point (raw_bkpt_type type
, CORE_ADDR addr
,
62 int size
, raw_breakpoint
*bp
) override
;
64 bool low_stopped_by_watchpoint () override
;
66 CORE_ADDR
low_stopped_data_address () override
;
69 /* The singleton target ops object. */
71 static mips_target the_mips_target
;
73 /* Defined in auto-generated file mips-linux.c. */
74 void init_registers_mips_linux (void);
75 extern const struct target_desc
*tdesc_mips_linux
;
77 /* Defined in auto-generated file mips-dsp-linux.c. */
78 void init_registers_mips_dsp_linux (void);
79 extern const struct target_desc
*tdesc_mips_dsp_linux
;
81 /* Defined in auto-generated file mips64-linux.c. */
82 void init_registers_mips64_linux (void);
83 extern const struct target_desc
*tdesc_mips64_linux
;
85 /* Defined in auto-generated file mips64-dsp-linux.c. */
86 void init_registers_mips64_dsp_linux (void);
87 extern const struct target_desc
*tdesc_mips64_dsp_linux
;
90 #define tdesc_mips_linux tdesc_mips64_linux
91 #define tdesc_mips_dsp_linux tdesc_mips64_dsp_linux
94 #ifndef PTRACE_GET_THREAD_AREA
95 #define PTRACE_GET_THREAD_AREA 25
102 #define mips_num_regs 73
103 #define mips_dsp_num_regs 80
105 #include <asm/ptrace.h>
109 #define DSP_CONTROL 77
114 unsigned char buf
[8];
116 /* Deliberately signed, for proper sign extension. */
121 /* Return the ptrace ``address'' of register REGNO. */
123 #define mips_base_regs \
124 -1, 1, 2, 3, 4, 5, 6, 7, \
125 8, 9, 10, 11, 12, 13, 14, 15, \
126 16, 17, 18, 19, 20, 21, 22, 23, \
127 24, 25, 26, 27, 28, 29, 30, 31, \
129 -1, MMLO, MMHI, BADVADDR, CAUSE, PC, \
131 FPR_BASE, FPR_BASE + 1, FPR_BASE + 2, FPR_BASE + 3, \
132 FPR_BASE + 4, FPR_BASE + 5, FPR_BASE + 6, FPR_BASE + 7, \
133 FPR_BASE + 8, FPR_BASE + 9, FPR_BASE + 10, FPR_BASE + 11, \
134 FPR_BASE + 12, FPR_BASE + 13, FPR_BASE + 14, FPR_BASE + 15, \
135 FPR_BASE + 16, FPR_BASE + 17, FPR_BASE + 18, FPR_BASE + 19, \
136 FPR_BASE + 20, FPR_BASE + 21, FPR_BASE + 22, FPR_BASE + 23, \
137 FPR_BASE + 24, FPR_BASE + 25, FPR_BASE + 26, FPR_BASE + 27, \
138 FPR_BASE + 28, FPR_BASE + 29, FPR_BASE + 30, FPR_BASE + 31, \
141 #define mips_dsp_regs \
142 DSP_BASE, DSP_BASE + 1, DSP_BASE + 2, DSP_BASE + 3, \
143 DSP_BASE + 4, DSP_BASE + 5, \
146 static int mips_regmap
[mips_num_regs
] = {
151 static int mips_dsp_regmap
[mips_dsp_num_regs
] = {
157 /* DSP registers are not in any regset and can only be accessed
160 static unsigned char mips_dsp_regset_bitmap
[(mips_dsp_num_regs
+ 7) / 8] = {
161 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x80
164 static int have_dsp
= -1;
166 /* Try peeking at an arbitrarily chosen DSP register and pick the available
167 user register set accordingly. */
169 static const struct target_desc
*
170 mips_read_description (void)
174 int pid
= lwpid_of (current_thread
);
177 ptrace (PTRACE_PEEKUSER
, pid
, DSP_CONTROL
, 0);
187 perror_with_name ("ptrace");
192 return have_dsp
? tdesc_mips_dsp_linux
: tdesc_mips_linux
;
196 mips_target::low_arch_setup ()
198 current_process ()->tdesc
= mips_read_description ();
201 /* Per-process arch-specific data we want to keep. */
203 struct arch_process_info
205 /* -1 if the kernel and/or CPU do not support watch registers.
206 1 if watch_readback is valid and we can read style, num_valid
208 0 if we need to read the watch_readback. */
210 int watch_readback_valid
;
212 /* Cached watch register read values. */
214 struct pt_watch_regs watch_readback
;
216 /* Current watchpoint requests for this process. */
218 struct mips_watchpoint
*current_watches
;
220 /* The current set of watch register values for writing the
223 struct pt_watch_regs watch_mirror
;
226 /* Per-thread arch-specific data we want to keep. */
230 /* Non-zero if our copy differs from what's recorded in the thread. */
231 int watch_registers_changed
;
234 /* From mips-linux-nat.c. */
236 /* Pseudo registers can not be read. ptrace does not provide a way to
237 read (or set) PS_REGNUM, and there's no point in reading or setting
238 ZERO_REGNUM, it's always 0. We also can not set BADVADDR, CAUSE,
239 or FCRIR via ptrace(). */
242 mips_target::low_cannot_fetch_register (int regno
)
244 const struct target_desc
*tdesc
;
246 if (get_regs_info ()->usrregs
->regmap
[regno
] == -1)
249 tdesc
= current_process ()->tdesc
;
251 /* On n32 we can't access 64-bit registers via PTRACE_PEEKUSR. */
252 if (register_size (tdesc
, regno
) > sizeof (PTRACE_XFER_TYPE
))
255 if (find_regno (tdesc
, "r0") == regno
)
262 mips_target::low_cannot_store_register (int regno
)
264 const struct target_desc
*tdesc
;
266 if (get_regs_info ()->usrregs
->regmap
[regno
] == -1)
269 tdesc
= current_process ()->tdesc
;
271 /* On n32 we can't access 64-bit registers via PTRACE_POKEUSR. */
272 if (register_size (tdesc
, regno
) > sizeof (PTRACE_XFER_TYPE
))
275 if (find_regno (tdesc
, "r0") == regno
)
278 if (find_regno (tdesc
, "cause") == regno
)
281 if (find_regno (tdesc
, "badvaddr") == regno
)
284 if (find_regno (tdesc
, "fir") == regno
)
291 mips_target::low_fetch_register (regcache
*regcache
, int regno
)
293 const struct target_desc
*tdesc
= current_process ()->tdesc
;
295 if (find_regno (tdesc
, "r0") == regno
)
297 supply_register_zeroed (regcache
, regno
);
305 mips_target::low_supports_breakpoints ()
311 mips_target::low_get_pc (regcache
*regcache
)
313 union mips_register pc
;
314 collect_register_by_name (regcache
, "pc", pc
.buf
);
315 return register_size (regcache
->tdesc
, 0) == 4 ? pc
.reg32
: pc
.reg64
;
319 mips_target::low_set_pc (regcache
*regcache
, CORE_ADDR pc
)
321 union mips_register newpc
;
322 if (register_size (regcache
->tdesc
, 0) == 4)
327 supply_register_by_name (regcache
, "pc", newpc
.buf
);
330 /* Correct in either endianness. */
331 static const unsigned int mips_breakpoint
= 0x0005000d;
332 #define mips_breakpoint_len 4
334 /* Implementation of target ops method "sw_breakpoint_from_kind". */
337 mips_target::sw_breakpoint_from_kind (int kind
, int *size
)
339 *size
= mips_breakpoint_len
;
340 return (const gdb_byte
*) &mips_breakpoint
;
344 mips_target::low_breakpoint_at (CORE_ADDR where
)
348 read_memory (where
, (unsigned char *) &insn
, 4);
349 if (insn
== mips_breakpoint
)
352 /* If necessary, recognize more trap instructions here. GDB only uses the
357 /* Mark the watch registers of lwp, represented by ENTRY, as changed. */
360 update_watch_registers_callback (thread_info
*thread
)
362 struct lwp_info
*lwp
= get_thread_lwp (thread
);
364 /* The actual update is done later just before resuming the lwp,
365 we just mark that the registers need updating. */
366 lwp
->arch_private
->watch_registers_changed
= 1;
368 /* If the lwp isn't stopped, force it to momentarily pause, so
369 we can update its watch registers. */
371 linux_stop_lwp (lwp
);
374 /* This is the implementation of linux_target_ops method
377 static struct arch_process_info
*
378 mips_linux_new_process (void)
380 struct arch_process_info
*info
= XCNEW (struct arch_process_info
);
385 /* This is the implementation of linux_target_ops method
389 mips_linux_delete_process (struct arch_process_info
*info
)
394 /* This is the implementation of linux_target_ops method new_thread.
395 Mark the watch registers as changed, so the threads' copies will
399 mips_linux_new_thread (struct lwp_info
*lwp
)
401 struct arch_lwp_info
*info
= XCNEW (struct arch_lwp_info
);
403 info
->watch_registers_changed
= 1;
405 lwp
->arch_private
= info
;
408 /* Function to call when a thread is being deleted. */
411 mips_linux_delete_thread (struct arch_lwp_info
*arch_lwp
)
416 /* Create a new mips_watchpoint and add it to the list. */
419 mips_add_watchpoint (struct arch_process_info
*priv
, CORE_ADDR addr
, int len
,
420 enum target_hw_bp_type watch_type
)
422 struct mips_watchpoint
*new_watch
;
423 struct mips_watchpoint
**pw
;
425 new_watch
= XNEW (struct mips_watchpoint
);
426 new_watch
->addr
= addr
;
427 new_watch
->len
= len
;
428 new_watch
->type
= watch_type
;
429 new_watch
->next
= NULL
;
431 pw
= &priv
->current_watches
;
437 /* Hook to call when a new fork is attached. */
440 mips_linux_new_fork (struct process_info
*parent
,
441 struct process_info
*child
)
443 struct arch_process_info
*parent_private
;
444 struct arch_process_info
*child_private
;
445 struct mips_watchpoint
*wp
;
447 /* These are allocated by linux_add_process. */
448 gdb_assert (parent
->priv
!= NULL
449 && parent
->priv
->arch_private
!= NULL
);
450 gdb_assert (child
->priv
!= NULL
451 && child
->priv
->arch_private
!= NULL
);
453 /* Linux kernel before 2.6.33 commit
454 72f674d203cd230426437cdcf7dd6f681dad8b0d
455 will inherit hardware debug registers from parent
456 on fork/vfork/clone. Newer Linux kernels create such tasks with
457 zeroed debug registers.
459 GDB core assumes the child inherits the watchpoints/hw
460 breakpoints of the parent, and will remove them all from the
461 forked off process. Copy the debug registers mirrors into the
462 new process so that all breakpoints and watchpoints can be
463 removed together. The debug registers mirror will become zeroed
464 in the end before detaching the forked off process, thus making
465 this compatible with older Linux kernels too. */
467 parent_private
= parent
->priv
->arch_private
;
468 child_private
= child
->priv
->arch_private
;
470 child_private
->watch_readback_valid
= parent_private
->watch_readback_valid
;
471 child_private
->watch_readback
= parent_private
->watch_readback
;
473 for (wp
= parent_private
->current_watches
; wp
!= NULL
; wp
= wp
->next
)
474 mips_add_watchpoint (child_private
, wp
->addr
, wp
->len
, wp
->type
);
476 child_private
->watch_mirror
= parent_private
->watch_mirror
;
478 /* This is the implementation of linux_target_ops method
479 prepare_to_resume. If the watch regs have changed, update the
483 mips_linux_prepare_to_resume (struct lwp_info
*lwp
)
485 ptid_t ptid
= ptid_of (get_lwp_thread (lwp
));
486 struct process_info
*proc
= find_process_pid (ptid
.pid ());
487 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
489 if (lwp
->arch_private
->watch_registers_changed
)
491 /* Only update the watch registers if we have set or unset a
492 watchpoint already. */
493 if (mips_linux_watch_get_num_valid (&priv
->watch_mirror
) > 0)
495 /* Write the mirrored watch register values. */
496 int tid
= ptid
.lwp ();
498 if (-1 == ptrace (PTRACE_SET_WATCH_REGS
, tid
,
499 &priv
->watch_mirror
, NULL
))
500 perror_with_name ("Couldn't write watch register");
503 lwp
->arch_private
->watch_registers_changed
= 0;
508 mips_target::supports_z_point_type (char z_type
)
512 case Z_PACKET_WRITE_WP
:
513 case Z_PACKET_READ_WP
:
514 case Z_PACKET_ACCESS_WP
:
521 /* This is the implementation of linux target ops method
525 mips_target::low_insert_point (raw_bkpt_type type
, CORE_ADDR addr
,
526 int len
, raw_breakpoint
*bp
)
528 struct process_info
*proc
= current_process ();
529 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
530 struct pt_watch_regs regs
;
532 enum target_hw_bp_type watch_type
;
535 lwpid
= lwpid_of (current_thread
);
536 if (!mips_linux_read_watch_registers (lwpid
,
537 &priv
->watch_readback
,
538 &priv
->watch_readback_valid
,
545 regs
= priv
->watch_readback
;
546 /* Add the current watches. */
547 mips_linux_watch_populate_regs (priv
->current_watches
, ®s
);
549 /* Now try to add the new watch. */
550 watch_type
= raw_bkpt_type_to_target_hw_bp_type (type
);
551 irw
= mips_linux_watch_type_to_irw (watch_type
);
552 if (!mips_linux_watch_try_one_watch (®s
, addr
, len
, irw
))
555 /* It fit. Stick it on the end of the list. */
556 mips_add_watchpoint (priv
, addr
, len
, watch_type
);
558 priv
->watch_mirror
= regs
;
560 /* Only update the threads of this process. */
561 for_each_thread (proc
->pid
, update_watch_registers_callback
);
566 /* This is the implementation of linux target ops method
570 mips_target::low_remove_point (raw_bkpt_type type
, CORE_ADDR addr
,
571 int len
, raw_breakpoint
*bp
)
573 struct process_info
*proc
= current_process ();
574 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
577 enum target_hw_bp_type watch_type
;
579 struct mips_watchpoint
**pw
;
580 struct mips_watchpoint
*w
;
582 /* Search for a known watch that matches. Then unlink and free it. */
583 watch_type
= raw_bkpt_type_to_target_hw_bp_type (type
);
585 pw
= &priv
->current_watches
;
588 if (w
->addr
== addr
&& w
->len
== len
&& w
->type
== watch_type
)
599 return -1; /* We don't know about it, fail doing nothing. */
601 /* At this point watch_readback is known to be valid because we
602 could not have added the watch without reading it. */
603 gdb_assert (priv
->watch_readback_valid
== 1);
605 priv
->watch_mirror
= priv
->watch_readback
;
606 mips_linux_watch_populate_regs (priv
->current_watches
,
607 &priv
->watch_mirror
);
609 /* Only update the threads of this process. */
610 for_each_thread (proc
->pid
, update_watch_registers_callback
);
615 /* This is the implementation of linux target ops method
616 low_stopped_by_watchpoint. The watchhi R and W bits indicate
617 the watch register triggered. */
620 mips_target::low_stopped_by_watchpoint ()
622 struct process_info
*proc
= current_process ();
623 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
626 long lwpid
= lwpid_of (current_thread
);
628 if (!mips_linux_read_watch_registers (lwpid
,
629 &priv
->watch_readback
,
630 &priv
->watch_readback_valid
,
634 num_valid
= mips_linux_watch_get_num_valid (&priv
->watch_readback
);
636 for (n
= 0; n
< MAX_DEBUG_REGISTER
&& n
< num_valid
; n
++)
637 if (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
644 /* This is the implementation of linux target ops method
645 low_stopped_data_address. */
648 mips_target::low_stopped_data_address ()
650 struct process_info
*proc
= current_process ();
651 struct arch_process_info
*priv
= proc
->priv
->arch_private
;
654 long lwpid
= lwpid_of (current_thread
);
656 /* On MIPS we don't know the low order 3 bits of the data address.
657 GDB does not support remote targets that can't report the
658 watchpoint address. So, make our best guess; return the starting
659 address of a watchpoint request which overlaps the one that
662 if (!mips_linux_read_watch_registers (lwpid
,
663 &priv
->watch_readback
,
664 &priv
->watch_readback_valid
,
668 num_valid
= mips_linux_watch_get_num_valid (&priv
->watch_readback
);
670 for (n
= 0; n
< MAX_DEBUG_REGISTER
&& n
< num_valid
; n
++)
671 if (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
674 CORE_ADDR t_low
, t_hi
;
676 struct mips_watchpoint
*watch
;
678 t_low
= mips_linux_watch_get_watchlo (&priv
->watch_readback
, n
);
679 t_irw
= t_low
& IRW_MASK
;
680 t_hi
= (mips_linux_watch_get_watchhi (&priv
->watch_readback
, n
)
682 t_low
&= ~(CORE_ADDR
)t_hi
;
684 for (watch
= priv
->current_watches
;
688 CORE_ADDR addr
= watch
->addr
;
689 CORE_ADDR last_byte
= addr
+ watch
->len
- 1;
691 if ((t_irw
& mips_linux_watch_type_to_irw (watch
->type
)) == 0)
693 /* Different type. */
696 /* Check for overlap of even a single byte. */
697 if (last_byte
>= t_low
&& addr
<= t_low
+ t_hi
)
702 /* Shouldn't happen. */
706 /* Fetch the thread-local storage pointer for libthread_db. */
709 ps_get_thread_area (struct ps_prochandle
*ph
,
710 lwpid_t lwpid
, int idx
, void **base
)
712 if (ptrace (PTRACE_GET_THREAD_AREA
, lwpid
, NULL
, base
) != 0)
715 /* IDX is the bias from the thread pointer to the beginning of the
716 thread descriptor. It has to be subtracted due to implementation
717 quirks in libthread_db. */
718 *base
= (void *) ((char *)*base
- idx
);
724 mips_collect_register (struct regcache
*regcache
,
725 int use_64bit
, int regno
, union mips_register
*reg
)
727 union mips_register tmp_reg
;
731 collect_register (regcache
, regno
, &tmp_reg
.reg64
);
736 collect_register (regcache
, regno
, &tmp_reg
.reg32
);
737 reg
->reg64
= tmp_reg
.reg32
;
742 mips_supply_register (struct regcache
*regcache
,
743 int use_64bit
, int regno
, const union mips_register
*reg
)
747 /* For big-endian 32-bit targets, ignore the high four bytes of each
749 if (__BYTE_ORDER
== __BIG_ENDIAN
&& !use_64bit
)
752 supply_register (regcache
, regno
, reg
->buf
+ offset
);
755 #ifdef HAVE_PTRACE_GETREGS
758 mips_collect_register_32bit (struct regcache
*regcache
,
759 int use_64bit
, int regno
, unsigned char *buf
)
761 union mips_register tmp_reg
;
764 mips_collect_register (regcache
, use_64bit
, regno
, &tmp_reg
);
765 reg32
= tmp_reg
.reg64
;
766 memcpy (buf
, ®32
, 4);
770 mips_supply_register_32bit (struct regcache
*regcache
,
771 int use_64bit
, int regno
, const unsigned char *buf
)
773 union mips_register tmp_reg
;
776 memcpy (®32
, buf
, 4);
777 tmp_reg
.reg64
= reg32
;
778 mips_supply_register (regcache
, use_64bit
, regno
, &tmp_reg
);
782 mips_fill_gregset (struct regcache
*regcache
, void *buf
)
784 union mips_register
*regset
= (union mips_register
*) buf
;
786 const struct target_desc
*tdesc
= regcache
->tdesc
;
788 use_64bit
= (register_size (tdesc
, 0) == 8);
790 for (i
= 1; i
< 32; i
++)
791 mips_collect_register (regcache
, use_64bit
, i
, regset
+ i
);
793 mips_collect_register (regcache
, use_64bit
,
794 find_regno (tdesc
, "lo"), regset
+ 32);
795 mips_collect_register (regcache
, use_64bit
,
796 find_regno (tdesc
, "hi"), regset
+ 33);
797 mips_collect_register (regcache
, use_64bit
,
798 find_regno (tdesc
, "pc"), regset
+ 34);
799 mips_collect_register (regcache
, use_64bit
,
800 find_regno (tdesc
, "badvaddr"), regset
+ 35);
801 mips_collect_register (regcache
, use_64bit
,
802 find_regno (tdesc
, "status"), regset
+ 36);
803 mips_collect_register (regcache
, use_64bit
,
804 find_regno (tdesc
, "cause"), regset
+ 37);
806 mips_collect_register (regcache
, use_64bit
,
807 find_regno (tdesc
, "restart"), regset
+ 0);
811 mips_store_gregset (struct regcache
*regcache
, const void *buf
)
813 const union mips_register
*regset
= (const union mips_register
*) buf
;
816 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
818 supply_register_by_name_zeroed (regcache
, "r0");
820 for (i
= 1; i
< 32; i
++)
821 mips_supply_register (regcache
, use_64bit
, i
, regset
+ i
);
823 mips_supply_register (regcache
, use_64bit
,
824 find_regno (regcache
->tdesc
, "lo"), regset
+ 32);
825 mips_supply_register (regcache
, use_64bit
,
826 find_regno (regcache
->tdesc
, "hi"), regset
+ 33);
827 mips_supply_register (regcache
, use_64bit
,
828 find_regno (regcache
->tdesc
, "pc"), regset
+ 34);
829 mips_supply_register (regcache
, use_64bit
,
830 find_regno (regcache
->tdesc
, "badvaddr"), regset
+ 35);
831 mips_supply_register (regcache
, use_64bit
,
832 find_regno (regcache
->tdesc
, "status"), regset
+ 36);
833 mips_supply_register (regcache
, use_64bit
,
834 find_regno (regcache
->tdesc
, "cause"), regset
+ 37);
836 mips_supply_register (regcache
, use_64bit
,
837 find_regno (regcache
->tdesc
, "restart"), regset
+ 0);
841 mips_fill_fpregset (struct regcache
*regcache
, void *buf
)
843 union mips_register
*regset
= (union mips_register
*) buf
;
844 int i
, use_64bit
, first_fp
, big_endian
;
846 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
847 first_fp
= find_regno (regcache
->tdesc
, "f0");
848 big_endian
= (__BYTE_ORDER
== __BIG_ENDIAN
);
850 /* See GDB for a discussion of this peculiar layout. */
851 for (i
= 0; i
< 32; i
++)
853 collect_register (regcache
, first_fp
+ i
, regset
[i
].buf
);
855 collect_register (regcache
, first_fp
+ i
,
856 regset
[i
& ~1].buf
+ 4 * (big_endian
!= (i
& 1)));
858 mips_collect_register_32bit (regcache
, use_64bit
,
859 find_regno (regcache
->tdesc
, "fcsr"), regset
[32].buf
);
860 mips_collect_register_32bit (regcache
, use_64bit
,
861 find_regno (regcache
->tdesc
, "fir"),
866 mips_store_fpregset (struct regcache
*regcache
, const void *buf
)
868 const union mips_register
*regset
= (const union mips_register
*) buf
;
869 int i
, use_64bit
, first_fp
, big_endian
;
871 use_64bit
= (register_size (regcache
->tdesc
, 0) == 8);
872 first_fp
= find_regno (regcache
->tdesc
, "f0");
873 big_endian
= (__BYTE_ORDER
== __BIG_ENDIAN
);
875 /* See GDB for a discussion of this peculiar layout. */
876 for (i
= 0; i
< 32; i
++)
878 supply_register (regcache
, first_fp
+ i
, regset
[i
].buf
);
880 supply_register (regcache
, first_fp
+ i
,
881 regset
[i
& ~1].buf
+ 4 * (big_endian
!= (i
& 1)));
883 mips_supply_register_32bit (regcache
, use_64bit
,
884 find_regno (regcache
->tdesc
, "fcsr"),
886 mips_supply_register_32bit (regcache
, use_64bit
,
887 find_regno (regcache
->tdesc
, "fir"),
890 #endif /* HAVE_PTRACE_GETREGS */
892 /* Take care of 32-bit registers with 64-bit ptrace, POKEUSER side. */
895 mips_collect_ptrace_register (struct regcache
*regcache
,
896 int regno
, char *buf
)
898 int use_64bit
= sizeof (PTRACE_XFER_TYPE
) == 8;
900 if (use_64bit
&& register_size (regcache
->tdesc
, regno
) == 4)
902 union mips_register reg
;
904 mips_collect_register (regcache
, 0, regno
, ®
);
905 memcpy (buf
, ®
, sizeof (reg
));
908 collect_register (regcache
, regno
, buf
);
911 /* Take care of 32-bit registers with 64-bit ptrace, PEEKUSER side. */
914 mips_supply_ptrace_register (struct regcache
*regcache
,
915 int regno
, const char *buf
)
917 int use_64bit
= sizeof (PTRACE_XFER_TYPE
) == 8;
919 if (use_64bit
&& register_size (regcache
->tdesc
, regno
) == 4)
921 union mips_register reg
;
923 memcpy (®
, buf
, sizeof (reg
));
924 mips_supply_register (regcache
, 0, regno
, ®
);
927 supply_register (regcache
, regno
, buf
);
930 static struct regset_info mips_regsets
[] = {
931 #ifdef HAVE_PTRACE_GETREGS
932 { PTRACE_GETREGS
, PTRACE_SETREGS
, 0, 38 * 8, GENERAL_REGS
,
933 mips_fill_gregset
, mips_store_gregset
},
934 { PTRACE_GETFPREGS
, PTRACE_SETFPREGS
, 0, 33 * 8, FP_REGS
,
935 mips_fill_fpregset
, mips_store_fpregset
},
936 #endif /* HAVE_PTRACE_GETREGS */
940 static struct regsets_info mips_regsets_info
=
942 mips_regsets
, /* regsets */
944 NULL
, /* disabled_regsets */
947 static struct usrregs_info mips_dsp_usrregs_info
=
953 static struct usrregs_info mips_usrregs_info
=
959 static struct regs_info dsp_regs_info
=
961 mips_dsp_regset_bitmap
,
962 &mips_dsp_usrregs_info
,
966 static struct regs_info myregs_info
=
968 NULL
, /* regset_bitmap */
974 mips_target::get_regs_info ()
977 return &dsp_regs_info
;
982 struct linux_target_ops the_low_target
= {
983 mips_collect_ptrace_register
,
984 mips_supply_ptrace_register
,
985 NULL
, /* siginfo_fixup */
986 mips_linux_new_process
,
987 mips_linux_delete_process
,
988 mips_linux_new_thread
,
989 mips_linux_delete_thread
,
991 mips_linux_prepare_to_resume
994 /* The linux target ops object. */
996 linux_process_target
*the_linux_target
= &the_mips_target
;
999 initialize_low_arch (void)
1001 /* Initialize the Linux target descriptions. */
1002 init_registers_mips_linux ();
1003 init_registers_mips_dsp_linux ();
1004 init_registers_mips64_linux ();
1005 init_registers_mips64_dsp_linux ();
1007 initialize_regsets_info (&mips_regsets_info
);