Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / sim / rx / gdb-if.c
CommitLineData
4f8d4a38
DD
1/* gdb-if.c -- sim interface to GDB.
2
88b9d363 3Copyright (C) 2008-2022 Free Software Foundation, Inc.
4f8d4a38
DD
4Contributed by Red Hat, Inc.
5
6This file is part of the GNU simulators.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 3 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
6df01ab8
MF
21/* This must come before any other includes. */
22#include "defs.h"
23
4f8d4a38
DD
24#include <stdio.h>
25#include <assert.h>
26#include <signal.h>
27#include <string.h>
28#include <ctype.h>
29#include <stdlib.h>
30
31#include "ansidecl.h"
75070a4e 32#include "libiberty.h"
df68e12b
MF
33#include "sim/callback.h"
34#include "sim/sim.h"
4f8d4a38
DD
35#include "gdb/signals.h"
36#include "gdb/sim-rx.h"
37
38#include "cpu.h"
39#include "mem.h"
40#include "load.h"
41#include "syscalls.h"
42#include "err.h"
fd60dc69 43#include "trace.h"
4f8d4a38
DD
44
45/* Ideally, we'd wrap up all the minisim's data structures in an
46 object and pass that around. However, neither GDB nor run needs
47 that ability.
48
49 So we just have one instance, that lives in global variables, and
50 each time we open it, we re-initialize it. */
51struct sim_state
52{
53 const char *message;
54};
55
56static struct sim_state the_minisim = {
57 "This is the sole rx minisim instance. See libsim.a's global variables."
58};
59
a300380e 60static int rx_sim_is_open;
4f8d4a38
DD
61
62SIM_DESC
63sim_open (SIM_OPEN_KIND kind,
64 struct host_callback_struct *callback,
2e3d4f4d 65 struct bfd *abfd, char * const *argv)
4f8d4a38 66{
a300380e 67 if (rx_sim_is_open)
4f8d4a38
DD
68 fprintf (stderr, "rx minisim: re-opened sim\n");
69
70 /* The 'run' interface doesn't use this function, so we don't care
71 about KIND; it's always SIM_OPEN_DEBUG. */
72 if (kind != SIM_OPEN_DEBUG)
73 fprintf (stderr, "rx minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
74 kind);
75
76 set_callbacks (callback);
77
78 /* We don't expect any command-line arguments. */
79
80 init_mem ();
81 init_regs ();
82 execution_error_init_debugger ();
83
84 sim_disasm_init (abfd);
a300380e 85 rx_sim_is_open = 1;
4f8d4a38
DD
86 return &the_minisim;
87}
88
89static void
90check_desc (SIM_DESC sd)
91{
92 if (sd != &the_minisim)
93 fprintf (stderr, "rx minisim: desc != &the_minisim\n");
94}
95
96void
97sim_close (SIM_DESC sd, int quitting)
98{
99 check_desc (sd);
100
101 /* Not much to do. At least free up our memory. */
102 init_mem ();
103
a300380e 104 rx_sim_is_open = 0;
4f8d4a38
DD
105}
106
107static bfd *
108open_objfile (const char *filename)
109{
110 bfd *prog = bfd_openr (filename, 0);
111
112 if (!prog)
113 {
114 fprintf (stderr, "Can't read %s\n", filename);
115 return 0;
116 }
117
118 if (!bfd_check_format (prog, bfd_object))
119 {
120 fprintf (stderr, "%s not a rx program\n", filename);
121 return 0;
122 }
123
124 return prog;
125}
126
127static struct swap_list
128{
129 bfd_vma start, end;
130 struct swap_list *next;
131} *swap_list = NULL;
132
133static void
134free_swap_list (void)
135{
136 while (swap_list)
137 {
138 struct swap_list *next = swap_list->next;
139 free (swap_list);
140 swap_list = next;
141 }
142}
143
144/* When running in big endian mode, we must do an additional
145 byte swap of memory areas used to hold instructions. See
146 the comment preceding rx_load in load.c to see why this is
147 so.
148
149 Construct a list of memory areas that must be byte swapped.
150 This list will be consulted when either reading or writing
151 memory. */
152
153static void
154build_swap_list (struct bfd *abfd)
155{
156 asection *s;
157 free_swap_list ();
158
159 /* Nothing to do when in little endian mode. */
160 if (!rx_big_endian)
161 return;
162
163 for (s = abfd->sections; s; s = s->next)
164 {
165 if ((s->flags & SEC_LOAD) && (s->flags & SEC_CODE))
166 {
167 struct swap_list *sl;
168 bfd_size_type size;
169
fd361982 170 size = bfd_section_size (s);
4f8d4a38
DD
171 if (size <= 0)
172 continue;
173
174 sl = malloc (sizeof (struct swap_list));
175 assert (sl != NULL);
176 sl->next = swap_list;
fd361982 177 sl->start = bfd_section_lma (s);
4f8d4a38
DD
178 sl->end = sl->start + size;
179 swap_list = sl;
180 }
181 }
182}
183
184static int
185addr_in_swap_list (bfd_vma addr)
186{
187 struct swap_list *s;
188
189 for (s = swap_list; s; s = s->next)
190 {
191 if (s->start <= addr && addr < s->end)
192 return 1;
193 }
194 return 0;
195}
196
197SIM_RC
b2b255bd 198sim_load (SIM_DESC sd, const char *prog, struct bfd *abfd, int from_tty)
4f8d4a38
DD
199{
200 check_desc (sd);
201
202 if (!abfd)
203 abfd = open_objfile (prog);
204 if (!abfd)
205 return SIM_RC_FAIL;
206
d98bfeb0 207 rx_load (abfd, get_callbacks ());
4f8d4a38
DD
208 build_swap_list (abfd);
209
210 return SIM_RC_OK;
211}
212
213SIM_RC
2e3d4f4d
MF
214sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
215 char * const *argv, char * const *env)
4f8d4a38
DD
216{
217 check_desc (sd);
218
219 if (abfd)
220 {
d98bfeb0 221 rx_load (abfd, NULL);
4f8d4a38
DD
222 build_swap_list (abfd);
223 }
224
225 return SIM_RC_OK;
226}
227
228int
229sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
230{
231 int i;
232
233 check_desc (sd);
234
235 if (mem == 0)
236 return 0;
237
238 execution_error_clear_last_error ();
239
240 for (i = 0; i < length; i++)
241 {
242 bfd_vma addr = mem + i;
243 int do_swap = addr_in_swap_list (addr);
244 buf[i] = mem_get_qi (addr ^ (do_swap ? 3 : 0));
245
246 if (execution_error_get_last_error () != SIM_ERR_NONE)
247 return i;
248 }
249
250 return length;
251}
252
253int
5558e7e6 254sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length)
4f8d4a38
DD
255{
256 int i;
257
258 check_desc (sd);
259
260 execution_error_clear_last_error ();
261
262 for (i = 0; i < length; i++)
263 {
264 bfd_vma addr = mem + i;
265 int do_swap = addr_in_swap_list (addr);
266 mem_put_qi (addr ^ (do_swap ? 3 : 0), buf[i]);
267
268 if (execution_error_get_last_error () != SIM_ERR_NONE)
269 return i;
270 }
271
272 return length;
273}
274
275/* Read the LENGTH bytes at BUF as an little-endian value. */
276static DI
277get_le (unsigned char *buf, int length)
278{
279 DI acc = 0;
280 while (--length >= 0)
281 acc = (acc << 8) + buf[length];
282
283 return acc;
284}
285
286/* Read the LENGTH bytes at BUF as a big-endian value. */
287static DI
288get_be (unsigned char *buf, int length)
289{
290 DI acc = 0;
291 while (length-- > 0)
292 acc = (acc << 8) + *buf++;
293
294 return acc;
295}
296
297/* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
298static void
299put_le (unsigned char *buf, int length, DI val)
300{
301 int i;
302
303 for (i = 0; i < length; i++)
304 {
305 buf[i] = val & 0xff;
306 val >>= 8;
307 }
308}
309
310/* Store VAL as a big-endian value in the LENGTH bytes at BUF. */
311static void
312put_be (unsigned char *buf, int length, DI val)
313{
314 int i;
315
316 for (i = length-1; i >= 0; i--)
317 {
318 buf[i] = val & 0xff;
319 val >>= 8;
320 }
321}
322
323
324static int
325check_regno (enum sim_rx_regnum regno)
326{
327 return 0 <= regno && regno < sim_rx_num_regs;
328}
329
330static size_t
331reg_size (enum sim_rx_regnum regno)
332{
333 size_t size;
334
335 switch (regno)
336 {
337 case sim_rx_r0_regnum:
338 size = sizeof (regs.r[0]);
339 break;
340 case sim_rx_r1_regnum:
341 size = sizeof (regs.r[1]);
342 break;
343 case sim_rx_r2_regnum:
344 size = sizeof (regs.r[2]);
345 break;
346 case sim_rx_r3_regnum:
347 size = sizeof (regs.r[3]);
348 break;
349 case sim_rx_r4_regnum:
350 size = sizeof (regs.r[4]);
351 break;
352 case sim_rx_r5_regnum:
353 size = sizeof (regs.r[5]);
354 break;
355 case sim_rx_r6_regnum:
356 size = sizeof (regs.r[6]);
357 break;
358 case sim_rx_r7_regnum:
359 size = sizeof (regs.r[7]);
360 break;
361 case sim_rx_r8_regnum:
362 size = sizeof (regs.r[8]);
363 break;
364 case sim_rx_r9_regnum:
365 size = sizeof (regs.r[9]);
366 break;
367 case sim_rx_r10_regnum:
368 size = sizeof (regs.r[10]);
369 break;
370 case sim_rx_r11_regnum:
371 size = sizeof (regs.r[11]);
372 break;
373 case sim_rx_r12_regnum:
374 size = sizeof (regs.r[12]);
375 break;
376 case sim_rx_r13_regnum:
377 size = sizeof (regs.r[13]);
378 break;
379 case sim_rx_r14_regnum:
380 size = sizeof (regs.r[14]);
381 break;
382 case sim_rx_r15_regnum:
383 size = sizeof (regs.r[15]);
384 break;
385 case sim_rx_isp_regnum:
386 size = sizeof (regs.r_isp);
387 break;
388 case sim_rx_usp_regnum:
389 size = sizeof (regs.r_usp);
390 break;
391 case sim_rx_intb_regnum:
392 size = sizeof (regs.r_intb);
393 break;
394 case sim_rx_pc_regnum:
395 size = sizeof (regs.r_pc);
396 break;
397 case sim_rx_ps_regnum:
398 size = sizeof (regs.r_psw);
399 break;
400 case sim_rx_bpc_regnum:
401 size = sizeof (regs.r_bpc);
402 break;
403 case sim_rx_bpsw_regnum:
404 size = sizeof (regs.r_bpsw);
405 break;
406 case sim_rx_fintv_regnum:
407 size = sizeof (regs.r_fintv);
408 break;
409 case sim_rx_fpsw_regnum:
410 size = sizeof (regs.r_fpsw);
411 break;
fd60dc69
KB
412 case sim_rx_acc_regnum:
413 size = sizeof (regs.r_acc);
414 break;
4f8d4a38
DD
415 default:
416 size = 0;
417 break;
418 }
419 return size;
420}
421
422int
423sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
424{
425 size_t size;
426 DI val;
427
428 check_desc (sd);
429
430 if (!check_regno (regno))
431 return 0;
432
433 size = reg_size (regno);
434
435 if (length != size)
436 return 0;
437
438 switch (regno)
439 {
440 case sim_rx_r0_regnum:
441 val = get_reg (0);
442 break;
443 case sim_rx_r1_regnum:
444 val = get_reg (1);
445 break;
446 case sim_rx_r2_regnum:
447 val = get_reg (2);
448 break;
449 case sim_rx_r3_regnum:
450 val = get_reg (3);
451 break;
452 case sim_rx_r4_regnum:
453 val = get_reg (4);
454 break;
455 case sim_rx_r5_regnum:
456 val = get_reg (5);
457 break;
458 case sim_rx_r6_regnum:
459 val = get_reg (6);
460 break;
461 case sim_rx_r7_regnum:
462 val = get_reg (7);
463 break;
464 case sim_rx_r8_regnum:
465 val = get_reg (8);
466 break;
467 case sim_rx_r9_regnum:
468 val = get_reg (9);
469 break;
470 case sim_rx_r10_regnum:
471 val = get_reg (10);
472 break;
473 case sim_rx_r11_regnum:
474 val = get_reg (11);
475 break;
476 case sim_rx_r12_regnum:
477 val = get_reg (12);
478 break;
479 case sim_rx_r13_regnum:
480 val = get_reg (13);
481 break;
482 case sim_rx_r14_regnum:
483 val = get_reg (14);
484 break;
485 case sim_rx_r15_regnum:
486 val = get_reg (15);
487 break;
488 case sim_rx_isp_regnum:
489 val = get_reg (isp);
490 break;
491 case sim_rx_usp_regnum:
492 val = get_reg (usp);
493 break;
494 case sim_rx_intb_regnum:
495 val = get_reg (intb);
496 break;
497 case sim_rx_pc_regnum:
498 val = get_reg (pc);
499 break;
500 case sim_rx_ps_regnum:
501 val = get_reg (psw);
502 break;
503 case sim_rx_bpc_regnum:
504 val = get_reg (bpc);
505 break;
506 case sim_rx_bpsw_regnum:
507 val = get_reg (bpsw);
508 break;
509 case sim_rx_fintv_regnum:
510 val = get_reg (fintv);
511 break;
512 case sim_rx_fpsw_regnum:
513 val = get_reg (fpsw);
514 break;
fd60dc69
KB
515 case sim_rx_acc_regnum:
516 val = ((DI) get_reg (acchi) << 32) | get_reg (acclo);
517 break;
4f8d4a38
DD
518 default:
519 fprintf (stderr, "rx minisim: unrecognized register number: %d\n",
520 regno);
521 return -1;
522 }
523
524 if (rx_big_endian)
525 put_be (buf, length, val);
526 else
527 put_le (buf, length, val);
528
529 return size;
530}
531
532int
533sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
534{
535 size_t size;
536 DI val;
537
538 check_desc (sd);
539
540 if (!check_regno (regno))
dae477fe 541 return -1;
4f8d4a38
DD
542
543 size = reg_size (regno);
544
545 if (length != size)
dae477fe 546 return -1;
4f8d4a38
DD
547
548 if (rx_big_endian)
549 val = get_be (buf, length);
550 else
551 val = get_le (buf, length);
552
553 switch (regno)
554 {
555 case sim_rx_r0_regnum:
556 put_reg (0, val);
557 break;
558 case sim_rx_r1_regnum:
559 put_reg (1, val);
560 break;
561 case sim_rx_r2_regnum:
562 put_reg (2, val);
563 break;
564 case sim_rx_r3_regnum:
565 put_reg (3, val);
566 break;
567 case sim_rx_r4_regnum:
568 put_reg (4, val);
569 break;
570 case sim_rx_r5_regnum:
571 put_reg (5, val);
572 break;
573 case sim_rx_r6_regnum:
574 put_reg (6, val);
575 break;
576 case sim_rx_r7_regnum:
577 put_reg (7, val);
578 break;
579 case sim_rx_r8_regnum:
580 put_reg (8, val);
581 break;
582 case sim_rx_r9_regnum:
583 put_reg (9, val);
584 break;
585 case sim_rx_r10_regnum:
586 put_reg (10, val);
587 break;
588 case sim_rx_r11_regnum:
589 put_reg (11, val);
590 break;
591 case sim_rx_r12_regnum:
592 put_reg (12, val);
593 break;
594 case sim_rx_r13_regnum:
595 put_reg (13, val);
596 break;
597 case sim_rx_r14_regnum:
598 put_reg (14, val);
599 break;
600 case sim_rx_r15_regnum:
601 put_reg (15, val);
602 break;
603 case sim_rx_isp_regnum:
604 put_reg (isp, val);
605 break;
606 case sim_rx_usp_regnum:
607 put_reg (usp, val);
608 break;
609 case sim_rx_intb_regnum:
610 put_reg (intb, val);
611 break;
612 case sim_rx_pc_regnum:
613 put_reg (pc, val);
614 break;
615 case sim_rx_ps_regnum:
616 put_reg (psw, val);
617 break;
618 case sim_rx_bpc_regnum:
619 put_reg (bpc, val);
620 break;
621 case sim_rx_bpsw_regnum:
622 put_reg (bpsw, val);
623 break;
624 case sim_rx_fintv_regnum:
625 put_reg (fintv, val);
626 break;
627 case sim_rx_fpsw_regnum:
628 put_reg (fpsw, val);
629 break;
a1669f9a
KB
630 case sim_rx_acc_regnum:
631 put_reg (acclo, val & 0xffffffff);
632 put_reg (acchi, (val >> 32) & 0xffffffff);
633 break;
4f8d4a38
DD
634 default:
635 fprintf (stderr, "rx minisim: unrecognized register number: %d\n",
636 regno);
dae477fe 637 return 0;
4f8d4a38
DD
638 }
639
640 return size;
641}
642
643void
644sim_info (SIM_DESC sd, int verbose)
645{
646 check_desc (sd);
647
648 printf ("The rx minisim doesn't collect any statistics.\n");
649}
650
651static volatile int stop;
652static enum sim_stop reason;
653int siggnal;
654
655
656/* Given a signal number used by the RX bsp (that is, newlib),
fa0dd93e
KB
657 return a target signal number used by GDB. */
658static int
659rx_signal_to_gdb_signal (int rx)
4f8d4a38
DD
660{
661 switch (rx)
662 {
663 case 4:
fa0dd93e 664 return GDB_SIGNAL_ILL;
4f8d4a38
DD
665
666 case 5:
fa0dd93e 667 return GDB_SIGNAL_TRAP;
4f8d4a38
DD
668
669 case 10:
fa0dd93e 670 return GDB_SIGNAL_BUS;
4f8d4a38
DD
671
672 case 11:
fa0dd93e 673 return GDB_SIGNAL_SEGV;
4f8d4a38
DD
674
675 case 24:
fa0dd93e 676 return GDB_SIGNAL_XCPU;
4f8d4a38
DD
677
678 case 2:
fa0dd93e 679 return GDB_SIGNAL_INT;
4f8d4a38
DD
680
681 case 8:
fa0dd93e 682 return GDB_SIGNAL_FPE;
4f8d4a38
DD
683
684 case 6:
fa0dd93e 685 return GDB_SIGNAL_ABRT;
4f8d4a38
DD
686 }
687
688 return 0;
689}
690
691
692/* Take a step return code RC and set up the variables consulted by
693 sim_stop_reason appropriately. */
73d4725f 694static void
4f8d4a38
DD
695handle_step (int rc)
696{
697 if (execution_error_get_last_error () != SIM_ERR_NONE)
698 {
699 reason = sim_stopped;
a493e3e2 700 siggnal = GDB_SIGNAL_SEGV;
4f8d4a38
DD
701 }
702 if (RX_STEPPED (rc) || RX_HIT_BREAK (rc))
703 {
704 reason = sim_stopped;
a493e3e2 705 siggnal = GDB_SIGNAL_TRAP;
4f8d4a38
DD
706 }
707 else if (RX_STOPPED (rc))
708 {
709 reason = sim_stopped;
fa0dd93e 710 siggnal = rx_signal_to_gdb_signal (RX_STOP_SIG (rc));
4f8d4a38
DD
711 }
712 else
713 {
714 assert (RX_EXITED (rc));
715 reason = sim_exited;
716 siggnal = RX_EXIT_STATUS (rc);
717 }
718}
719
720
721void
722sim_resume (SIM_DESC sd, int step, int sig_to_deliver)
723{
f9c7014e
DD
724 int rc;
725
4f8d4a38
DD
726 check_desc (sd);
727
728 if (sig_to_deliver != 0)
729 {
730 fprintf (stderr,
731 "Warning: the rx minisim does not implement "
732 "signal delivery yet.\n" "Resuming with no signal.\n");
733 }
734
735 execution_error_clear_last_error ();
736
737 if (step)
f9c7014e
DD
738 {
739 rc = setjmp (decode_jmp_buf);
740 if (rc == 0)
741 rc = decode_opcode ();
742 handle_step (rc);
743 }
4f8d4a38
DD
744 else
745 {
746 /* We don't clear 'stop' here, because then we would miss
747 interrupts that arrived on the way here. Instead, we clear
748 the flag in sim_stop_reason, after GDB has disabled the
749 interrupt signal handler. */
750 for (;;)
751 {
752 if (stop)
753 {
754 stop = 0;
755 reason = sim_stopped;
a493e3e2 756 siggnal = GDB_SIGNAL_INT;
4f8d4a38
DD
757 break;
758 }
759
f9c7014e
DD
760 rc = setjmp (decode_jmp_buf);
761 if (rc == 0)
762 rc = decode_opcode ();
4f8d4a38
DD
763
764 if (execution_error_get_last_error () != SIM_ERR_NONE)
765 {
766 reason = sim_stopped;
a493e3e2 767 siggnal = GDB_SIGNAL_SEGV;
4f8d4a38
DD
768 break;
769 }
770
771 if (!RX_STEPPED (rc))
772 {
773 handle_step (rc);
774 break;
775 }
776 }
777 }
778}
779
780int
781sim_stop (SIM_DESC sd)
782{
783 stop = 1;
784
785 return 1;
786}
787
788void
789sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
790{
791 check_desc (sd);
792
793 *reason_p = reason;
794 *sigrc_p = siggnal;
795}
796
797void
60d847df 798sim_do_command (SIM_DESC sd, const char *cmd)
4f8d4a38 799{
75070a4e
MF
800 const char *arg;
801 char **argv = buildargv (cmd);
4f8d4a38 802
60d847df 803 check_desc (sd);
4f8d4a38 804
75070a4e
MF
805 cmd = arg = "";
806 if (argv != NULL)
4f8d4a38 807 {
75070a4e
MF
808 if (argv[0] != NULL)
809 cmd = argv[0];
810 if (argv[1] != NULL)
811 arg = argv[1];
4f8d4a38 812 }
4f8d4a38
DD
813
814 if (strcmp (cmd, "trace") == 0)
815 {
75070a4e 816 if (strcmp (arg, "on") == 0)
4f8d4a38 817 trace = 1;
75070a4e 818 else if (strcmp (arg, "off") == 0)
4f8d4a38
DD
819 trace = 0;
820 else
821 printf ("The 'sim trace' command expects 'on' or 'off' "
822 "as an argument.\n");
823 }
824 else if (strcmp (cmd, "verbose") == 0)
825 {
75070a4e 826 if (strcmp (arg, "on") == 0)
4f8d4a38 827 verbose = 1;
75070a4e 828 else if (strcmp (arg, "noisy") == 0)
12cb7388 829 verbose = 2;
75070a4e 830 else if (strcmp (arg, "off") == 0)
4f8d4a38
DD
831 verbose = 0;
832 else
12cb7388 833 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
4f8d4a38
DD
834 " as an argument.\n");
835 }
836 else
837 printf ("The 'sim' command expects either 'trace' or 'verbose'"
838 " as a subcommand.\n");
60d847df 839
75070a4e 840 freeargv (argv);
4f8d4a38 841}
af9f7da7
MF
842
843char **
3cb2ab1a 844sim_complete_command (SIM_DESC sd, const char *text, const char *word)
af9f7da7
MF
845{
846 return NULL;
847}
0309f954
AB
848
849/* Stub this out for now. */
850
851char *
852sim_memory_map (SIM_DESC sd)
853{
854 return NULL;
855}
This page took 0.611537 seconds and 4 git commands to generate.