target/s390x: Fix missing interrupts for small CKC values

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.

Cc: qemu-stable@nongnu.org
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-ID: <20251016175954.41153-2-iii@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Ilya Leoshkevich 2025-10-16 19:58:30 +02:00 committed by Thomas Huth
parent 0281105bc4
commit df7e9243d5

View file

@ -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);
}