26ba25
From 45383e6748287c088d09d7f94dfbac76c38e7329 Mon Sep 17 00:00:00 2001
26ba25
From: David Hildenbrand <david@redhat.com>
26ba25
Date: Fri, 21 Dec 2018 15:36:03 +0000
26ba25
Subject: [PATCH 01/22] s390x/tcg: avoid overflows in time2tod/tod2time
26ba25
26ba25
RH-Author: David Hildenbrand <david@redhat.com>
26ba25
Message-id: <20181221153614.27961-2-david@redhat.com>
26ba25
Patchwork-id: 83744
26ba25
O-Subject: [RHEL-8.0 qemu-kvm v2 PATCH 01/12] s390x/tcg: avoid overflows in time2tod/tod2time
26ba25
Bugzilla: 1653569
26ba25
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
26ba25
RH-Acked-by: Thomas Huth <thuth@redhat.com>
26ba25
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
26ba25
26ba25
Big values for the TOD/ns clock can result in some overflows that can be
26ba25
avoided. Not all overflows can be handled however, as the conversion either
26ba25
multiplies by 4.096 or divided by 4.096.
26ba25
26ba25
Apply the trick used in the Linux kernel in arch/s390/include/asm/timex.h
26ba25
for tod_to_ns() and use the same trick also for the conversion in the
26ba25
other direction.
26ba25
26ba25
Reviewed-by: Thomas Huth <thuth@redhat.com>
26ba25
Signed-off-by: David Hildenbrand <david@redhat.com>
26ba25
Message-Id: <20180627134410.4901-2-david@redhat.com>
26ba25
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
26ba25
(cherry picked from commit 14055ce53c2d901d826ffad7fb7d6bb8ab46bdfd)
26ba25
Signed-off-by: David Hildenbrand <david@redhat.com>
26ba25
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
26ba25
---
26ba25
 target/s390x/internal.h | 5 +++--
26ba25
 1 file changed, 3 insertions(+), 2 deletions(-)
26ba25
26ba25
diff --git a/target/s390x/internal.h b/target/s390x/internal.h
26ba25
index d911e84..d1ed06f 100644
26ba25
--- a/target/s390x/internal.h
26ba25
+++ b/target/s390x/internal.h
26ba25
@@ -243,13 +243,14 @@ enum cc_op {
26ba25
 /* Converts ns to s390's clock format */
26ba25
 static inline uint64_t time2tod(uint64_t ns)
26ba25
 {
26ba25
-    return (ns << 9) / 125;
26ba25
+    return (ns << 9) / 125 + (((ns & 0xff10000000000000ull) / 125) << 9);
26ba25
+
26ba25
 }
26ba25
 
26ba25
 /* Converts s390's clock format to ns */
26ba25
 static inline uint64_t tod2time(uint64_t t)
26ba25
 {
26ba25
-    return (t * 125) >> 9;
26ba25
+    return ((t >> 9) * 125) + (((t & 0x1ff) * 125) >> 9);
26ba25
 }
26ba25
 
26ba25
 static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
26ba25
-- 
26ba25
1.8.3.1
26ba25