Blame SOURCES/kvm-s390x-tcg-avoid-overflows-in-time2tod-tod2time.patch

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