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