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