|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] Correct system time calculation
Yes, x86 doesnt define UnsignedMultiplyExtract128
I'll make the following change, so x86 still compiles, even though x86 Windows
should be phased out, now that Win10 is end-of-life.
#ifdef _X86_
Age = (Age * TscSystemMul) >> 32;
#else
Age = UnsignedMultiplyExtract128(Age, TscSystemMul, 32);
#endif
Owen
________________________________________
From: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
Sent: 11 November 2025 5:19 PM
To: Owen Smith; win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Subject: Re: [PATCH] Correct system time calculation
On 11/11/2025 15:10, Owen Smith wrote:
> UnsignedMultiplyExtract128 is not available in the 22000 EWDK
>
> Owen
>
I managed to build it with EWDK_fe_release_20348_210507-1500.iso. Are
you building for 32-bit x86?
> ________________________________________
> From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of
> Owen Smith <owen.smith@xxxxxxxxxx>
> Sent: 11 November 2025 8:53 AM
> To: Tu Dinh; win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Subject: Re: [PATCH] Correct system time calculation
>
> Interestingly, xen.h defines the time calculation in a comment, but does not
> account for tsc_shift being a signed int8_t value.
>
> https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=xen/include/public/xen.h;h=82b9c05a76b7faedded8778fb8274a0d3d5d31e4;hb=HEAD#l677
>
> Reviewed-by: Owen Smith <owen.smith@xxxxxxxxxx>
>
> ________________________________________
> From: win-pv-devel <win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx> on behalf of
> Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
> Sent: 10 November 2025 7:13 PM
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Tu Dinh
> Subject: [PATCH] Correct system time calculation
>
> SharedInfoGetTime uses the naive formula ((Tsc << TscShift) *
> TscSystemMul) >> 32 to calculate the current system time. However, there
> are two issues: firstly, TscShift may be negative (to indicate a right
> shift); and secondly, multiplying the shifted Tsc with TscSystemMul will
> throw away the result's upper 64 bits.
>
> Adjust for negative shift amounts and use UnsignedMultiplyExtract128 to
> correctly perform the multiplication.
>
> Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx>
> ---
> src/xenbus/shared_info.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
> index 06e0aec..fe29470 100644
> --- a/src/xenbus/shared_info.c
> +++ b/src/xenbus/shared_info.c
> @@ -356,6 +356,7 @@ SharedInfoGetTime(
> ULONGLONG NanoSeconds;
> ULONGLONG Timestamp;
> ULONGLONG Tsc;
> + ULONGLONG Age;
> ULONGLONG SystemTime;
> ULONG TscSystemMul;
> CHAR TscShift;
> @@ -404,10 +405,15 @@ SharedInfoGetTime(
> KeLowerIrql(Irql);
>
> // Number of elapsed ticks since timestamp was captured
> - Tsc -= Timestamp;
> + Age = Tsc - Timestamp;
> + if (TscShift < 0)
> + Age >>= -TscShift;
> + else
> + Age <<= TscShift;
> + Age = UnsignedMultiplyExtract128(Age, TscSystemMul, 32);
>
> // Time in nanoseconds since boot
> - SystemTime += ((Tsc << TscShift) * TscSystemMul) >> 32;
> + SystemTime += Age;
>
> Trace("WALLCLOCK TIME AT BOOT: Seconds = %llu NanoSeconds = %llu\n",
> Seconds,
> --
> 2.51.0.windows.2
>
>
>
> --
> Ngoc Tu Dinh | Vates XCP-ng Developer
>
> XCP-ng & Xen Orchestra - Vates solutions
>
> web: https://vates.tech
>
>
>
>
--
Ngoc Tu Dinh | Vates XCP-ng Developer
XCP-ng & Xen Orchestra - Vates solutions
web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |