gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / sim / m32c / gdb-if.c
1 /* gdb.c --- sim interface to GDB.
2
3 Copyright (C) 2005-2020 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 }
This page took 0.052181 seconds and 4 git commands to generate.