On 14/10/2025 18.05, Ilya Leoshkevich wrote:
> Suppose TOD clock value is 0x1111111111111111 and clock-comparator
> value is 0, in which case clock-comparator interruption should occur
> immediately.
>
> With the current code, tod2time(env->ckc - td->base.low) ends up being
> a very large number, so this interruption never happens.
>
> Fix by firing the timer immediately if env->ckc < td->base.low.
>
> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
> ---
> target/s390x/tcg/misc_helper.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
> index 6d9d601d29a..afcf7688eda 100644
> --- a/target/s390x/tcg/misc_helper.c
> +++ b/target/s390x/tcg/misc_helper.c
> @@ -199,11 +199,15 @@ static void update_ckc_timer(CPUS390XState *env)
> return;
> }
>
> - /* difference between origins */
> - time = env->ckc - td->base.low;
> + if (env->ckc < td->base.low) {
> + time = 0;
> + } else {
> + /* difference between origins */
> + time = env->ckc - td->base.low;
>
> - /* nanoseconds */
> - time = tod2time(time);
> + /* nanoseconds */
> + time = tod2time(time);
> + }
>
> timer_mod(env->tod_timer, time);
> }
Yes, this looks right.
Reviewed-by: Thomas Huth <thuth@redhat.com>