]> Git Repo - qemu.git/commitdiff
s390x/tcg: avoid overflows in time2tod/tod2time
authorDavid Hildenbrand <[email protected]>
Wed, 27 Jun 2018 13:44:02 +0000 (15:44 +0200)
committerCornelia Huck <[email protected]>
Mon, 2 Jul 2018 08:37:38 +0000 (10:37 +0200)
Big values for the TOD/ns clock can result in some overflows that can be
avoided. Not all overflows can be handled however, as the conversion either
multiplies by 4.096 or divided by 4.096.

Apply the trick used in the Linux kernel in arch/s390/include/asm/timex.h
for tod_to_ns() and use the same trick also for the conversion in the
other direction.

Reviewed-by: Thomas Huth <[email protected]>
Signed-off-by: David Hildenbrand <[email protected]>
Message-Id: <20180627134410[email protected]>
Signed-off-by: Cornelia Huck <[email protected]>
target/s390x/internal.h

index e392a02d12d6f800da0a75dce35e01ff1b8356a2..6cf63340bf8e8245387912b835d03ca57586c8a1 100644 (file)
@@ -243,13 +243,14 @@ enum cc_op {
 /* Converts ns to s390's clock format */
 static inline uint64_t time2tod(uint64_t ns)
 {
-    return (ns << 9) / 125;
+    return (ns << 9) / 125 + (((ns & 0xff10000000000000ull) / 125) << 9);
+
 }
 
 /* Converts s390's clock format to ns */
 static inline uint64_t tod2time(uint64_t t)
 {
-    return (t * 125) >> 9;
+    return ((t >> 9) * 125) + (((t & 0x1ff) * 125) >> 9);
 }
 
 static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
This page took 0.02388 seconds and 4 git commands to generate.