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

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