base: Avoid dividing by zero in Time::[gs]etTick.
authorGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 07:59:56 +0000 (00:59 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 21:39:28 +0000 (21:39 +0000)
Those functions used the value SimClock::Int::ns which, if the time
resolution is larger than 1ns, can/will be zero. That will make
getTick always return zero, and setTick divide by zero. This change
modifies those functions so that the math they do avoids using any
integer Ticks per time unit value except for Frequency. It seems
unlikely that the Ticks will increment at less than 1Hz.

Change-Id: I5cc9db14699c00dcbff48e4593b98522b13b4ccd
Reviewed-on: https://gem5-review.googlesource.com/12573
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/base/time.cc

index 6e9d7ccfb4d8adf447075ed5e93b758a5ed0d106..80bc546e1c42839fee3e4f91d1e0c2c83a9a1795 100644 (file)
@@ -57,14 +57,17 @@ Time::_set(bool monotonic)
 void
 Time::setTick(Tick ticks)
 {
-    uint64_t nsecs = ticks / SimClock::Int::ns;
-    set(nsecs / NSEC_PER_SEC, nsecs % NSEC_PER_SEC);
+    uint64_t secs = ticks / SimClock::Frequency;
+    ticks -= secs * SimClock::Frequency;
+    uint64_t nsecs = static_cast<uint64_t>(ticks * SimClock::Float::GHz);
+    set(secs, nsecs);
 }
 
 Tick
 Time::getTick() const
 {
-    return (nsec() + sec() * NSEC_PER_SEC) * SimClock::Int::ns;
+    return sec() * SimClock::Frequency +
+        static_cast<uint64_t>(nsec() * SimClock::Float::ns);
 }
 
 string