tests/functional/m68k: Use proper polling in the next-cube test

The next-cube tests currently sleep for 2 seconds to wait for the
guest's display to come up with the expected results. That's bad
since there is still a theoretical race left here, and since there
are two subtests, the whole test takes more than 4 seconds this way.

Looking at what the firmware does, there is a better way instead of
blindly waiting for two seconds: The firmware is writing some values
to the FPU registers during a test (and never touches them again
afterwards, so we can be sure about the final values), so we can
poll for the right values in those registers to know when we reached
a state when the display is initialized for sure. We just have to
also make sure to not look for text anymore that is only printed
after the FPU test has been done by the guest firmware.

This way the whole tests finishes in less than 1 second here, and
there should be no race condition here anymore.

Message-ID: <20250909074817.84661-1-thuth@redhat.com>
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
Thomas Huth 2025-09-09 09:48:17 +02:00
parent ab8008b231
commit 6096dfa6c5

View file

@ -29,8 +29,15 @@ class NextCubeMachine(QemuSystemTest):
self.vm.launch()
self.log.info('VM launched, waiting for display')
# TODO: wait for the 'displaysurface_create 1120x832' trace-event.
time.sleep(2)
# Wait for the FPU test to finish, then the display is available, too:
while True:
res = self.vm.cmd('human-monitor-command',
command_line='info registers')
if ("F0 = 400e 8400000000000000" in res and
"F1 = 400e 83ff000000000000" in res and
"F2 = 400e 83ff000000000000" in res):
break
time.sleep(0.1)
res = self.vm.cmd('human-monitor-command',
command_line='screendump %s' % screenshot_path)
@ -56,10 +63,10 @@ class NextCubeMachine(QemuSystemTest):
self.check_bootrom_framebuffer(screenshot_path)
lines = tesseract_ocr(screenshot_path)
text = '\n'.join(lines)
self.assertIn('Backplane slot', text)
self.assertIn('Ethernet address', text)
self.assertIn('Testing the FPU', text)
self.assertIn('System test failed. Error code', text)
self.assertIn('Boot command', text)
self.assertIn('Next>', text)
if __name__ == '__main__':
QemuSystemTest.main()