]>
git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/rx/gdb-if.c
4a0f0701a56b650ef5aafe909243b869feadbd31
1 /* gdb-if.c -- sim interface to GDB.
3 Copyright (C) 2008-2021 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
30 #include "libiberty.h"
31 #include "sim/callback.h"
33 #include "gdb/signals.h"
34 #include "gdb/sim-rx.h"
43 /* Ideally, we'd wrap up all the minisim's data structures in an
44 object and pass that around. However, neither GDB nor run needs
47 So we just have one instance, that lives in global variables, and
48 each time we open it, we re-initialize it. */
54 static struct sim_state the_minisim
= {
55 "This is the sole rx minisim instance. See libsim.a's global variables."
58 static int rx_sim_is_open
;
61 sim_open (SIM_OPEN_KIND kind
,
62 struct host_callback_struct
*callback
,
63 struct bfd
*abfd
, char * const *argv
)
66 fprintf (stderr
, "rx minisim: re-opened sim\n");
68 /* The 'run' interface doesn't use this function, so we don't care
69 about KIND; it's always SIM_OPEN_DEBUG. */
70 if (kind
!= SIM_OPEN_DEBUG
)
71 fprintf (stderr
, "rx minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
74 set_callbacks (callback
);
76 /* We don't expect any command-line arguments. */
80 execution_error_init_debugger ();
82 sim_disasm_init (abfd
);
88 check_desc (SIM_DESC sd
)
90 if (sd
!= &the_minisim
)
91 fprintf (stderr
, "rx minisim: desc != &the_minisim\n");
95 sim_close (SIM_DESC sd
, int quitting
)
99 /* Not much to do. At least free up our memory. */
106 open_objfile (const char *filename
)
108 bfd
*prog
= bfd_openr (filename
, 0);
112 fprintf (stderr
, "Can't read %s\n", filename
);
116 if (!bfd_check_format (prog
, bfd_object
))
118 fprintf (stderr
, "%s not a rx program\n", filename
);
125 static struct swap_list
128 struct swap_list
*next
;
132 free_swap_list (void)
136 struct swap_list
*next
= swap_list
->next
;
142 /* When running in big endian mode, we must do an additional
143 byte swap of memory areas used to hold instructions. See
144 the comment preceding rx_load in load.c to see why this is
147 Construct a list of memory areas that must be byte swapped.
148 This list will be consulted when either reading or writing
152 build_swap_list (struct bfd
*abfd
)
157 /* Nothing to do when in little endian mode. */
161 for (s
= abfd
->sections
; s
; s
= s
->next
)
163 if ((s
->flags
& SEC_LOAD
) && (s
->flags
& SEC_CODE
))
165 struct swap_list
*sl
;
168 size
= bfd_section_size (s
);
172 sl
= malloc (sizeof (struct swap_list
));
174 sl
->next
= swap_list
;
175 sl
->start
= bfd_section_lma (s
);
176 sl
->end
= sl
->start
+ size
;
183 addr_in_swap_list (bfd_vma addr
)
187 for (s
= swap_list
; s
; s
= s
->next
)
189 if (s
->start
<= addr
&& addr
< s
->end
)
196 sim_load (SIM_DESC sd
, const char *prog
, struct bfd
*abfd
, int from_tty
)
201 abfd
= open_objfile (prog
);
205 rx_load (abfd
, get_callbacks ());
206 build_swap_list (abfd
);
212 sim_create_inferior (SIM_DESC sd
, struct bfd
*abfd
,
213 char * const *argv
, char * const *env
)
219 rx_load (abfd
, NULL
);
220 build_swap_list (abfd
);
227 sim_read (SIM_DESC sd
, SIM_ADDR mem
, unsigned char *buf
, int length
)
236 execution_error_clear_last_error ();
238 for (i
= 0; i
< length
; i
++)
240 bfd_vma addr
= mem
+ i
;
241 int do_swap
= addr_in_swap_list (addr
);
242 buf
[i
] = mem_get_qi (addr
^ (do_swap
? 3 : 0));
244 if (execution_error_get_last_error () != SIM_ERR_NONE
)
252 sim_write (SIM_DESC sd
, SIM_ADDR mem
, const unsigned char *buf
, int length
)
258 execution_error_clear_last_error ();
260 for (i
= 0; i
< length
; i
++)
262 bfd_vma addr
= mem
+ i
;
263 int do_swap
= addr_in_swap_list (addr
);
264 mem_put_qi (addr
^ (do_swap
? 3 : 0), buf
[i
]);
266 if (execution_error_get_last_error () != SIM_ERR_NONE
)
273 /* Read the LENGTH bytes at BUF as an little-endian value. */
275 get_le (unsigned char *buf
, int length
)
278 while (--length
>= 0)
279 acc
= (acc
<< 8) + buf
[length
];
284 /* Read the LENGTH bytes at BUF as a big-endian value. */
286 get_be (unsigned char *buf
, int length
)
290 acc
= (acc
<< 8) + *buf
++;
295 /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
297 put_le (unsigned char *buf
, int length
, DI val
)
301 for (i
= 0; i
< length
; i
++)
308 /* Store VAL as a big-endian value in the LENGTH bytes at BUF. */
310 put_be (unsigned char *buf
, int length
, DI val
)
314 for (i
= length
-1; i
>= 0; i
--)
323 check_regno (enum sim_rx_regnum regno
)
325 return 0 <= regno
&& regno
< sim_rx_num_regs
;
329 reg_size (enum sim_rx_regnum regno
)
335 case sim_rx_r0_regnum
:
336 size
= sizeof (regs
.r
[0]);
338 case sim_rx_r1_regnum
:
339 size
= sizeof (regs
.r
[1]);
341 case sim_rx_r2_regnum
:
342 size
= sizeof (regs
.r
[2]);
344 case sim_rx_r3_regnum
:
345 size
= sizeof (regs
.r
[3]);
347 case sim_rx_r4_regnum
:
348 size
= sizeof (regs
.r
[4]);
350 case sim_rx_r5_regnum
:
351 size
= sizeof (regs
.r
[5]);
353 case sim_rx_r6_regnum
:
354 size
= sizeof (regs
.r
[6]);
356 case sim_rx_r7_regnum
:
357 size
= sizeof (regs
.r
[7]);
359 case sim_rx_r8_regnum
:
360 size
= sizeof (regs
.r
[8]);
362 case sim_rx_r9_regnum
:
363 size
= sizeof (regs
.r
[9]);
365 case sim_rx_r10_regnum
:
366 size
= sizeof (regs
.r
[10]);
368 case sim_rx_r11_regnum
:
369 size
= sizeof (regs
.r
[11]);
371 case sim_rx_r12_regnum
:
372 size
= sizeof (regs
.r
[12]);
374 case sim_rx_r13_regnum
:
375 size
= sizeof (regs
.r
[13]);
377 case sim_rx_r14_regnum
:
378 size
= sizeof (regs
.r
[14]);
380 case sim_rx_r15_regnum
:
381 size
= sizeof (regs
.r
[15]);
383 case sim_rx_isp_regnum
:
384 size
= sizeof (regs
.r_isp
);
386 case sim_rx_usp_regnum
:
387 size
= sizeof (regs
.r_usp
);
389 case sim_rx_intb_regnum
:
390 size
= sizeof (regs
.r_intb
);
392 case sim_rx_pc_regnum
:
393 size
= sizeof (regs
.r_pc
);
395 case sim_rx_ps_regnum
:
396 size
= sizeof (regs
.r_psw
);
398 case sim_rx_bpc_regnum
:
399 size
= sizeof (regs
.r_bpc
);
401 case sim_rx_bpsw_regnum
:
402 size
= sizeof (regs
.r_bpsw
);
404 case sim_rx_fintv_regnum
:
405 size
= sizeof (regs
.r_fintv
);
407 case sim_rx_fpsw_regnum
:
408 size
= sizeof (regs
.r_fpsw
);
410 case sim_rx_acc_regnum
:
411 size
= sizeof (regs
.r_acc
);
421 sim_fetch_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
428 if (!check_regno (regno
))
431 size
= reg_size (regno
);
438 case sim_rx_r0_regnum
:
441 case sim_rx_r1_regnum
:
444 case sim_rx_r2_regnum
:
447 case sim_rx_r3_regnum
:
450 case sim_rx_r4_regnum
:
453 case sim_rx_r5_regnum
:
456 case sim_rx_r6_regnum
:
459 case sim_rx_r7_regnum
:
462 case sim_rx_r8_regnum
:
465 case sim_rx_r9_regnum
:
468 case sim_rx_r10_regnum
:
471 case sim_rx_r11_regnum
:
474 case sim_rx_r12_regnum
:
477 case sim_rx_r13_regnum
:
480 case sim_rx_r14_regnum
:
483 case sim_rx_r15_regnum
:
486 case sim_rx_isp_regnum
:
489 case sim_rx_usp_regnum
:
492 case sim_rx_intb_regnum
:
493 val
= get_reg (intb
);
495 case sim_rx_pc_regnum
:
498 case sim_rx_ps_regnum
:
501 case sim_rx_bpc_regnum
:
504 case sim_rx_bpsw_regnum
:
505 val
= get_reg (bpsw
);
507 case sim_rx_fintv_regnum
:
508 val
= get_reg (fintv
);
510 case sim_rx_fpsw_regnum
:
511 val
= get_reg (fpsw
);
513 case sim_rx_acc_regnum
:
514 val
= ((DI
) get_reg (acchi
) << 32) | get_reg (acclo
);
517 fprintf (stderr
, "rx minisim: unrecognized register number: %d\n",
523 put_be (buf
, length
, val
);
525 put_le (buf
, length
, val
);
531 sim_store_register (SIM_DESC sd
, int regno
, unsigned char *buf
, int length
)
538 if (!check_regno (regno
))
541 size
= reg_size (regno
);
547 val
= get_be (buf
, length
);
549 val
= get_le (buf
, length
);
553 case sim_rx_r0_regnum
:
556 case sim_rx_r1_regnum
:
559 case sim_rx_r2_regnum
:
562 case sim_rx_r3_regnum
:
565 case sim_rx_r4_regnum
:
568 case sim_rx_r5_regnum
:
571 case sim_rx_r6_regnum
:
574 case sim_rx_r7_regnum
:
577 case sim_rx_r8_regnum
:
580 case sim_rx_r9_regnum
:
583 case sim_rx_r10_regnum
:
586 case sim_rx_r11_regnum
:
589 case sim_rx_r12_regnum
:
592 case sim_rx_r13_regnum
:
595 case sim_rx_r14_regnum
:
598 case sim_rx_r15_regnum
:
601 case sim_rx_isp_regnum
:
604 case sim_rx_usp_regnum
:
607 case sim_rx_intb_regnum
:
610 case sim_rx_pc_regnum
:
613 case sim_rx_ps_regnum
:
616 case sim_rx_bpc_regnum
:
619 case sim_rx_bpsw_regnum
:
622 case sim_rx_fintv_regnum
:
623 put_reg (fintv
, val
);
625 case sim_rx_fpsw_regnum
:
628 case sim_rx_acc_regnum
:
629 put_reg (acclo
, val
& 0xffffffff);
630 put_reg (acchi
, (val
>> 32) & 0xffffffff);
633 fprintf (stderr
, "rx minisim: unrecognized register number: %d\n",
642 sim_info (SIM_DESC sd
, int verbose
)
646 printf ("The rx minisim doesn't collect any statistics.\n");
649 static volatile int stop
;
650 static enum sim_stop reason
;
654 /* Given a signal number used by the RX bsp (that is, newlib),
655 return a target signal number used by GDB. */
657 rx_signal_to_gdb_signal (int rx
)
662 return GDB_SIGNAL_ILL
;
665 return GDB_SIGNAL_TRAP
;
668 return GDB_SIGNAL_BUS
;
671 return GDB_SIGNAL_SEGV
;
674 return GDB_SIGNAL_XCPU
;
677 return GDB_SIGNAL_INT
;
680 return GDB_SIGNAL_FPE
;
683 return GDB_SIGNAL_ABRT
;
690 /* Take a step return code RC and set up the variables consulted by
691 sim_stop_reason appropriately. */
695 if (execution_error_get_last_error () != SIM_ERR_NONE
)
697 reason
= sim_stopped
;
698 siggnal
= GDB_SIGNAL_SEGV
;
700 if (RX_STEPPED (rc
) || RX_HIT_BREAK (rc
))
702 reason
= sim_stopped
;
703 siggnal
= GDB_SIGNAL_TRAP
;
705 else if (RX_STOPPED (rc
))
707 reason
= sim_stopped
;
708 siggnal
= rx_signal_to_gdb_signal (RX_STOP_SIG (rc
));
712 assert (RX_EXITED (rc
));
714 siggnal
= RX_EXIT_STATUS (rc
);
720 sim_resume (SIM_DESC sd
, int step
, int sig_to_deliver
)
726 if (sig_to_deliver
!= 0)
729 "Warning: the rx minisim does not implement "
730 "signal delivery yet.\n" "Resuming with no signal.\n");
733 execution_error_clear_last_error ();
737 rc
= setjmp (decode_jmp_buf
);
739 rc
= decode_opcode ();
744 /* We don't clear 'stop' here, because then we would miss
745 interrupts that arrived on the way here. Instead, we clear
746 the flag in sim_stop_reason, after GDB has disabled the
747 interrupt signal handler. */
753 reason
= sim_stopped
;
754 siggnal
= GDB_SIGNAL_INT
;
758 rc
= setjmp (decode_jmp_buf
);
760 rc
= decode_opcode ();
762 if (execution_error_get_last_error () != SIM_ERR_NONE
)
764 reason
= sim_stopped
;
765 siggnal
= GDB_SIGNAL_SEGV
;
769 if (!RX_STEPPED (rc
))
779 sim_stop (SIM_DESC sd
)
787 sim_stop_reason (SIM_DESC sd
, enum sim_stop
*reason_p
, int *sigrc_p
)
796 sim_do_command (SIM_DESC sd
, const char *cmd
)
799 char **argv
= buildargv (cmd
);
812 if (strcmp (cmd
, "trace") == 0)
814 if (strcmp (arg
, "on") == 0)
816 else if (strcmp (arg
, "off") == 0)
819 printf ("The 'sim trace' command expects 'on' or 'off' "
820 "as an argument.\n");
822 else if (strcmp (cmd
, "verbose") == 0)
824 if (strcmp (arg
, "on") == 0)
826 else if (strcmp (arg
, "noisy") == 0)
828 else if (strcmp (arg
, "off") == 0)
831 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
832 " as an argument.\n");
835 printf ("The 'sim' command expects either 'trace' or 'verbose'"
836 " as a subcommand.\n");
842 sim_complete_command (SIM_DESC sd
, const char *text
, const char *word
)
847 /* Stub this out for now. */
850 sim_memory_map (SIM_DESC sd
)