Do top level sim-hw module for device tree.
[deliverable/binutils-gdb.git] / sim / common / sim-resume.c
1 /* Generic simulator resume.
2 Copyright (C) 1997 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4
5 This file is part of GDB, the GNU debugger.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License along
18 with this program; if not, write to the Free Software Foundation, Inc.,
19 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20
21 #include <signal.h>
22
23 #include "sim-main.h"
24 #include "sim-assert.h"
25
26 /* Halt the simulator after just one instruction */
27
28 static void
29 has_stepped (SIM_DESC sd,
30 void *data)
31 {
32 ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
33 sim_engine_halt (sd, NULL, NULL, NULL_CIA, sim_stopped, SIGTRAP);
34 }
35
36
37 /* Generic resume - assumes the existance of sim_engine_run */
38
39 void
40 sim_resume (SIM_DESC sd,
41 int step,
42 int siggnal)
43 {
44 sim_engine *engine = STATE_ENGINE (sd);
45 jmp_buf buf;
46 int jmpval;
47
48 ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
49
50 /* we only want to be single stepping the simulator once */
51 if (engine->stepper != NULL)
52 {
53 sim_events_deschedule (sd, engine->stepper);
54 engine->stepper = NULL;
55 }
56 if (step)
57 engine->stepper = sim_events_schedule (sd, 1, has_stepped, sd);
58
59 /* run/resume the simulator */
60 /* jmpval: 0 (initial use) start simulator
61 1 halt simulator
62 2 restart simulator
63 */
64
65 engine->jmpbuf = &buf;
66 jmpval = setjmp (buf);
67 if (jmpval == 0 || jmpval == 2)
68 {
69 int last_cpu_nr = sim_engine_last_cpu_nr (sd);
70 int next_cpu_nr = sim_engine_next_cpu_nr (sd);
71 int nr_cpus = MAX_NR_PROCESSORS; /* FIXME */
72 sim_events_preprocess (sd, last_cpu_nr >= nr_cpus, next_cpu_nr >= nr_cpus);
73 if (next_cpu_nr >= nr_cpus)
74 next_cpu_nr = 0;
75 sim_engine_run (sd, next_cpu_nr, siggnal);
76 }
77 engine->jmpbuf = NULL;
78 }
This page took 0.030108 seconds and 4 git commands to generate.