|
|
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 |
|