yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

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

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