* Makefile.in (SIM_OBJS): Remove sim-resume.o

* interp.c (sim_resume): New function from sim-resume.c, install
	the stepping event after having processed the pending ticks.
	(has_stepped): Likewise.
	(sim_info): Produce an output only if verbose or STATE_VERBOSE_P.
This commit is contained in:
Stephane Carrez 2001-07-22 12:33:58 +00:00
parent 308a7829db
commit 00d0c012ef
3 changed files with 88 additions and 1 deletions

View File

@ -1,3 +1,11 @@
2001-07-22 Stephane Carrez <Stephane.Carrez@worldnet.fr>
* Makefile.in (SIM_OBJS): Remove sim-resume.o
* interp.c (sim_resume): New function from sim-resume.c, install
the stepping event after having processed the pending ticks.
(has_stepped): Likewise.
(sim_info): Produce an output only if verbose or STATE_VERBOSE_P.
2001-07-10 Andrew Cagney <ac131313@redhat.com>
* Makefile.in (gencode): Provide explicit path to gencode.c.

View File

@ -30,7 +30,6 @@ SIM_OBJS = $(M68HC11_OBJS) \
sim-hload.o \
sim-engine.o \
sim-stop.o \
sim-resume.o \
sim-hrw.o \
sim-reason.o \
$(SIM_EXTRA_OBJS)

View File

@ -437,6 +437,10 @@ sim_info (SIM_DESC sd, int verbose)
const char *cpu_type;
const struct bfd_arch_info *arch;
/* Nothing to do if there is no verbose flag set. */
if (verbose == 0 && STATE_VERBOSE_P (sd) == 0)
return;
arch = STATE_ARCHITECTURE (sd);
if (arch->arch == bfd_arch_m68hc11)
cpu_type = "68HC11";
@ -601,3 +605,79 @@ sim_do_command (SIM_DESC sd, char *cmd)
if (STATE_ARCHITECTURE (sd) != cpu->cpu_configured_arch)
sim_hw_configure (sd);
}
/* Halt the simulator after just one instruction */
static void
has_stepped (SIM_DESC sd,
void *data)
{
ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIM_SIGTRAP);
}
/* Generic resume - assumes the existance of sim_engine_run */
void
sim_resume (SIM_DESC sd,
int step,
int siggnal)
{
sim_engine *engine = STATE_ENGINE (sd);
jmp_buf buf;
int jmpval;
ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
/* we only want to be single stepping the simulator once */
if (engine->stepper != NULL)
{
sim_events_deschedule (sd, engine->stepper);
engine->stepper = NULL;
}
sim_module_resume (sd);
/* run/resume the simulator */
engine->jmpbuf = &buf;
jmpval = setjmp (buf);
if (jmpval == sim_engine_start_jmpval
|| jmpval == sim_engine_restart_jmpval)
{
int last_cpu_nr = sim_engine_last_cpu_nr (sd);
int next_cpu_nr = sim_engine_next_cpu_nr (sd);
int nr_cpus = sim_engine_nr_cpus (sd);
sim_events_preprocess (sd, last_cpu_nr >= nr_cpus, next_cpu_nr >= nr_cpus);
if (next_cpu_nr >= nr_cpus)
next_cpu_nr = 0;
/* Only deliver the siggnal ]sic] the first time through - don't
re-deliver any siggnal during a restart. */
if (jmpval == sim_engine_restart_jmpval)
siggnal = 0;
/* Install the stepping event after having processed some
pending events. This is necessary for HC11/HC12 simulator
because the tick counter is incremented by the number of cycles
the instruction took. Some pending ticks to process can still
be recorded internally by the simulator and sim_events_preprocess
will handle them. If the stepping event is inserted before,
these pending ticks will raise the event and the simulator will
stop without having executed any instruction. */
if (step)
engine->stepper = sim_events_schedule (sd, 0, has_stepped, sd);
#ifdef SIM_CPU_EXCEPTION_RESUME
{
sim_cpu* cpu = STATE_CPU (sd, next_cpu_nr);
SIM_CPU_EXCEPTION_RESUME(sd, cpu, siggnal);
}
#endif
sim_engine_run (sd, next_cpu_nr, nr_cpus, siggnal);
}
engine->jmpbuf = NULL;
sim_module_suspend (sd);
}