tests/functional: Add test for IBM PPE42 instructions

Adds a functional test for the IBM PPE42 instructions which
downloads a test image from a public github repo and then
loads and executes the image.
(see https://github.com/milesg-github/ppe42-tests for details)

Test status is checked by periodically issuing 'info register'
commands and checking the NIP value.  If the NIP is 0xFFF80200
then the test successfully executed to completion.  If the
machine stops before the test completes or if a 90 second
timeout is reached, then the test is marked as having failed.

This test does not test any PowerPC instructions as it is
expected that these instructions are well covered in other
tests.  Only instructions that are unique to the IBM PPE42
processor are tested.

Signed-off-by: Glenn Miles <milesg@linux.ibm.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Tested-by: Cédric Le Goater <clg@redhat.com>
Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Link: https://lore.kernel.org/r/20250925201758.652077-10-milesg@linux.ibm.com
Message-ID: <20250925201758.652077-10-milesg@linux.ibm.com>
This commit is contained in:
Glenn Miles 2025-09-25 15:17:47 -05:00 committed by Harsh Prateek Bora
parent 0ad5b8d9c8
commit fd93e521b0
No known key found for this signature in database
GPG key ID: 4544E994F9D68FBB
3 changed files with 81 additions and 0 deletions

View file

@ -1535,6 +1535,7 @@ M: Glenn Miles <milesg@linux.ibm.com>
L: qemu-ppc@nongnu.org
S: Odd Fixes
F: hw/ppc/ppe42_machine.c
F: tests/functional/ppc/test_ppe42.py
PReP
M: Hervé Poussineau <hpoussin@reactos.org>

View file

@ -15,6 +15,7 @@ tests_ppc_system_thorough = [
'bamboo',
'mac',
'mpc8544ds',
'ppe42',
'replay',
'sam460ex',
'tuxrun',

View file

@ -0,0 +1,79 @@
#!/usr/bin/env python3
#
# Functional tests for the IBM PPE42 processor
#
# Copyright (c) 2025, IBM Corporation
#
# SPDX-License-Identifier: GPL-2.0-or-later
from qemu_test import QemuSystemTest, Asset
import asyncio
class Ppe42Machine(QemuSystemTest):
timeout = 90
poll_period = 1.0
ASSET_PPE42_TEST_IMAGE = Asset(
('https://github.com/milesg-github/ppe42-tests/raw/refs/heads/main/'
'images/ppe42-test.out'),
'03c1ac0fb7f6c025102a02776a93b35101dae7c14b75e4eab36a337e39042ea8')
def _test_completed(self):
self.log.info("Checking for test completion...")
try:
output = self.vm.cmd('human-monitor-command',
command_line='info registers')
except Exception as err:
self.log.debug(f"'info registers' cmd failed due to {err=},"
" {type(err)=}")
raise
self.log.info(output)
if "NIP fff80200" in output:
self.log.info("<test completed>")
return True
else:
self.log.info("<test not completed>")
return False
def _wait_pass_fail(self, timeout):
while not self._test_completed():
if timeout >= self.poll_period:
timeout = timeout - self.poll_period
self.log.info(f"Waiting {self.poll_period} seconds for test"
" to complete...")
e = None
try:
e = self.vm.event_wait('STOP', self.poll_period)
except asyncio.TimeoutError:
self.log.info("Poll period ended.")
pass
except Exception as err:
self.log.debug(f"event_wait() failed due to {err=},"
" {type(err)=}")
raise
if e != None:
self.log.debug(f"Execution stopped: {e}")
self.log.debug("Exiting due to test failure")
self.fail("Failure detected!")
break
else:
self.fail("Timed out waiting for test completion.")
def test_ppe42_instructions(self):
self.set_machine('ppe42_machine')
self.require_accelerator("tcg")
image_path = self.ASSET_PPE42_TEST_IMAGE.fetch()
self.vm.add_args('-nographic')
self.vm.add_args('-device', f'loader,file={image_path}')
self.vm.add_args('-device', 'loader,addr=0xfff80040,cpu-num=0')
self.vm.add_args('-action', 'panic=pause')
self.vm.launch()
self._wait_pass_fail(self.timeout)
if __name__ == '__main__':
QemuSystemTest.main()