/* run front end support for all the simulators.
- Copyright (C) 1992, 93-96, 1997 Free Software Foundation, Inc.
+ Copyright (C) 1992, 93-96, 1997, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "libiberty.h"
#include "bfd.h"
-#include "callback.h"
-#include "remote-sim.h"
-
-#include "../libiberty/alloca-conf.h"
+#include "gdb/callback.h"
+#include "gdb/remote-sim.h"
+#include "ansidecl.h"
+#include "run-sim.h"
static void usage PARAMS ((void));
extern int optind;
static char *myname;
-
-/* NOTE: sim_size() and sim_trace() are going away */
-extern int sim_trace PARAMS ((SIM_DESC sd));
-
extern int getopt ();
+#ifdef NEED_UI_LOOP_HOOK
+/* Gdb foolery. This is only needed for gdb using a gui. */
+int (*ui_loop_hook) PARAMS ((int signo));
+#endif
+
static SIM_DESC sd;
static RETSIGTYPE
-cntrl_c (int sig)
+cntrl_c (int sig ATTRIBUTE_UNUSED)
{
if (! sim_stop (sd))
{
int i;
int verbose = 0;
int trace = 0;
+#ifdef SIM_HAVE_ENVIRONMENT
+ int operating_p = 0;
+#endif
char *name;
static char *no_args[4];
char **sim_argv = &no_args[0];
/* FIXME: This is currently being migrated into sim_open.
Simulators that use functions such as sim_size() still require
- this. */
+ this. */
default_callback.init (&default_callback);
sim_set_callbacks (&default_callback);
+#ifdef SIM_TARGET_SWITCHES
+ ac = sim_target_parse_command_line (ac, av);
+#endif
+
/* FIXME: This is currently being rewritten to have each simulator
do all argv processing. */
#ifdef SIM_H8300 /* FIXME: quick hack */
- while ((i = getopt (ac, av, "a:c:m:p:s:htv")) != EOF)
+ while ((i = getopt (ac, av, "a:c:m:op:s:hStv")) != EOF)
#else
- while ((i = getopt (ac, av, "a:c:m:p:s:tv")) != EOF)
+ while ((i = getopt (ac, av, "a:c:m:op:s:tv")) != EOF)
#endif
switch (i)
{
/* FIXME: Rename to sim_set_mem_size. */
sim_size (atoi (optarg));
break;
+#ifdef SIM_HAVE_ENVIRONMENT
+ case 'o':
+ /* Operating enironment where any signals are delivered to the
+ target. */
+ operating_p = 1;
+ break;
+#endif
#ifdef SIM_HAVE_PROFILE
case 'p':
sim_set_profile (atoi (optarg));
#endif
case 't':
trace = 1;
- /* FIXME: need to allow specification of what to trace. */
- /* sim_set_trace (1); */
break;
case 'v':
/* Things that are printed with -v are the kinds of things that
/* FIXME: Quick hack, to be replaced by more general facility. */
#ifdef SIM_H8300
case 'h':
- set_h8300h (1);
+ set_h8300h (1, 0);
+ break;
+ case 'S':
+ set_h8300h (1, 1);
break;
#endif
default:
}
abfd = bfd_openr (name, 0);
- if (!abfd)
+ if (!abfd)
{
- fprintf (stderr, "%s: can't open %s: %s\n",
+ fprintf (stderr, "%s: can't open %s: %s\n",
myname, name, bfd_errmsg (bfd_get_error ()));
exit (1);
}
#endif
/* Ensure that any run-time initialisation that needs to be
- performed by the simulator can occur. */
+ performed by the simulator can occur. */
sd = sim_open (SIM_OPEN_STANDALONE, &default_callback, abfd, sim_argv);
if (sd == 0)
exit (1);
if (sim_create_inferior (sd, abfd, prog_args, NULL) == SIM_RC_FAIL)
exit (1);
- prev_sigint = signal (SIGINT, cntrl_c);
+#ifdef SIM_HAVE_ENVIRONMENT
+ /* NOTE: An old simulator supporting the operating environment MUST
+ provide sim_set_trace() and not sim_trace(). That way
+ sim_stop_reason() can be used to determine any stop reason. */
+ if (trace)
+ sim_set_trace ();
+ sigrc = 0;
+ do
+ {
+ prev_sigint = signal (SIGINT, cntrl_c);
+ sim_resume (sd, 0, sigrc);
+ signal (SIGINT, prev_sigint);
+ sim_stop_reason (sd, &reason, &sigrc);
+ }
+ while (operating_p && reason == sim_stopped && sigrc != SIGINT);
+#else
if (trace)
{
int done = 0;
+ prev_sigint = signal (SIGINT, cntrl_c);
while (!done)
{
done = sim_trace (sd);
}
+ signal (SIGINT, prev_sigint);
+ sim_stop_reason (sd, &reason, &sigrc);
}
else
{
- sim_resume (sd, 0, 0);
+ prev_sigint = signal (SIGINT, cntrl_c);
+ sigrc = 0;
+ sim_resume (sd, 0, sigrc);
+ signal (SIGINT, prev_sigint);
+ sim_stop_reason (sd, &reason, &sigrc);
}
- signal (SIGINT, prev_sigint);
+#endif
if (verbose)
sim_info (sd, 0);
-
- sim_stop_reason (sd, &reason, &sigrc);
-
sim_close (sd, 0);
/* If reason is sim_exited, then sigrc holds the exit code which we want
case sim_signalled:
case sim_stopped:
if (sigrc != 0)
- fprintf (stderr, "program stopped with signal %d.\n", sigrc);
+ fprintf (stderr, "program stopped with signal %d.\n", sigrc);
break;
case sim_exited:
break;
case sim_running:
- case sim_polling: /* these indicate a serious problem */
+ case sim_polling: /* These indicate a serious problem. */
abort ();
break;
fprintf (stderr, "-c size Set simulator cache size to `size'.\n");
#endif
#ifdef SIM_H8300
- fprintf (stderr, "-h Executable is for h8/300h or h8/300s.\n");
+ fprintf (stderr, "-h Executable is for h8/300h.\n");
+ fprintf (stderr, "-S Executable is for h8/300s.\n");
#endif
fprintf (stderr, "-m size Set memory size of simulator, in bytes.\n");
+#ifdef SIM_HAVE_ENVIRONMENT
+ fprintf (stderr, "-o Select operating (kernel) environment.\n");
+#endif
#ifdef SIM_HAVE_PROFILE
fprintf (stderr, "-p freq Set profiling frequency.\n");
fprintf (stderr, "-s size Set profiling size.\n");
fprintf (stderr, "\n");
fprintf (stderr, "program args Arguments to pass to simulated program.\n");
fprintf (stderr, " Note: Very few simulators support this.\n");
+#ifdef SIM_TARGET_SWITCHES
+ fprintf (stderr, "\nTarget specific options:\n");
+ sim_target_display_usage ();
+#endif
exit (1);
}