diff options
author | Jiri Gaisler <jiri@gaisler.se> | 2020-10-25 11:21:21 -0400 |
---|---|---|
committer | Jiri Gaisler <jiri@gaisler.se> | 2020-10-25 11:21:21 -0400 |
commit | 511bfc5dd1b679e5a99850290ba29313995b0fb1 (patch) | |
tree | 5899416dc45a052e60e3e3cb282e5745fc95f0e2 | |
parent | 117828bda28b2013f06b12f6e2373e8aac276d70 (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.c | 18 | ||||
-rw-r--r-- | sis.c | 4 | ||||
-rw-r--r-- | sis.h | 2 | ||||
-rw-r--r-- | sparc.c | 2 |
4 files changed, 26 insertions, 0 deletions
@@ -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; @@ -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; @@ -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); @@ -916,6 +916,8 @@ sparc_dispatch_instruction (sregs) else if (19 == rd) { pwd_enter (sregs); + if (sync_rt) + rt_sync(); } } break; |