xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32c/gdb-if.c (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1 /* gdb.c --- sim interface to GDB.
2 
3 Copyright (C) 2005-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 <stdlib.h>
26 #include <string.h>
27 #include <ctype.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-m32c.h"
34 
35 #include "cpu.h"
36 #include "mem.h"
37 #include "load.h"
38 #include "syscalls.h"
39 #ifdef TIMER_A
40 #include "timer_a.h"
41 #endif
42 
43 /* I don't want to wrap up all the minisim's data structures in an
44    object and pass that around.  That'd be a big change, and neither
45    GDB nor run needs that ability.
46 
47    So we just have one instance, that lives in global variables, and
48    each time we open it, we re-initialize it.  */
49 struct sim_state
50 {
51   const char *message;
52 };
53 
54 static struct sim_state the_minisim = {
55   "This is the sole m32c minisim instance.  See libsim.a's global variables."
56 };
57 
58 static int open;
59 
60 SIM_DESC
61 sim_open (SIM_OPEN_KIND kind,
62 	  struct host_callback_struct *callback,
63 	  struct bfd *abfd, char * const *argv)
64 {
65   setbuf (stdout, 0);
66   if (open)
67     fprintf (stderr, "m32c minisim: re-opened sim\n");
68 
69   /* The 'run' interface doesn't use this function, so we don't care
70      about KIND; it's always SIM_OPEN_DEBUG.  */
71   if (kind != SIM_OPEN_DEBUG)
72     fprintf (stderr, "m32c minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
73 	     kind);
74 
75   if (abfd)
76     m32c_set_mach (bfd_get_mach (abfd));
77 
78   /* We can use ABFD, if non-NULL to select the appropriate
79      architecture.  But we only support the r8c right now.  */
80 
81   set_callbacks (callback);
82 
83   /* We don't expect any command-line arguments.  */
84 
85   init_mem ();
86   init_regs ();
87 
88   open = 1;
89   return &the_minisim;
90 }
91 
92 static void
93 check_desc (SIM_DESC sd)
94 {
95   if (sd != &the_minisim)
96     fprintf (stderr, "m32c minisim: desc != &the_minisim\n");
97 }
98 
99 void
100 sim_close (SIM_DESC sd, int quitting)
101 {
102   check_desc (sd);
103 
104   /* Not much to do.  At least free up our memory.  */
105   init_mem ();
106 
107   open = 0;
108 }
109 
110 static bfd *
111 open_objfile (const char *filename)
112 {
113   bfd *prog = bfd_openr (filename, 0);
114 
115   if (!prog)
116     {
117       fprintf (stderr, "Can't read %s\n", filename);
118       return 0;
119     }
120 
121   if (!bfd_check_format (prog, bfd_object))
122     {
123       fprintf (stderr, "%s not a m32c program\n", filename);
124       return 0;
125     }
126 
127   return prog;
128 }
129 
130 
131 SIM_RC
132 sim_load (SIM_DESC sd, const char *prog, struct bfd * abfd, int from_tty)
133 {
134   check_desc (sd);
135 
136   if (!abfd)
137     abfd = open_objfile (prog);
138   if (!abfd)
139     return SIM_RC_FAIL;
140 
141   m32c_load (abfd);
142 
143   return SIM_RC_OK;
144 }
145 
146 SIM_RC
147 sim_create_inferior (SIM_DESC sd, struct bfd * abfd,
148 		     char * const *argv, char * const *env)
149 {
150   check_desc (sd);
151 
152   if (abfd)
153     m32c_load (abfd);
154 
155   return SIM_RC_OK;
156 }
157 
158 int
159 sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
160 {
161   check_desc (sd);
162 
163   if (mem == 0)
164     return 0;
165 
166   mem_get_blk ((int) mem, buf, length);
167 
168   return length;
169 }
170 
171 int
172 sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length)
173 {
174   check_desc (sd);
175 
176   mem_put_blk ((int) mem, buf, length);
177 
178   return length;
179 }
180 
181 
182 /* Read the LENGTH bytes at BUF as an little-endian value.  */
183 static DI
184 get_le (unsigned char *buf, int length)
185 {
186   DI acc = 0;
187   while (--length >= 0)
188     acc = (acc << 8) + buf[length];
189 
190   return acc;
191 }
192 
193 /* Store VAL as a little-endian value in the LENGTH bytes at BUF.  */
194 static void
195 put_le (unsigned char *buf, int length, DI val)
196 {
197   int i;
198 
199   for (i = 0; i < length; i++)
200     {
201       buf[i] = val & 0xff;
202       val >>= 8;
203     }
204 }
205 
206 static int
207 check_regno (enum m32c_sim_reg regno)
208 {
209   return 0 <= regno && regno < m32c_sim_reg_num_regs;
210 }
211 
212 static size_t
213 mask_size (int addr_mask)
214 {
215   switch (addr_mask)
216     {
217     case 0xffff:
218       return 2;
219     case 0xfffff:
220     case 0xffffff:
221       return 3;
222     default:
223       fprintf (stderr,
224 	       "m32c minisim: addr_mask_size: unexpected mask 0x%x\n",
225 	       addr_mask);
226       return sizeof (addr_mask);
227     }
228 }
229 
230 static size_t
231 reg_size (enum m32c_sim_reg regno)
232 {
233   switch (regno)
234     {
235     case m32c_sim_reg_r0_bank0:
236     case m32c_sim_reg_r1_bank0:
237     case m32c_sim_reg_r2_bank0:
238     case m32c_sim_reg_r3_bank0:
239     case m32c_sim_reg_r0_bank1:
240     case m32c_sim_reg_r1_bank1:
241     case m32c_sim_reg_r2_bank1:
242     case m32c_sim_reg_r3_bank1:
243     case m32c_sim_reg_flg:
244     case m32c_sim_reg_svf:
245       return 2;
246 
247     case m32c_sim_reg_a0_bank0:
248     case m32c_sim_reg_a1_bank0:
249     case m32c_sim_reg_fb_bank0:
250     case m32c_sim_reg_sb_bank0:
251     case m32c_sim_reg_a0_bank1:
252     case m32c_sim_reg_a1_bank1:
253     case m32c_sim_reg_fb_bank1:
254     case m32c_sim_reg_sb_bank1:
255     case m32c_sim_reg_usp:
256     case m32c_sim_reg_isp:
257       return mask_size (addr_mask);
258 
259     case m32c_sim_reg_pc:
260     case m32c_sim_reg_intb:
261     case m32c_sim_reg_svp:
262     case m32c_sim_reg_vct:
263       return mask_size (membus_mask);
264 
265     case m32c_sim_reg_dmd0:
266     case m32c_sim_reg_dmd1:
267       return 1;
268 
269     case m32c_sim_reg_dct0:
270     case m32c_sim_reg_dct1:
271     case m32c_sim_reg_drc0:
272     case m32c_sim_reg_drc1:
273       return 2;
274 
275     case m32c_sim_reg_dma0:
276     case m32c_sim_reg_dma1:
277     case m32c_sim_reg_dsa0:
278     case m32c_sim_reg_dsa1:
279     case m32c_sim_reg_dra0:
280     case m32c_sim_reg_dra1:
281       return 3;
282 
283     default:
284       fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
285 	       regno);
286       return -1;
287     }
288 }
289 
290 int
291 sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
292 {
293   size_t size;
294 
295   check_desc (sd);
296 
297   if (!check_regno (regno))
298     return 0;
299 
300   size = reg_size (regno);
301   if (length == size)
302     {
303       DI val;
304 
305       switch (regno)
306 	{
307 	case m32c_sim_reg_r0_bank0:
308 	  val = regs.r[0].r_r0;
309 	  break;
310 	case m32c_sim_reg_r1_bank0:
311 	  val = regs.r[0].r_r1;
312 	  break;
313 	case m32c_sim_reg_r2_bank0:
314 	  val = regs.r[0].r_r2;
315 	  break;
316 	case m32c_sim_reg_r3_bank0:
317 	  val = regs.r[0].r_r3;
318 	  break;
319 	case m32c_sim_reg_a0_bank0:
320 	  val = regs.r[0].r_a0;
321 	  break;
322 	case m32c_sim_reg_a1_bank0:
323 	  val = regs.r[0].r_a1;
324 	  break;
325 	case m32c_sim_reg_fb_bank0:
326 	  val = regs.r[0].r_fb;
327 	  break;
328 	case m32c_sim_reg_sb_bank0:
329 	  val = regs.r[0].r_sb;
330 	  break;
331 	case m32c_sim_reg_r0_bank1:
332 	  val = regs.r[1].r_r0;
333 	  break;
334 	case m32c_sim_reg_r1_bank1:
335 	  val = regs.r[1].r_r1;
336 	  break;
337 	case m32c_sim_reg_r2_bank1:
338 	  val = regs.r[1].r_r2;
339 	  break;
340 	case m32c_sim_reg_r3_bank1:
341 	  val = regs.r[1].r_r3;
342 	  break;
343 	case m32c_sim_reg_a0_bank1:
344 	  val = regs.r[1].r_a0;
345 	  break;
346 	case m32c_sim_reg_a1_bank1:
347 	  val = regs.r[1].r_a1;
348 	  break;
349 	case m32c_sim_reg_fb_bank1:
350 	  val = regs.r[1].r_fb;
351 	  break;
352 	case m32c_sim_reg_sb_bank1:
353 	  val = regs.r[1].r_sb;
354 	  break;
355 
356 	case m32c_sim_reg_usp:
357 	  val = regs.r_usp;
358 	  break;
359 	case m32c_sim_reg_isp:
360 	  val = regs.r_isp;
361 	  break;
362 	case m32c_sim_reg_pc:
363 	  val = regs.r_pc;
364 	  break;
365 	case m32c_sim_reg_intb:
366 	  val = regs.r_intbl * 65536 + regs.r_intbl;
367 	  break;
368 	case m32c_sim_reg_flg:
369 	  val = regs.r_flags;
370 	  break;
371 
372 	  /* These registers aren't implemented by the minisim.  */
373 	case m32c_sim_reg_svf:
374 	case m32c_sim_reg_svp:
375 	case m32c_sim_reg_vct:
376 	case m32c_sim_reg_dmd0:
377 	case m32c_sim_reg_dmd1:
378 	case m32c_sim_reg_dct0:
379 	case m32c_sim_reg_dct1:
380 	case m32c_sim_reg_drc0:
381 	case m32c_sim_reg_drc1:
382 	case m32c_sim_reg_dma0:
383 	case m32c_sim_reg_dma1:
384 	case m32c_sim_reg_dsa0:
385 	case m32c_sim_reg_dsa1:
386 	case m32c_sim_reg_dra0:
387 	case m32c_sim_reg_dra1:
388 	  return 0;
389 
390 	default:
391 	  fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
392 		   regno);
393 	  return -1;
394 	}
395 
396       put_le (buf, length, val);
397     }
398 
399   return size;
400 }
401 
402 int
403 sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
404 {
405   size_t size;
406 
407   check_desc (sd);
408 
409   if (!check_regno (regno))
410     return -1;
411 
412   size = reg_size (regno);
413 
414   if (length == size)
415     {
416       DI val = get_le (buf, length);
417 
418       switch (regno)
419 	{
420 	case m32c_sim_reg_r0_bank0:
421 	  regs.r[0].r_r0 = val & 0xffff;
422 	  break;
423 	case m32c_sim_reg_r1_bank0:
424 	  regs.r[0].r_r1 = val & 0xffff;
425 	  break;
426 	case m32c_sim_reg_r2_bank0:
427 	  regs.r[0].r_r2 = val & 0xffff;
428 	  break;
429 	case m32c_sim_reg_r3_bank0:
430 	  regs.r[0].r_r3 = val & 0xffff;
431 	  break;
432 	case m32c_sim_reg_a0_bank0:
433 	  regs.r[0].r_a0 = val & addr_mask;
434 	  break;
435 	case m32c_sim_reg_a1_bank0:
436 	  regs.r[0].r_a1 = val & addr_mask;
437 	  break;
438 	case m32c_sim_reg_fb_bank0:
439 	  regs.r[0].r_fb = val & addr_mask;
440 	  break;
441 	case m32c_sim_reg_sb_bank0:
442 	  regs.r[0].r_sb = val & addr_mask;
443 	  break;
444 	case m32c_sim_reg_r0_bank1:
445 	  regs.r[1].r_r0 = val & 0xffff;
446 	  break;
447 	case m32c_sim_reg_r1_bank1:
448 	  regs.r[1].r_r1 = val & 0xffff;
449 	  break;
450 	case m32c_sim_reg_r2_bank1:
451 	  regs.r[1].r_r2 = val & 0xffff;
452 	  break;
453 	case m32c_sim_reg_r3_bank1:
454 	  regs.r[1].r_r3 = val & 0xffff;
455 	  break;
456 	case m32c_sim_reg_a0_bank1:
457 	  regs.r[1].r_a0 = val & addr_mask;
458 	  break;
459 	case m32c_sim_reg_a1_bank1:
460 	  regs.r[1].r_a1 = val & addr_mask;
461 	  break;
462 	case m32c_sim_reg_fb_bank1:
463 	  regs.r[1].r_fb = val & addr_mask;
464 	  break;
465 	case m32c_sim_reg_sb_bank1:
466 	  regs.r[1].r_sb = val & addr_mask;
467 	  break;
468 
469 	case m32c_sim_reg_usp:
470 	  regs.r_usp = val & addr_mask;
471 	  break;
472 	case m32c_sim_reg_isp:
473 	  regs.r_isp = val & addr_mask;
474 	  break;
475 	case m32c_sim_reg_pc:
476 	  regs.r_pc = val & membus_mask;
477 	  break;
478 	case m32c_sim_reg_intb:
479 	  regs.r_intbl = (val & membus_mask) & 0xffff;
480 	  regs.r_intbh = (val & membus_mask) >> 16;
481 	  break;
482 	case m32c_sim_reg_flg:
483 	  regs.r_flags = val & 0xffff;
484 	  break;
485 
486 	  /* These registers aren't implemented by the minisim.  */
487 	case m32c_sim_reg_svf:
488 	case m32c_sim_reg_svp:
489 	case m32c_sim_reg_vct:
490 	case m32c_sim_reg_dmd0:
491 	case m32c_sim_reg_dmd1:
492 	case m32c_sim_reg_dct0:
493 	case m32c_sim_reg_dct1:
494 	case m32c_sim_reg_drc0:
495 	case m32c_sim_reg_drc1:
496 	case m32c_sim_reg_dma0:
497 	case m32c_sim_reg_dma1:
498 	case m32c_sim_reg_dsa0:
499 	case m32c_sim_reg_dsa1:
500 	case m32c_sim_reg_dra0:
501 	case m32c_sim_reg_dra1:
502 	  return 0;
503 
504 	default:
505 	  fprintf (stderr, "m32c minisim: unrecognized register number: %d\n",
506 		   regno);
507 	  return 0;
508 	}
509     }
510 
511   return size;
512 }
513 
514 static volatile int stop;
515 static enum sim_stop reason;
516 static int siggnal;
517 
518 
519 /* Given a signal number used by the M32C bsp (that is, newlib),
520    return a target signal number used by GDB.  */
521 static int
522 m32c_signal_to_target (int m32c)
523 {
524   switch (m32c)
525     {
526     case 4:
527       return GDB_SIGNAL_ILL;
528 
529     case 5:
530       return GDB_SIGNAL_TRAP;
531 
532     case 10:
533       return GDB_SIGNAL_BUS;
534 
535     case 11:
536       return GDB_SIGNAL_SEGV;
537 
538     case 24:
539       return GDB_SIGNAL_XCPU;
540 
541     case 2:
542       return GDB_SIGNAL_INT;
543 
544     case 8:
545       return GDB_SIGNAL_FPE;
546 
547     case 6:
548       return GDB_SIGNAL_ABRT;
549     }
550 
551   return 0;
552 }
553 
554 
555 /* Take a step return code RC and set up the variables consulted by
556    sim_stop_reason appropriately.  */
557 static void
558 handle_step (int rc)
559 {
560   if (M32C_STEPPED (rc) || M32C_HIT_BREAK (rc))
561     {
562       reason = sim_stopped;
563       siggnal = GDB_SIGNAL_TRAP;
564     }
565   else if (M32C_STOPPED (rc))
566     {
567       reason = sim_stopped;
568       siggnal = m32c_signal_to_target (M32C_STOP_SIG (rc));
569     }
570   else
571     {
572       assert (M32C_EXITED (rc));
573       reason = sim_exited;
574       siggnal = M32C_EXIT_STATUS (rc);
575     }
576 }
577 
578 
579 void
580 sim_resume (SIM_DESC sd, int step, int sig_to_deliver)
581 {
582   check_desc (sd);
583 
584   if (sig_to_deliver != 0)
585     {
586       fprintf (stderr,
587 	       "Warning: the m32c minisim does not implement "
588 	       "signal delivery yet.\n" "Resuming with no signal.\n");
589     }
590 
591   if (step)
592     {
593       handle_step (decode_opcode ());
594 #ifdef TIMER_A
595       update_timer_a ();
596 #endif
597     }
598   else
599     {
600       /* We don't clear 'stop' here, because then we would miss
601          interrupts that arrived on the way here.  Instead, we clear
602          the flag in sim_stop_reason, after GDB has disabled the
603          interrupt signal handler.  */
604       for (;;)
605 	{
606 	  int rc;
607 
608 	  if (stop)
609 	    {
610 	      stop = 0;
611 	      reason = sim_stopped;
612 	      siggnal = GDB_SIGNAL_INT;
613 	      break;
614 	    }
615 
616 	  rc = decode_opcode ();
617 #ifdef TIMER_A
618 	  update_timer_a ();
619 #endif
620 
621 	  if (!M32C_STEPPED (rc))
622 	    {
623 	      handle_step (rc);
624 	      break;
625 	    }
626 	}
627     }
628   m32c_sim_restore_console ();
629 }
630 
631 int
632 sim_stop (SIM_DESC sd)
633 {
634   stop = 1;
635 
636   return 1;
637 }
638 
639 void
640 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
641 {
642   check_desc (sd);
643 
644   *reason_p = reason;
645   *sigrc_p = siggnal;
646 }
647 
648 void
649 sim_do_command (SIM_DESC sd, const char *cmd)
650 {
651   const char *args;
652   char *p = strdup (cmd);
653 
654   check_desc (sd);
655 
656   /* Skip leading whitespace.  */
657   while (isspace (*p))
658     p++;
659 
660   /* Find the extent of the command word.  */
661   for (p = cmd; *p; p++)
662     if (isspace (*p))
663       break;
664 
665   /* Null-terminate the command word, and record the start of any
666      further arguments.  */
667   if (*p)
668     {
669       *p = '\0';
670       args = p + 1;
671       while (isspace (*args))
672 	args++;
673     }
674   else
675     args = p;
676 
677   if (strcmp (cmd, "trace") == 0)
678     {
679       if (strcmp (args, "on") == 0)
680 	trace = 1;
681       else if (strcmp (args, "off") == 0)
682 	trace = 0;
683       else
684 	printf ("The 'sim trace' command expects 'on' or 'off' "
685 		"as an argument.\n");
686     }
687   else if (strcmp (cmd, "verbose") == 0)
688     {
689       if (strcmp (args, "on") == 0)
690 	verbose = 1;
691       else if (strcmp (args, "off") == 0)
692 	verbose = 0;
693       else
694 	printf ("The 'sim verbose' command expects 'on' or 'off'"
695 		" as an argument.\n");
696     }
697   else
698     printf ("The 'sim' command expects either 'trace' or 'verbose'"
699 	    " as a subcommand.\n");
700 
701   free (p);
702 }
703 
704 char **
705 sim_complete_command (SIM_DESC sd, const char *text, const char *word)
706 {
707   return NULL;
708 }
709 
710 void
711 sim_info (SIM_DESC sd, int verbose)
712 {
713   printf ("The m32c minisim doesn't collect any statistics.\n");
714 }
715