1 /* gdb-if.c -- sim interface to GDB.
3 Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
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.
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.
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/>. */
29 #include "gdb/callback.h"
30 #include "gdb/remote-sim.h"
31 #include "gdb/signals.h"
32 #include "gdb/sim-rx.h"
41 /* Ideally, we'd wrap up all the minisim's data structures in an
42 object and pass that around. However, neither GDB nor run needs
45 So we just have one instance, that lives in global variables, and
46 each time we open it, we re-initialize it. */
52 static struct sim_state the_minisim = {
53 "This is the sole rx minisim instance. See libsim.a's global variables."
59 sim_open (SIM_OPEN_KIND kind,
60 struct host_callback_struct *callback,
61 struct bfd *abfd, char **argv)
64 fprintf (stderr, "rx minisim: re-opened sim\n");
66 /* The 'run' interface doesn't use this function, so we don't care
67 about KIND; it's always SIM_OPEN_DEBUG. */
68 if (kind != SIM_OPEN_DEBUG)
69 fprintf (stderr, "rx minisim: sim_open KIND != SIM_OPEN_DEBUG: %d\n",
72 set_callbacks (callback);
74 /* We don't expect any command-line arguments. */
78 execution_error_init_debugger ();
80 sim_disasm_init (abfd);
86 check_desc (SIM_DESC sd)
88 if (sd != &the_minisim)
89 fprintf (stderr, "rx minisim: desc != &the_minisim\n");
93 sim_close (SIM_DESC sd, int quitting)
97 /* Not much to do. At least free up our memory. */
104 open_objfile (const char *filename)
106 bfd *prog = bfd_openr (filename, 0);
110 fprintf (stderr, "Can't read %s\n", filename);
114 if (!bfd_check_format (prog, bfd_object))
116 fprintf (stderr, "%s not a rx program\n", filename);
123 static struct swap_list
126 struct swap_list *next;
130 free_swap_list (void)
134 struct swap_list *next = swap_list->next;
140 /* When running in big endian mode, we must do an additional
141 byte swap of memory areas used to hold instructions. See
142 the comment preceding rx_load in load.c to see why this is
145 Construct a list of memory areas that must be byte swapped.
146 This list will be consulted when either reading or writing
150 build_swap_list (struct bfd *abfd)
155 /* Nothing to do when in little endian mode. */
159 for (s = abfd->sections; s; s = s->next)
161 if ((s->flags & SEC_LOAD) && (s->flags & SEC_CODE))
163 struct swap_list *sl;
166 size = bfd_get_section_size (s);
170 sl = malloc (sizeof (struct swap_list));
172 sl->next = swap_list;
173 sl->start = bfd_section_lma (abfd, s);
174 sl->end = sl->start + size;
181 addr_in_swap_list (bfd_vma addr)
185 for (s = swap_list; s; s = s->next)
187 if (s->start <= addr && addr < s->end)
194 sim_load (SIM_DESC sd, char *prog, struct bfd *abfd, int from_tty)
199 abfd = open_objfile (prog);
204 build_swap_list (abfd);
210 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
217 build_swap_list (abfd);
224 sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length)
233 execution_error_clear_last_error ();
235 for (i = 0; i < length; i++)
237 bfd_vma addr = mem + i;
238 int do_swap = addr_in_swap_list (addr);
239 buf[i] = mem_get_qi (addr ^ (do_swap ? 3 : 0));
241 if (execution_error_get_last_error () != SIM_ERR_NONE)
249 sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length)
255 execution_error_clear_last_error ();
257 for (i = 0; i < length; i++)
259 bfd_vma addr = mem + i;
260 int do_swap = addr_in_swap_list (addr);
261 mem_put_qi (addr ^ (do_swap ? 3 : 0), buf[i]);
263 if (execution_error_get_last_error () != SIM_ERR_NONE)
270 /* Read the LENGTH bytes at BUF as an little-endian value. */
272 get_le (unsigned char *buf, int length)
275 while (--length >= 0)
276 acc = (acc << 8) + buf[length];
281 /* Read the LENGTH bytes at BUF as a big-endian value. */
283 get_be (unsigned char *buf, int length)
287 acc = (acc << 8) + *buf++;
292 /* Store VAL as a little-endian value in the LENGTH bytes at BUF. */
294 put_le (unsigned char *buf, int length, DI val)
298 for (i = 0; i < length; i++)
305 /* Store VAL as a big-endian value in the LENGTH bytes at BUF. */
307 put_be (unsigned char *buf, int length, DI val)
311 for (i = length-1; i >= 0; i--)
320 check_regno (enum sim_rx_regnum regno)
322 return 0 <= regno && regno < sim_rx_num_regs;
326 reg_size (enum sim_rx_regnum regno)
332 case sim_rx_r0_regnum:
333 size = sizeof (regs.r[0]);
335 case sim_rx_r1_regnum:
336 size = sizeof (regs.r[1]);
338 case sim_rx_r2_regnum:
339 size = sizeof (regs.r[2]);
341 case sim_rx_r3_regnum:
342 size = sizeof (regs.r[3]);
344 case sim_rx_r4_regnum:
345 size = sizeof (regs.r[4]);
347 case sim_rx_r5_regnum:
348 size = sizeof (regs.r[5]);
350 case sim_rx_r6_regnum:
351 size = sizeof (regs.r[6]);
353 case sim_rx_r7_regnum:
354 size = sizeof (regs.r[7]);
356 case sim_rx_r8_regnum:
357 size = sizeof (regs.r[8]);
359 case sim_rx_r9_regnum:
360 size = sizeof (regs.r[9]);
362 case sim_rx_r10_regnum:
363 size = sizeof (regs.r[10]);
365 case sim_rx_r11_regnum:
366 size = sizeof (regs.r[11]);
368 case sim_rx_r12_regnum:
369 size = sizeof (regs.r[12]);
371 case sim_rx_r13_regnum:
372 size = sizeof (regs.r[13]);
374 case sim_rx_r14_regnum:
375 size = sizeof (regs.r[14]);
377 case sim_rx_r15_regnum:
378 size = sizeof (regs.r[15]);
380 case sim_rx_isp_regnum:
381 size = sizeof (regs.r_isp);
383 case sim_rx_usp_regnum:
384 size = sizeof (regs.r_usp);
386 case sim_rx_intb_regnum:
387 size = sizeof (regs.r_intb);
389 case sim_rx_pc_regnum:
390 size = sizeof (regs.r_pc);
392 case sim_rx_ps_regnum:
393 size = sizeof (regs.r_psw);
395 case sim_rx_bpc_regnum:
396 size = sizeof (regs.r_bpc);
398 case sim_rx_bpsw_regnum:
399 size = sizeof (regs.r_bpsw);
401 case sim_rx_fintv_regnum:
402 size = sizeof (regs.r_fintv);
404 case sim_rx_fpsw_regnum:
405 size = sizeof (regs.r_fpsw);
407 case sim_rx_acc_regnum:
408 size = sizeof (regs.r_acc);
418 sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
425 if (!check_regno (regno))
428 size = reg_size (regno);
435 case sim_rx_r0_regnum:
438 case sim_rx_r1_regnum:
441 case sim_rx_r2_regnum:
444 case sim_rx_r3_regnum:
447 case sim_rx_r4_regnum:
450 case sim_rx_r5_regnum:
453 case sim_rx_r6_regnum:
456 case sim_rx_r7_regnum:
459 case sim_rx_r8_regnum:
462 case sim_rx_r9_regnum:
465 case sim_rx_r10_regnum:
468 case sim_rx_r11_regnum:
471 case sim_rx_r12_regnum:
474 case sim_rx_r13_regnum:
477 case sim_rx_r14_regnum:
480 case sim_rx_r15_regnum:
483 case sim_rx_isp_regnum:
486 case sim_rx_usp_regnum:
489 case sim_rx_intb_regnum:
490 val = get_reg (intb);
492 case sim_rx_pc_regnum:
495 case sim_rx_ps_regnum:
498 case sim_rx_bpc_regnum:
501 case sim_rx_bpsw_regnum:
502 val = get_reg (bpsw);
504 case sim_rx_fintv_regnum:
505 val = get_reg (fintv);
507 case sim_rx_fpsw_regnum:
508 val = get_reg (fpsw);
510 case sim_rx_acc_regnum:
511 val = ((DI) get_reg (acchi) << 32) | get_reg (acclo);
514 fprintf (stderr, "rx minisim: unrecognized register number: %d\n",
520 put_be (buf, length, val);
522 put_le (buf, length, val);
528 sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length)
535 if (!check_regno (regno))
538 size = reg_size (regno);
544 val = get_be (buf, length);
546 val = get_le (buf, length);
550 case sim_rx_r0_regnum:
553 case sim_rx_r1_regnum:
556 case sim_rx_r2_regnum:
559 case sim_rx_r3_regnum:
562 case sim_rx_r4_regnum:
565 case sim_rx_r5_regnum:
568 case sim_rx_r6_regnum:
571 case sim_rx_r7_regnum:
574 case sim_rx_r8_regnum:
577 case sim_rx_r9_regnum:
580 case sim_rx_r10_regnum:
583 case sim_rx_r11_regnum:
586 case sim_rx_r12_regnum:
589 case sim_rx_r13_regnum:
592 case sim_rx_r14_regnum:
595 case sim_rx_r15_regnum:
598 case sim_rx_isp_regnum:
601 case sim_rx_usp_regnum:
604 case sim_rx_intb_regnum:
607 case sim_rx_pc_regnum:
610 case sim_rx_ps_regnum:
613 case sim_rx_bpc_regnum:
616 case sim_rx_bpsw_regnum:
619 case sim_rx_fintv_regnum:
620 put_reg (fintv, val);
622 case sim_rx_fpsw_regnum:
626 fprintf (stderr, "rx minisim: unrecognized register number: %d\n",
635 sim_info (SIM_DESC sd, int verbose)
639 printf ("The rx minisim doesn't collect any statistics.\n");
642 static volatile int stop;
643 static enum sim_stop reason;
647 /* Given a signal number used by the RX bsp (that is, newlib),
648 return a host signal number. (Oddly, the gdb/sim interface uses
649 host signal numbers...) */
651 rx_signal_to_host (int rx)
700 /* Take a step return code RC and set up the variables consulted by
701 sim_stop_reason appropriately. */
705 if (execution_error_get_last_error () != SIM_ERR_NONE)
707 reason = sim_stopped;
708 siggnal = TARGET_SIGNAL_SEGV;
710 if (RX_STEPPED (rc) || RX_HIT_BREAK (rc))
712 reason = sim_stopped;
713 siggnal = TARGET_SIGNAL_TRAP;
715 else if (RX_STOPPED (rc))
717 reason = sim_stopped;
718 siggnal = rx_signal_to_host (RX_STOP_SIG (rc));
722 assert (RX_EXITED (rc));
724 siggnal = RX_EXIT_STATUS (rc);
730 sim_resume (SIM_DESC sd, int step, int sig_to_deliver)
734 if (sig_to_deliver != 0)
737 "Warning: the rx minisim does not implement "
738 "signal delivery yet.\n" "Resuming with no signal.\n");
741 execution_error_clear_last_error ();
744 handle_step (decode_opcode ());
747 /* We don't clear 'stop' here, because then we would miss
748 interrupts that arrived on the way here. Instead, we clear
749 the flag in sim_stop_reason, after GDB has disabled the
750 interrupt signal handler. */
756 reason = sim_stopped;
757 siggnal = TARGET_SIGNAL_INT;
761 int rc = decode_opcode ();
763 if (execution_error_get_last_error () != SIM_ERR_NONE)
765 reason = sim_stopped;
766 siggnal = TARGET_SIGNAL_SEGV;
770 if (!RX_STEPPED (rc))
780 sim_stop (SIM_DESC sd)
788 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
797 sim_do_command (SIM_DESC sd, char *cmd)
803 /* Skip leading whitespace. */
807 /* Find the extent of the command word. */
808 for (p = cmd; *p; p++)
812 /* Null-terminate the command word, and record the start of any
813 further arguments. */
819 while (isspace (*args))
825 if (strcmp (cmd, "trace") == 0)
827 if (strcmp (args, "on") == 0)
829 else if (strcmp (args, "off") == 0)
832 printf ("The 'sim trace' command expects 'on' or 'off' "
833 "as an argument.\n");
835 else if (strcmp (cmd, "verbose") == 0)
837 if (strcmp (args, "on") == 0)
839 else if (strcmp (args, "noisy") == 0)
841 else if (strcmp (args, "off") == 0)
844 printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
845 " as an argument.\n");
848 printf ("The 'sim' command expects either 'trace' or 'verbose'"
849 " as a subcommand.\n");