Skip to content

regression in qtest clock_set/clock_step

Host environment

  • Operating system: Ubunut 24.04
  • OS/kernel version:
  • Architecture: x86_64
  • QEMU flavor: qemu-system-x86_64
  • QEMU version: 3428a389
  • QEMU command line: see below

Emulated/Virtualized environment

  • Operating system: N/A
  • OS/kernel version: N/A
  • Architecture: x86_64

Description of problem

As of QEMU 9.0 the script included below would increment the time via qtest, but it is now broken and time doesn't seem to be updated. I do note that the QEMU sources use clock_step extensively via qtest_clock_step, but nothing seems to be using the return value so maybe that's why it hasn't been noticed?

It seems to have been broken in bc02be45 which was trying to prevent some deadlock. You can prove that this breaks it by setting a breakpoint in qemu_virtual_clock_set_ns -- it never gets called.

Steps to reproduce

Run this python script from your QEMU build directory:

#!/usr/bin/env python3

import subprocess
import socket
import typing

qemu_path = "./qemu-system-x86_64"


def main():
    s1, s2 = socket.socketpair()

    qemu = subprocess.Popen(
        [
            qemu_path,
            "-S",
            "-display",
            "none",
            "-chardev", f"socket,id=qtest,fd={s1.fileno()},nodelay=on",
            "-qtest", "chardev:qtest",
            "-qtest-log", "/dev/fd/2",
            "-accel", "qtest",
        ],
        pass_fds=[s1.fileno()],
    )

    try:

        fp = s2.makefile("rw", buffering=1)

        fp.write(f"clock_set 1234\n")
        result = fp.readline()[:-1].split(" ")
        assert result == ["OK", "1234"], f"Unexpected result: {result}"
    finally:
        qemu.kill()


if __name__ == "__main__":
    main()
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information