On 16/10/2025 19.58, 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.
Cc: [email protected]
Reviewed-by: Thomas Huth <[email protected]>
Signed-off-by: Ilya Leoshkevich <[email protected]>
---
Hi Ilya,
this patch unfortunately broke reverse debugging on the s390x target.
Something like this used to work before:
qemu-img create -f qcow2 /tmp/disk.qcow2 2G
./qemu-system-s390x -nographic \
-icount shift=6,rr=record,rrfile=replay.bin,rrsnapshot=init \
-net none -drive file=/tmp/disk.qcow2,if=none
./qemu-system-s390x -nographic \
-icount shift=6,rr=replay,rrfile=replay.bin,rrsnapshot=init \
-net none -drive file=/tmp/disk.qcow2,if=none
With this commit and later, the replay hangs somewhere in an endless loop.
Do you have any ideas what could go wrong here?
Thanks,
Thomas
diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
index 6d9d601d29a..215b5b9d933 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);
}