[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.