xref: /netbsd-src/external/gpl3/gdb/dist/sim/rx/gdb-if.c (revision 181254a7b1bdde6873432bffef2d2decc4b5c22f)
1 /* gdb-if.c -- sim interface to GDB.
2 
3 Copyright (C) 2008-2019 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
5 
6 This file is part of the GNU simulators.
7 
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.
12 
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.
17 
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/>.  */
20 
21 #include "config.h"
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"
40 #include "trace.h"
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.  */
48 struct sim_state
49 {
50   const char *message;
51 };
52 
53 static struct sim_state the_minisim = {
54   "This is the sole rx minisim instance.  See libsim.a's global variables."
55 };
56 
57 static int rx_sim_is_open;
58 
59 SIM_DESC
60 sim_open (SIM_OPEN_KIND kind,
61 	  struct host_callback_struct *callback,
62 	  struct bfd *abfd, char * const *argv)
63 {
64   if (rx_sim_is_open)
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);
82   rx_sim_is_open = 1;
83   return &the_minisim;
84 }
85 
86 static void
87 check_desc (SIM_DESC sd)
88 {
89   if (sd != &the_minisim)
90     fprintf (stderr, "rx minisim: desc != &the_minisim\n");
91 }
92 
93 void
94 sim_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 
101   rx_sim_is_open = 0;
102 }
103 
104 static bfd *
105 open_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 
124 static struct swap_list
125 {
126   bfd_vma start, end;
127   struct swap_list *next;
128 } *swap_list = NULL;
129 
130 static void
131 free_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 
150 static void
151 build_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 
167 	  size = bfd_get_section_size (s);
168 	  if (size <= 0)
169 	    continue;
170 
171 	  sl = malloc (sizeof (struct swap_list));
172 	  assert (sl != NULL);
173 	  sl->next = swap_list;
174 	  sl->start = bfd_section_lma (abfd, s);
175 	  sl->end = sl->start + size;
176 	  swap_list = sl;
177 	}
178     }
179 }
180 
181 static int
182 addr_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 
194 SIM_RC
195 sim_load (SIM_DESC sd, const char *prog, struct bfd *abfd, int from_tty)
196 {
197   check_desc (sd);
198 
199   if (!abfd)
200     abfd = open_objfile (prog);
201   if (!abfd)
202     return SIM_RC_FAIL;
203 
204   rx_load (abfd, get_callbacks ());
205   build_swap_list (abfd);
206 
207   return SIM_RC_OK;
208 }
209 
210 SIM_RC
211 sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
212 		     char * const *argv, char * const *env)
213 {
214   check_desc (sd);
215 
216   if (abfd)
217     {
218       rx_load (abfd, NULL);
219       build_swap_list (abfd);
220     }
221 
222   return SIM_RC_OK;
223 }
224 
225 int
226 sim_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 
250 int
251 sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length)
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.  */
273 static DI
274 get_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.  */
284 static DI
285 get_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.  */
295 static void
296 put_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.  */
308 static void
309 put_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 
321 static int
322 check_regno (enum sim_rx_regnum regno)
323 {
324   return 0 <= regno && regno < sim_rx_num_regs;
325 }
326 
327 static size_t
328 reg_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;
409     case sim_rx_acc_regnum:
410       size = sizeof (regs.r_acc);
411       break;
412     default:
413       size = 0;
414       break;
415     }
416   return size;
417 }
418 
419 int
420 sim_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;
512     case sim_rx_acc_regnum:
513       val = ((DI) get_reg (acchi) << 32) | get_reg (acclo);
514       break;
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 
529 int
530 sim_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))
538     return -1;
539 
540   size = reg_size (regno);
541 
542   if (length != size)
543     return -1;
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;
627     case sim_rx_acc_regnum:
628       put_reg (acclo, val & 0xffffffff);
629       put_reg (acchi, (val >> 32) & 0xffffffff);
630       break;
631     default:
632       fprintf (stderr, "rx minisim: unrecognized register number: %d\n",
633 	       regno);
634       return 0;
635     }
636 
637   return size;
638 }
639 
640 void
641 sim_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 
648 static volatile int stop;
649 static enum sim_stop reason;
650 int siggnal;
651 
652 
653 /* Given a signal number used by the RX bsp (that is, newlib),
654    return a target signal number used by GDB.  */
655 static int
656 rx_signal_to_gdb_signal (int rx)
657 {
658   switch (rx)
659     {
660     case 4:
661       return GDB_SIGNAL_ILL;
662 
663     case 5:
664       return GDB_SIGNAL_TRAP;
665 
666     case 10:
667       return GDB_SIGNAL_BUS;
668 
669     case 11:
670       return GDB_SIGNAL_SEGV;
671 
672     case 24:
673       return GDB_SIGNAL_XCPU;
674 
675     case 2:
676       return GDB_SIGNAL_INT;
677 
678     case 8:
679       return GDB_SIGNAL_FPE;
680 
681     case 6:
682       return GDB_SIGNAL_ABRT;
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.  */
691 void
692 handle_step (int rc)
693 {
694   if (execution_error_get_last_error () != SIM_ERR_NONE)
695     {
696       reason = sim_stopped;
697       siggnal = GDB_SIGNAL_SEGV;
698     }
699   if (RX_STEPPED (rc) || RX_HIT_BREAK (rc))
700     {
701       reason = sim_stopped;
702       siggnal = GDB_SIGNAL_TRAP;
703     }
704   else if (RX_STOPPED (rc))
705     {
706       reason = sim_stopped;
707       siggnal = rx_signal_to_gdb_signal (RX_STOP_SIG (rc));
708     }
709   else
710     {
711       assert (RX_EXITED (rc));
712       reason = sim_exited;
713       siggnal = RX_EXIT_STATUS (rc);
714     }
715 }
716 
717 
718 void
719 sim_resume (SIM_DESC sd, int step, int sig_to_deliver)
720 {
721   int rc;
722 
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)
735     {
736       rc = setjmp (decode_jmp_buf);
737       if (rc == 0)
738 	rc = decode_opcode ();
739       handle_step (rc);
740     }
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;
753 	      siggnal = GDB_SIGNAL_INT;
754 	      break;
755 	    }
756 
757 	  rc = setjmp (decode_jmp_buf);
758 	  if (rc == 0)
759 	    rc = decode_opcode ();
760 
761 	  if (execution_error_get_last_error () != SIM_ERR_NONE)
762 	    {
763 	      reason = sim_stopped;
764 	      siggnal = GDB_SIGNAL_SEGV;
765 	      break;
766 	    }
767 
768 	  if (!RX_STEPPED (rc))
769 	    {
770 	      handle_step (rc);
771 	      break;
772 	    }
773 	}
774     }
775 }
776 
777 int
778 sim_stop (SIM_DESC sd)
779 {
780   stop = 1;
781 
782   return 1;
783 }
784 
785 void
786 sim_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 
794 void
795 sim_do_command (SIM_DESC sd, const char *cmd)
796 {
797   const char *args;
798   char *p = strdup (cmd);
799 
800   check_desc (sd);
801 
802   /* Skip leading whitespace.  */
803   while (isspace (*p))
804     p++;
805 
806   /* Find the extent of the command word.  */
807   for (p = cmd; *p; p++)
808     if (isspace (*p))
809       break;
810 
811   /* Null-terminate the command word, and record the start of any
812      further arguments.  */
813   if (*p)
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;
837       else if (strcmp (args, "noisy") == 0)
838 	verbose = 2;
839       else if (strcmp (args, "off") == 0)
840 	verbose = 0;
841       else
842 	printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
843 		" as an argument.\n");
844     }
845   else
846     printf ("The 'sim' command expects either 'trace' or 'verbose'"
847 	    " as a subcommand.\n");
848 
849   free (p);
850 }
851 
852 char **
853 sim_complete_command (SIM_DESC sd, const char *text, const char *word)
854 {
855   return NULL;
856 }
857