summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Gaisler <jiri@gaisler.se>2020-10-25 11:21:21 -0400
committerJiri Gaisler <jiri@gaisler.se>2020-10-25 11:21:21 -0400
commit511bfc5dd1b679e5a99850290ba29313995b0fb1 (patch)
tree5899416dc45a052e60e3e3cb282e5745fc95f0e2
parent117828bda28b2013f06b12f6e2373e8aac276d70 (diff)
Add -rt option to synch sim to wall time
* Active during cpu power-down to avoid run-away sim time. Useful for interactive applications.
-rw-r--r--func.c18
-rw-r--r--sis.c4
-rw-r--r--sis.h2
-rw-r--r--sparc.c2
4 files changed, 26 insertions, 0 deletions
diff --git a/func.c b/func.c
index 23bc31a..07f585c 100644
--- a/func.c
+++ b/func.c
@@ -63,6 +63,7 @@ uint32 last_load_addr = 0;
int nouartrx = 0;
int port = 1234;
int sim_run = 0;
+int sync_rt = 0;
/* RAM and ROM for all systems */
char romb[ROM_SIZE];
@@ -1054,6 +1055,23 @@ pwd_enter (struct pstate *sregs)
sregs->hold += delta;
}
+void
+rt_sync()
+{
+ double walltime, realtime, dtime;
+ int64 stime;
+ stime = ebase.simtime - ebase.simstart; /* Total simulated time */
+ realtime = (double) ((stime) / 1000000.0 / ebase.freq);
+ walltime = ebase.tottime + get_time () - ebase.starttime;
+ dtime = (realtime - walltime);
+ if (dtime > 0.001)
+ {
+ if (dtime > 1.0)
+ dtime = 0.1;
+ usleep ((useconds_t) (dtime * 1E6));
+ }
+}
+
int
check_bpt (sregs)
struct pstate *sregs;
diff --git a/sis.c b/sis.c
index ff351f8..2dc76ce 100644
--- a/sis.c
+++ b/sis.c
@@ -147,6 +147,10 @@ main (argc, argv)
{
run = 1;
}
+ else if (strcmp (argv[stat], "-rt") == 0)
+ {
+ sync_rt = 1;
+ }
else if (strcmp (argv[stat], "-erc32") == 0)
{
lcputype = CPU_ERC32;
diff --git a/sis.h b/sis.h
index 35797e4..4eccb83 100644
--- a/sis.h
+++ b/sis.h
@@ -325,6 +325,8 @@ extern void int_handler (int sig);
extern uint32 daddr;
extern void l1data_update (uint32 address, uint32 cpu);
extern void l1data_snoop (uint32 address, uint32 cpu);
+extern int sync_rt;
+extern void rt_sync();
/* exec.c */
extern void init_regs (struct pstate *sregs);
diff --git a/sparc.c b/sparc.c
index dee95c1..01cbe04 100644
--- a/sparc.c
+++ b/sparc.c
@@ -916,6 +916,8 @@ sparc_dispatch_instruction (sregs)
else if (19 == rd)
{
pwd_enter (sregs);
+ if (sync_rt)
+ rt_sync();
}
}
break;