aboutsummaryrefslogtreecommitdiff
path: root/sim/h8300
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2015-12-30 04:28:10 -0500
committerMike Frysinger <vapier@gentoo.org>2015-12-30 05:27:18 -0500
commit4ca9d09e826e959f382ab45b2e1dfa8125135124 (patch)
tree55f210b8f1c00b94ba1e367d156a06460b07ba48 /sim/h8300
parent5658c2571f34fcf7f0f10dbd45ddc6680aa57576 (diff)
downloadbinutils-4ca9d09e826e959f382ab45b2e1dfa8125135124.zip
binutils-4ca9d09e826e959f382ab45b2e1dfa8125135124.tar.gz
binutils-4ca9d09e826e959f382ab45b2e1dfa8125135124.tar.bz2
sim: h8300: switch to common sim-resume
Diffstat (limited to 'sim/h8300')
-rw-r--r--sim/h8300/ChangeLog14
-rw-r--r--sim/h8300/Makefile.in3
-rw-r--r--sim/h8300/compile.c80
3 files changed, 57 insertions, 40 deletions
diff --git a/sim/h8300/ChangeLog b/sim/h8300/ChangeLog
index 0e5937f..6878ab9 100644
--- a/sim/h8300/ChangeLog
+++ b/sim/h8300/ChangeLog
@@ -1,5 +1,19 @@
2015-12-30 Mike Frysinger <vapier@gentoo.org>
+ * compile.c (lvalue): Change sim_engine_set_run_state calls to
+ sim_engine_halt. Declare local cpu.
+ (fetch_1): Likewise.
+ (store_1): Likewise.
+ (sim_resume): Rename to ...
+ (step_once): ... this. Declare init1, poll_count, reason, and
+ sigrc variables. Delete step checking. Change
+ sim_engine_set_run_state calls to sim_engine_halt. Delete poll
+ logic. Change while(1) loop to while(0).
+ (sim_engine_run): New function.
+ * Makefile.in (SIM_OBJS): Add sim-resume.o.
+
+2015-12-30 Mike Frysinger <vapier@gentoo.org>
+
* compile.c (sim_open): Delete current_alignment and
current_target_byte_order assignments.
* configure.ac: Call SIM_AC_OPTION_ENDIAN and
diff --git a/sim/h8300/Makefile.in b/sim/h8300/Makefile.in
index 468ecc4..f63cffd 100644
--- a/sim/h8300/Makefile.in
+++ b/sim/h8300/Makefile.in
@@ -18,6 +18,7 @@
## COMMON_PRE_CONFIG_FRAG
SIM_OBJS = compile.o \
- $(SIM_NEW_COMMON_OBJS)
+ $(SIM_NEW_COMMON_OBJS) \
+ sim-resume.o
## COMMON_POST_CONFIG_FRAG
diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c
index cd2e6a6..5bb4b5d 100644
--- a/sim/h8300/compile.c
+++ b/sim/h8300/compile.c
@@ -549,6 +549,8 @@ bitfrom (int x)
static unsigned int
lvalue (SIM_DESC sd, int x, int rn, unsigned int *val)
{
+ SIM_CPU *cpu = STATE_CPU (sd, 0);
+
if (val == NULL) /* Paranoia. */
return -1;
@@ -564,7 +566,7 @@ lvalue (SIM_DESC sd, int x, int rn, unsigned int *val)
*val = X (OP_MEM, SP);
break;
default:
- sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
+ sim_engine_halt (sd, cpu, NULL, NULL_CIA, sim_stopped, SIM_SIGSEGV);
return -1;
}
return 0;
@@ -1306,6 +1308,7 @@ static unsigned short *wreg[16];
static int
fetch_1 (SIM_DESC sd, ea_type *arg, int *val, int twice)
{
+ SIM_CPU *cpu = STATE_CPU (sd, 0);
int rn = arg->reg;
int abs = arg->literal;
int r;
@@ -1511,7 +1514,7 @@ fetch_1 (SIM_DESC sd, ea_type *arg, int *val, int twice)
case X (OP_MEM, SB): /* Why isn't this implemented? */
default:
- sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
+ sim_engine_halt (sd, cpu, NULL, NULL_CIA, sim_stopped, SIM_SIGSEGV);
return -1;
}
return 0; /* Success. */
@@ -1542,6 +1545,7 @@ fetch2 (SIM_DESC sd, ea_type *arg, int *val)
static int
store_1 (SIM_DESC sd, ea_type *arg, int n, int twice)
{
+ SIM_CPU *cpu = STATE_CPU (sd, 0);
int rn = arg->reg;
int abs = arg->literal;
int t;
@@ -1720,7 +1724,7 @@ store_1 (SIM_DESC sd, ea_type *arg, int n, int twice)
case X (OP_MEM, SW): /* Why isn't this implemented? */
case X (OP_MEM, SL): /* Why isn't this implemented? */
default:
- sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
+ sim_engine_halt (sd, cpu, NULL, NULL_CIA, sim_stopped, SIM_SIGSEGV);
return -1;
}
return 0;
@@ -1855,14 +1859,12 @@ case O (name, SB): \
goto next; \
}
-void
-sim_resume (SIM_DESC sd, int step, int siggnal)
+static void
+step_once (SIM_DESC sd, SIM_CPU *cpu)
{
- static int init1;
int cycles = 0;
int insts = 0;
int tick_start = get_now ();
- int poll_count = 0;
int res;
int tmp;
int rd;
@@ -1872,27 +1874,16 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
int c, nz, v, n, u, h, ui, intMaskBit;
int trace, intMask;
int oldmask;
- enum sim_stop reason;
- int sigrc;
host_callback *sim_callback = STATE_CALLBACK (sd);
init_pointers (sd);
- if (step)
- {
- sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
- }
- else
- {
- sim_engine_set_run_state (sd, sim_running, 0);
- }
-
pc = h8_get_pc (sd);
/* The PC should never be odd. */
if (pc & 0x1)
{
- sim_engine_set_run_state (sd, sim_stopped, SIGBUS);
+ sim_engine_halt (sd, cpu, NULL, NULL_CIA, sim_stopped, SIM_SIGBUS);
return;
}
@@ -3582,7 +3573,7 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
goto end;
case O (O_ILL, SB): /* illegal */
- sim_engine_set_run_state (sd, sim_stopped, SIGILL);
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGILL);
goto end;
case O (O_SLEEP, SN): /* sleep */
@@ -3592,8 +3583,8 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
SIM_WIFEXITED (h8_get_reg (sd, 0)))
{
/* This trap comes from _exit, not from gdb. */
- sim_engine_set_run_state (sd, sim_exited,
- SIM_WEXITSTATUS (h8_get_reg (sd, 0)));
+ sim_engine_halt (sd, cpu, NULL, pc, sim_exited,
+ SIM_WEXITSTATUS (h8_get_reg (sd, 0)));
}
#if 0
/* Unfortunately this won't really work, because
@@ -3602,14 +3593,14 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
else if (SIM_WIFSTOPPED (h8_get_reg (sd, 0)))
{
/* Pass the stop signal up to gdb. */
- sim_engine_set_run_state (sd, sim_stopped,
- SIM_WSTOPSIG (h8_get_reg (sd, 0)));
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped,
+ SIM_WSTOPSIG (h8_get_reg (sd, 0)));
}
#endif
else
{
/* Treat it as a sigtrap. */
- sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGTRAP);
}
goto end;
@@ -3650,7 +3641,7 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
goto end;
case O (O_BPT, SN):
- sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGTRAP);
goto end;
case O (O_BSETEQ, SB):
@@ -4323,13 +4314,13 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
default:
illegal:
- sim_engine_set_run_state (sd, sim_stopped, SIGILL);
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGILL);
goto end;
}
sim_io_printf (sd, "sim_resume: internal error.\n");
- sim_engine_set_run_state (sd, sim_stopped, SIGILL);
+ sim_engine_halt (sd, cpu, NULL, pc, sim_stopped, SIM_SIGILL);
goto end;
setc:
@@ -4540,18 +4531,9 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
else
pc = code->next_pc;
- end:
-
- if (--poll_count < 0)
- {
- poll_count = POLL_QUIT_INTERVAL;
- if ((*sim_callback->poll_quit) != NULL
- && (*sim_callback->poll_quit) (sim_callback))
- sim_engine_set_run_state (sd, sim_stopped, SIGINT);
- }
- sim_engine_get_run_state (sd, &reason, &sigrc);
- } while (reason == sim_running);
+ } while (0);
+ end:
h8_set_ticks (sd, h8_get_ticks (sd) + get_now () - tick_start);
h8_set_cycles (sd, h8_get_cycles (sd) + cycles);
h8_set_insts (sd, h8_get_insts (sd) + insts);
@@ -4564,6 +4546,26 @@ sim_resume (SIM_DESC sd, int step, int siggnal)
h8_set_mask (sd, oldmask);
}
+void
+sim_engine_run (SIM_DESC sd,
+ int next_cpu_nr, /* ignore */
+ int nr_cpus, /* ignore */
+ int siggnal)
+{
+ sim_cpu *cpu;
+
+ SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
+
+ cpu = STATE_CPU (sd, 0);
+
+ while (1)
+ {
+ step_once (sd, cpu);
+ if (sim_events_tick (sd))
+ sim_events_process (sd);
+ }
+}
+
int
sim_write (SIM_DESC sd, SIM_ADDR addr, const unsigned char *buffer, int size)
{