qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [RFC PATCH 00/11] ppc: avocado test additions and new defaults
@ 2023-10-10  7:52 Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test Nicholas Piggin
                   ` (11 more replies)
  0 siblings, 12 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

Sorry for going missing for a while, had a few things on but have
been working on figuring out testing and git setup to get some
things merged.

To start with I'd like to add a few more tests. Since most of my
own tests for missing bits (like KVM backend) are mostly just
ad hoc scripts, I thought adding them to avocado is a better idea.
Comments on those in particular from CI gurus would be welcome,

patch 4, because it boots a Alpine distro image and installs a
QEMU package via its package manager.

patch 5, because it grabs some Linux kernel images I put up on
another gitlab page.

patch 6, because it adds a FreeBSD boot test.

patch 7/8, because they add tests for non-public images (flames
welcome).

Thanks,
Nick

Nicholas Piggin (11):
  tests/avocado: ppc add powernv10 boot_linux_console test
  tests/avocado: Add ppc pseries and powernv Hash MMU tests
  tests/avocado: Add pseries KVM boot_linux test
  tests/avocado: ppc add hypervisor tests
  testing/avocado: ppc add new BookE boot_linux_console.py tests
  tests/avocado: Add FreeBSD distro boot tests for ppc
  tests/avocado: Add ppc boot tests for non-free AIX images
  tests/avocado: Add ppc MacOS tests
  tests/avocado: Use default CPU for pseries machine
  ppc/spapr: change pseries machine default to POWER10 CPU
  ppc/pnv: Change powernv default to powernv10

 hw/ppc/pnv.c                        |   4 +-
 hw/ppc/spapr.c                      |   2 +-
 tests/avocado/boot_freebsd.py       | 109 ++++++++++++++++++
 tests/avocado/boot_linux.py         |   9 ++
 tests/avocado/boot_linux_console.py |  61 ++++++++++
 tests/avocado/migration.py          |   1 -
 tests/avocado/ppc/macos9.ppm        | Bin 0 -> 921615 bytes
 tests/avocado/ppc_aix.py            |  63 ++++++++++
 tests/avocado/ppc_hv_tests.py       | 173 ++++++++++++++++++++++++++++
 tests/avocado/ppc_macos.py          |  90 +++++++++++++++
 tests/avocado/ppc_powernv.py        |  21 +++-
 tests/avocado/ppc_pseries.py        |  20 +++-
 12 files changed, 543 insertions(+), 10 deletions(-)
 create mode 100644 tests/avocado/boot_freebsd.py
 create mode 100644 tests/avocado/ppc/macos9.ppm
 create mode 100644 tests/avocado/ppc_aix.py
 create mode 100644 tests/avocado/ppc_hv_tests.py
 create mode 100644 tests/avocado/ppc_macos.py

-- 
2.42.0



^ permalink raw reply	[flat|nested] 38+ messages in thread

* [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests Nicholas Piggin
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

Add a powernv POWER10 variant for boot_linux_console.py.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 tests/avocado/boot_linux_console.py | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
index 01ee149812..9434304cd3 100644
--- a/tests/avocado/boot_linux_console.py
+++ b/tests/avocado/boot_linux_console.py
@@ -1393,6 +1393,14 @@ def test_ppc_powernv9(self):
         """
         self.do_test_ppc64_powernv('P9')
 
+    def test_ppc_powernv10(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:powernv10
+        :avocado: tags=accel:tcg
+        """
+        self.do_test_ppc64_powernv('P10')
+
     def test_ppc_g3beige(self):
         """
         :avocado: tags=arch:ppc
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-16  8:40   ` Cédric Le Goater
  2023-10-10  7:52 ` [RFC PATCH 03/11] tests/avocado: Add pseries KVM boot_linux test Nicholas Piggin
                   ` (9 subsequent siblings)
  11 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

The Hash MMU mode is supported along side Radix in POWER hardware, and
Linux supports running in either mode. Radix is the default so to keep
up testing of QEMU Hash MMU, add some explicit Hash MMU tests.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 tests/avocado/ppc_powernv.py | 21 ++++++++++++++++++---
 tests/avocado/ppc_pseries.py | 20 +++++++++++++++++---
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/tests/avocado/ppc_powernv.py b/tests/avocado/ppc_powernv.py
index d0e5c07bde..2be322c47d 100644
--- a/tests/avocado/ppc_powernv.py
+++ b/tests/avocado/ppc_powernv.py
@@ -12,11 +12,11 @@
 class powernvMachine(QemuSystemTest):
 
     timeout = 90
-    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
+    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
     panic_message = 'Kernel panic - not syncing'
     good_message = 'VFS: Cannot open root device'
 
-    def do_test_linux_boot(self):
+    def do_test_linux_boot(self, kernel_command_line = KERNEL_COMMON_COMMAND_LINE):
         self.require_accelerator("tcg")
         kernel_url = ('https://archives.fedoraproject.org/pub/archive'
                       '/fedora-secondary/releases/29/Everything/ppc64le/os'
@@ -25,7 +25,6 @@ def do_test_linux_boot(self):
         kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
 
         self.vm.set_console()
-        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
         self.vm.add_args('-kernel', kernel_path,
                          '-append', kernel_command_line)
         self.vm.launch()
@@ -54,6 +53,22 @@ def test_linux_smp_boot(self):
         wait_for_console_pattern(self, console_pattern, self.panic_message)
         wait_for_console_pattern(self, self.good_message, self.panic_message)
 
+    def test_linux_smp_hpt_boot(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:powernv
+        :avocado: tags=accel:tcg
+        """
+
+        self.vm.add_args('-smp', '4')
+        self.do_test_linux_boot(self.KERNEL_COMMON_COMMAND_LINE +
+                                'disable_radix')
+        console_pattern = 'smp: Brought up 1 node, 4 CPUs'
+        wait_for_console_pattern(self, 'hash-mmu: Initializing hash mmu',
+                                 self.panic_message)
+        wait_for_console_pattern(self, console_pattern, self.panic_message)
+        wait_for_console_pattern(self, self.good_message, self.panic_message)
+
     def test_linux_smt_boot(self):
         """
         :avocado: tags=arch:ppc64
diff --git a/tests/avocado/ppc_pseries.py b/tests/avocado/ppc_pseries.py
index a8311e6555..74aaa4ac4a 100644
--- a/tests/avocado/ppc_pseries.py
+++ b/tests/avocado/ppc_pseries.py
@@ -12,11 +12,11 @@
 class pseriesMachine(QemuSystemTest):
 
     timeout = 90
-    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
+    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
     panic_message = 'Kernel panic - not syncing'
     good_message = 'VFS: Cannot open root device'
 
-    def do_test_ppc64_linux_boot(self):
+    def do_test_ppc64_linux_boot(self, kernel_command_line = KERNEL_COMMON_COMMAND_LINE):
         kernel_url = ('https://archives.fedoraproject.org/pub/archive'
                       '/fedora-secondary/releases/29/Everything/ppc64le/os'
                       '/ppc/ppc64/vmlinuz')
@@ -24,7 +24,6 @@ def do_test_ppc64_linux_boot(self):
         kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
 
         self.vm.set_console()
-        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
         self.vm.add_args('-kernel', kernel_path,
                          '-append', kernel_command_line)
         self.vm.launch()
@@ -62,6 +61,21 @@ def test_ppc64_linux_smp_boot(self):
         wait_for_console_pattern(self, console_pattern, self.panic_message)
         wait_for_console_pattern(self, self.good_message, self.panic_message)
 
+    def test_ppc64_linux_hpt_smp_boot(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        """
+
+        self.vm.add_args('-smp', '4')
+        self.do_test_ppc64_linux_boot(self.KERNEL_COMMON_COMMAND_LINE +
+                                      'disable_radix')
+        console_pattern = 'smp: Brought up 1 node, 4 CPUs'
+        wait_for_console_pattern(self, 'hash-mmu: Initializing hash mmu',
+                                 self.panic_message)
+        wait_for_console_pattern(self, console_pattern, self.panic_message)
+        wait_for_console_pattern(self, self.good_message, self.panic_message)
+
     def test_ppc64_linux_smt_boot(self):
         """
         :avocado: tags=arch:ppc64
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 03/11] tests/avocado: Add pseries KVM boot_linux test
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests Nicholas Piggin
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

There is not much support for KVM backend. Add a KVM boot_linux.py
test for pseries.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 tests/avocado/boot_linux.py | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tests/avocado/boot_linux.py b/tests/avocado/boot_linux.py
index be30dcbd58..6ce08ff6aa 100644
--- a/tests/avocado/boot_linux.py
+++ b/tests/avocado/boot_linux.py
@@ -103,6 +103,15 @@ def test_pseries_tcg(self):
         self.vm.add_args("-accel", "tcg")
         self.launch_and_wait(set_up_ssh_connection=False)
 
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_pseries_kvm(self):
+        """
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:kvm
+        """
+        self.require_accelerator("kvm")
+        self.vm.add_args("-accel", "kvm")
+        self.launch_and_wait(set_up_ssh_connection=False)
 
 class BootLinuxS390X(LinuxTest):
     """
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (2 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 03/11] tests/avocado: Add pseries KVM boot_linux test Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-16  6:39   ` Harsh Prateek Bora
  2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
                   ` (7 subsequent siblings)
  11 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

The powernv and pseries machines both provide hypervisor facilities,
which is a large and complicated set of features that don't get much
system testing in CI.

Add a new test case for these which runs QEMU KVM inside the target.
---
 tests/avocado/ppc_hv_tests.py | 173 ++++++++++++++++++++++++++++++++++
 1 file changed, 173 insertions(+)
 create mode 100644 tests/avocado/ppc_hv_tests.py

diff --git a/tests/avocado/ppc_hv_tests.py b/tests/avocado/ppc_hv_tests.py
new file mode 100644
index 0000000000..16aac1d35d
--- /dev/null
+++ b/tests/avocado/ppc_hv_tests.py
@@ -0,0 +1,173 @@
+# Tests that specifically try to exercise hypervisor features of the
+# target machines. powernv supports the Power hypervisor ISA, and
+# pseries supports the nested-HV hypervisor spec.
+#
+# Copyright (c) 2023 IBM Corporation
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later.  See the COPYING file in the top-level directory.
+
+from avocado import skipIf
+from avocado.utils import archive
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import wait_for_console_pattern, exec_command
+import os
+import time
+import subprocess
+
+# Alpine is a light weight distro that supports QEMU. These tests boot
+# that on the machine then run a QEMU guest inside it in KVM mode,
+# that runs the same Alpine distro image.
+# QEMU packages are downloaded and installed on each test. That's not a
+# large download, but it may be more polite to create qcow2 image with
+# QEMU already installed and use that.
+class HypervisorTest(QemuSystemTest):
+
+    timeout = 600
+    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
+    panic_message = 'Kernel panic - not syncing'
+    good_message = 'VFS: Cannot open root device'
+
+    def extract_from_iso(self, iso, path):
+        """
+        Extracts a file from an iso file into the test workdir
+
+        :param iso: path to the iso file
+        :param path: path within the iso file of the file to be extracted
+        :returns: path of the extracted file
+        """
+        filename = os.path.basename(path)
+
+        cwd = os.getcwd()
+        os.chdir(self.workdir)
+
+        with open(filename, "w") as outfile:
+            cmd = "isoinfo -i %s -R -x %s" % (iso, path)
+            subprocess.run(cmd.split(), stdout=outfile)
+
+        os.chdir(cwd)
+
+        # Return complete path to extracted file.  Because callers to
+        # extract_from_iso() specify 'path' with a leading slash, it is
+        # necessary to use os.path.relpath() as otherwise os.path.join()
+        # interprets it as an absolute path and drops the self.workdir part.
+        return os.path.normpath(os.path.join(self.workdir, filename))
+
+    def do_start_alpine(self):
+        iso_url = ('https://dl-cdn.alpinelinux.org/alpine/v3.18/releases/ppc64le/alpine-standard-3.18.4-ppc64le.iso')
+
+        # Alpine use sha256 so I recalculated this myself
+        iso_sha256 = 'c26b8d3e17c2f3f0fed02b4b1296589c2390e6d5548610099af75300edd7b3ff'
+        iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha256,
+                                    algorithm = "sha256")
+
+        vmlinuz = self.extract_from_iso(iso_path, '/boot/vmlinuz-lts')
+        initramfs = self.extract_from_iso(iso_path, '/boot/initramfs-lts')
+
+        self.vm.set_console()
+        self.vm.add_args("-kernel", vmlinuz)
+        self.vm.add_args("-initrd", initramfs)
+        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
+                               'console=hvc0')
+        self.require_accelerator("tcg")
+
+        self.vm.add_args("-accel", "tcg,thread=multi")
+        self.vm.add_args("-smp", "4", "-m", "2g")
+        self.vm.add_args("-drive", f"file={iso_path},format=raw,if=none,id=drive0")
+#        self.vm.add_args("-drive", f"file={iso_path},format=raw")
+
+        self.vm.launch()
+        wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
+        exec_command(self, 'root')
+        wait_for_console_pattern(self, 'localhost login:')
+        wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
+        exec_command(self, 'setup-alpine -qe')
+        wait_for_console_pattern(self, 'localhost:~#')
+
+    def do_stop_alpine(self):
+        exec_command(self, 'poweroff')
+        wait_for_console_pattern(self, 'alpine:~#')
+        self.vm.wait()
+
+    def do_setup_kvm(self):
+        exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/main > /etc/apk/repositories')
+        wait_for_console_pattern(self, 'alpine:~#')
+        exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/community >> /etc/apk/repositories')
+        wait_for_console_pattern(self, 'alpine:~#')
+        exec_command(self, 'apk update')
+        wait_for_console_pattern(self, 'alpine:~#')
+        exec_command(self, 'apk add qemu-system-ppc64')
+        wait_for_console_pattern(self, 'alpine:~#')
+        exec_command(self, 'modprobe kvm-hv')
+        wait_for_console_pattern(self, 'alpine:~#')
+
+    def do_test_kvm(self, hpt=False):
+        if hpt:
+            append = 'disable_radix'
+        else:
+            append = ''
+        exec_command(self, 'qemu-system-ppc64 -nographic -smp 2 -m 1g '
+                           '-machine pseries,x-vof=on,accel=kvm '
+                           '-machine cap-cfpc=broken,cap-sbbc=broken,'
+                                    'cap-ibs=broken,cap-ccf-assist=off '
+                           '-drive file=/dev/nvme0n1,format=raw,readonly=on '
+                           '-initrd /media/nvme0n1/boot/initramfs-lts '
+                           '-kernel /media/nvme0n1/boot/vmlinuz-lts '
+                           '-append \'usbcore.nousb ' + append + '\'')
+        # Alpine 3.18 kernel seems to crash in XHCI USB driver.
+        wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
+        exec_command(self, 'root')
+        wait_for_console_pattern(self, 'localhost login:')
+        wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
+        exec_command(self, 'poweroff >& /dev/null')
+        wait_for_console_pattern(self, 'localhost:~#')
+        wait_for_console_pattern(self, 'reboot: Power down')
+        time.sleep(1)
+        exec_command(self, '') # console has strange issue after qemu exit
+        exec_command(self, 'reset')
+        exec_command(self, 'echo VM finished')
+        wait_for_console_pattern(self, 'VM finished')
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_hv_pseries(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:tcg
+        """
+        self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
+        self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")
+        self.do_start_alpine()
+        self.do_setup_kvm()
+        self.do_test_kvm()
+        self.do_stop_alpine()
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_hv_pseries_kvm(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:kvm
+        """
+        self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
+        self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")
+        self.do_start_alpine()
+        self.do_setup_kvm()
+        self.do_test_kvm()
+        self.do_stop_alpine()
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_hv_powernv(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:powernv
+        :avocado: tags=accel:tcg
+        """
+        self.vm.add_args('-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234,drive=drive0',
+                         '-device', 'e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0',
+                         '-netdev', 'user,id=net0,hostfwd=::20022-:22,hostname=alpine')
+        self.do_start_alpine()
+        self.do_setup_kvm()
+        self.do_test_kvm()
+        self.do_test_kvm(True)
+        self.do_stop_alpine()
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (3 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10  8:02   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2023-10-10  7:52 ` [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc Nicholas Piggin
                   ` (6 subsequent siblings)
  11 siblings, 3 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
using Guenter Roeck's rootfs images for Linux testing, and a gitlab
repository with kernel images that I built since there are very few
sources of modern BookE images now.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
index 9434304cd3..dc3346ef49 100644
--- a/tests/avocado/boot_linux_console.py
+++ b/tests/avocado/boot_linux_console.py
@@ -1355,6 +1355,59 @@ def test_ppc64_e500(self):
         tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
         self.do_test_advcal_2018('19', tar_hash, 'uImage')
 
+    def test_ppc64_e6500(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:ppce500
+        :avocado: tags=cpu:e6500
+        :avocado: tags=accel:tcg
+        """
+        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/corenet64_vmlinux?ref_type=heads&inline=false')
+        kernel_hash = '01051590b083fec66cb3b9e2e553e95d4cf47691'
+        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
+
+        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc64/rootfs.cpio.gz')
+        initrd_hash = '798acffc036c3b1ae6cacf95c869bba2'
+        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
+                                       algorithm="md5")
+
+        self.vm.set_console()
+        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
+        self.vm.add_args('-smp', '2',
+                         '-kernel', kernel_path,
+                         '-initrd', initrd_path,
+                         '-append', kernel_command_line,
+                         '-no-reboot')
+        self.vm.launch()
+        # Wait for VM to shut down gracefully
+        self.vm.wait()
+
+    def test_ppc32_mpc85xx(self):
+        """
+        :avocado: tags=arch:ppc
+        :avocado: tags=machine:ppce500
+        :avocado: tags=cpu:mpc8568
+        :avocado: tags=accel:tcg
+        """
+        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/mpc85xx_vmlinux?ref_type=heads&inline=false')
+        kernel_hash = '726f7f574a491282454850b48546b3827593142b'
+        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
+
+        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc/rootfs.cpio.gz')
+        initrd_hash = '4d30fa93b742c493e8cf2140e49bbd9a'
+        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
+                                       algorithm="md5")
+
+        self.vm.set_console()
+        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
+        self.vm.add_args('-kernel', kernel_path,
+                         '-initrd', initrd_path,
+                         '-append', kernel_command_line,
+                         '-no-reboot')
+        self.vm.launch()
+        # Wait for VM to shut down gracefully
+        self.vm.wait()
+
     def do_test_ppc64_powernv(self, proc):
         self.require_accelerator("tcg")
         images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (4 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10 21:55   ` Warner Losh
  2023-10-10  7:52 ` [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images Nicholas Piggin
                   ` (5 subsequent siblings)
  11 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel,
	Warner Losh

FreeBSD project provides qcow2 images that work well for testing QEMU.
Add pseries tests for HPT and Radix, KVM and TCG.

Other architectures could be added so this does not get a ppc_ prefix
but is instead named similarly to boot_linux.

Cc: Warner Losh <imp@bsdimp.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

CC'ing Warner to check if it's okay for us to use these images and
any comments or suggestions. avocado tests have many Linux boots so we'd
do much better to expand test coverage by adding some other systems.
---
 tests/avocado/boot_freebsd.py | 109 ++++++++++++++++++++++++++++++++++
 1 file changed, 109 insertions(+)
 create mode 100644 tests/avocado/boot_freebsd.py

diff --git a/tests/avocado/boot_freebsd.py b/tests/avocado/boot_freebsd.py
new file mode 100644
index 0000000000..9a499a28ad
--- /dev/null
+++ b/tests/avocado/boot_freebsd.py
@@ -0,0 +1,109 @@
+# Functional tests that boot FreeBSD in various configurations
+#
+# Copyright (c) 2023 IBM Corporation
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later. See the COPYING file in the top-level directory.
+
+import os
+
+from avocado import skipUnless
+from avocado import skipIf
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import wait_for_console_pattern
+from avocado_qemu import exec_command
+from avocado.utils import archive
+from avocado.utils import process
+from avocado.utils.path import find_command
+
+class BootFreeBSDPPC64(QemuSystemTest):
+    """
+    :avocado: tags=arch:ppc64
+    """
+
+    timeout = 360
+
+    def run_pseries_test(self, force_HPT=False):
+        # We need zstd for all the tuxrun tests
+        # See https://github.com/avocado-framework/avocado/issues/5609
+        zstd = find_command('zstd', False)
+        if zstd is False:
+            self.cancel('Could not find "zstd", which is required to '
+                        'decompress rootfs')
+        self.zstd = zstd
+
+        drive_url = ('https://artifact.ci.freebsd.org/snapshot/15.0-CURRENT/a2440348eed75bb7682579af0905b652747fd016/powerpc/powerpc64le/disk.qcow2.zst')
+        drive_hash = '8ab11a05ccab3d44215fd4667a70454ed10a203f'
+        drive_path_zstd = self.fetch_asset(drive_url, asset_hash=drive_hash)
+        drive_path = os.path.join(self.workdir, 'disk.qcow2')
+        # archive.zstd_uncompress(drive_path_zstd, drive_path)
+
+        cmd = f"{self.zstd} -d {drive_path_zstd} -o {drive_path}"
+        process.run(cmd)
+
+        drive = f"file={drive_path},format=qcow2,if=virtio"
+
+        self.vm.set_console()
+        if force_HPT:
+            self.vm.add_args('-m', '4g')
+        else:
+            self.vm.add_args('-m', '1g')
+        self.vm.add_args('-smp', '4')
+        self.vm.add_args('-drive', drive)
+        self.vm.add_args('-net', 'nic,model=virtio')
+        self.vm.launch()
+
+        wait_for_console_pattern(self, 'Hit [Enter] to boot immediately, or any other key for command prompt.')
+        if force_HPT:
+            exec_command(self, 'x')
+            wait_for_console_pattern(self, 'OK')
+            exec_command(self, 'set radix_mmu=0')
+            exec_command(self, 'boot')
+            wait_for_console_pattern(self, 'cas: selected hash MMU', 'panic:')
+        else:
+            exec_command(self, '')
+            wait_for_console_pattern(self, 'cas: selected radix MMU')
+
+        wait_for_console_pattern(self, 'FreeBSD 15.0-CURRENT #0 a244034: Mon Sep 25 02:05:22 UTC 2023', 'panic:')
+        wait_for_console_pattern(self, 'FreeBSD/SMP: Multiprocessor System Detected: 4 CPUs')
+        wait_for_console_pattern(self, 'FreeBSD/powerpc (Amnesiac) (ttyu0)', 'panic:')
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_pseries_tcg(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:tcg
+        """
+        self.require_accelerator("tcg")
+        self.run_pseries_test()
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_pseries_hpt_tcg(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:tcg
+        """
+        self.require_accelerator("tcg")
+        self.run_pseries_test(force_HPT=True)
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_pseries_kvm(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:kvm
+        """
+        self.require_accelerator("kvm")
+        self.run_pseries_test()
+
+    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
+    def test_pseries_hpt_kvm(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:kvm
+        """
+        self.require_accelerator("kvm")
+        self.run_pseries_test(force_HPT=True)
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (5 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10 12:43   ` Alex Bennée
  2023-10-10  7:52 ` [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests Nicholas Piggin
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

An AIX image can be provided by setting AIX_IMAGE environment
variable when running avocado.

It's questionable whether we should carry these in upstream QEMU.
It's convenient to see how to run these things, but simple enough
to maintain in out of tree branch. I just wanted to see opinions
about it.
---
 tests/avocado/ppc_aix.py | 63 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 tests/avocado/ppc_aix.py

diff --git a/tests/avocado/ppc_aix.py b/tests/avocado/ppc_aix.py
new file mode 100644
index 0000000000..b8d5d4cc38
--- /dev/null
+++ b/tests/avocado/ppc_aix.py
@@ -0,0 +1,63 @@
+# Functional test that boots AIX on ppc pseries TCG and KVM
+#
+# Copyright (c) 2023 IBM Corporation
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later.  See the COPYING file in the top-level directory.
+
+import os
+from avocado.utils import archive
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import wait_for_console_pattern
+
+class pseriesMachine(QemuSystemTest):
+
+    timeout = 600
+
+    def do_test_ppc64_aix_boot(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        """
+
+        image = os.getenv('AIX_IMAGE')
+        if not image:
+            self.cancel('No AIX_IMAGE environment variable defined')
+
+        _hash = os.getenv('AIX_HASH')
+        if _hash:
+            aix_disk = self.fetch_asset(image, asset_hash=_hash)
+        else:
+            aix_disk = self.fetch_asset(image)
+
+        self.vm.set_console()
+        self.vm.add_args('-machine', 'ic-mode=xics',
+                         '-smp', '16,threads=8,cores=2',
+                         '-m', '4g',
+#                         '-device', 'spapr-vlan,netdev=net0,mac=52:54:00:49:53:14',
+#                         '-netdev', 'tap,id=net0,helper=/usr/libexec/qemu-bridge-helper,br=virbr0',
+                         '-device', 'qemu-xhci',
+                         '-device', 'virtio-scsi,id=scsi0',
+                         '-drive', f'file={aix_disk},if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=none',
+                         '-device', 'scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=1',
+                         '-nodefaults')
+        self.vm.launch()
+        wait_for_console_pattern(self, 'AIX Version 7')
+
+    def test_ppc64_aix_boot_tcg(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:tcg
+        """
+        self.require_accelerator("tcg")
+        self.do_test_ppc64_aix_boot()
+
+    def test_ppc64_aix_boot_kvm(self):
+        """
+        :avocado: tags=arch:ppc64
+        :avocado: tags=machine:pseries
+        :avocado: tags=accel:kvm
+        """
+        self.require_accelerator("kvm")
+        self.do_test_ppc64_aix_boot()
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (6 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10  7:58   ` Philippe Mathieu-Daudé
  2023-10-10  7:52 ` [RFC PATCH 09/11] tests/avocado: Use default CPU for pseries machine Nicholas Piggin
                   ` (3 subsequent siblings)
  11 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

Similarly to the AIX test, this adds some tests that can boot MacOS9
and OSX images that are provided.
---
 tests/avocado/ppc/macos9.ppm | Bin 0 -> 921615 bytes
 tests/avocado/ppc_macos.py   |  90 +++++++++++++++++++++++++++++++++++
 2 files changed, 90 insertions(+)
 create mode 100644 tests/avocado/ppc/macos9.ppm
 create mode 100644 tests/avocado/ppc_macos.py

diff --git a/tests/avocado/ppc/macos9.ppm b/tests/avocado/ppc/macos9.ppm
new file mode 100644
index 0000000000000000000000000000000000000000..662d1a5a0fec47a589dbc03ed3b10b3d653c07f1
GIT binary patch
literal 921615
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

literal 0
HcmV?d00001

diff --git a/tests/avocado/ppc_macos.py b/tests/avocado/ppc_macos.py
new file mode 100644
index 0000000000..055fc3aca4
--- /dev/null
+++ b/tests/avocado/ppc_macos.py
@@ -0,0 +1,90 @@
+# Functional test that boots MacOS on ppc mac99
+#
+# Copyright (c) 2023 IBM Corporation
+#
+# This work is licensed under the terms of the GNU GPL, version 2 or
+# later.  See the COPYING file in the top-level directory.
+
+import time
+import tempfile
+import filecmp
+import os
+
+from typing import List
+from avocado.utils import archive
+from avocado_qemu import QemuSystemTest
+from avocado_qemu import wait_for_console_pattern
+
+class PPCMacOSTest(QemuSystemTest):
+
+    timeout = 240
+
+    def test_macos9(self):
+        """
+        :avocado: tags=arch:ppc
+        :avocado: tags=machine:mac99
+        :avocado: tags=device:framebuffer
+        """
+
+        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
+        screenshot_path = os.path.join(basedir, 'ppc/macos9.ppm')
+
+        image = os.getenv('MACOS9_IMAGE')
+        if not image:
+            self.cancel('No MACOS9_IMAGE environment variable defined')
+        drive_path = self.fetch_asset(image)
+
+        self.vm.set_console()
+        self.vm.add_args('-M', 'via=pmu')
+        self.vm.add_args('-m', '1g')
+        self.vm.add_args('-cpu', 'G4')
+        self.vm.add_args('-drive', 'file=' + drive_path)
+#        self.vm.add_args('-net', 'nic,model=rtl8139')
+#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')
+        self.vm.add_args('-vga', 'std')
+        self.vm.add_args('-g', '640x480')
+        self.vm.launch()
+
+        # This comes up after 60 seconds on a fast x86 CPU. Give it
+        # 180s to be sure.
+        time.sleep(180)
+        with tempfile.NamedTemporaryFile(suffix='.ppm',
+                                         prefix='screendump-', delete=False) as ppmfile:
+            self.vm.command('screendump', filename=ppmfile.name)
+            if not filecmp.cmp(ppmfile.name, screenshot_path):
+                self.fail('Screenshot does not match')
+
+    def test_macos10(self):
+        """
+        :avocado: tags=arch:ppc
+        :avocado: tags=machine:mac99
+        :avocado: tags=device:framebuffer
+        """
+
+        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
+        screenshot_path = os.path.join(basedir, 'ppc/macos10.ppm')
+
+        image = os.getenv('MACOS10_IMAGE')
+        if not image:
+            self.cancel('No MACOS10_IMAGE environment variable defined')
+        drive_path = self.fetch_asset(image)
+
+        self.vm.set_console()
+        self.vm.add_args('-M', 'via=pmu')
+        self.vm.add_args('-m', '1g')
+        self.vm.add_args('-cpu', 'G4')
+        self.vm.add_args('-drive', 'file=' + drive_path)
+#        self.vm.add_args('-net', 'nic,model=rtl8139')
+#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')
+        self.vm.add_args('-vga', 'std')
+        self.vm.add_args('-g', '640x480')
+        self.vm.launch()
+
+        # This comes up after 60 seconds on a fast x86 CPU. Give it
+        # 180s to be sure.
+        time.sleep(180)
+        with tempfile.NamedTemporaryFile(suffix='.ppm',
+                                         prefix='screendump-', delete=False) as ppmfile:
+            self.vm.command('screendump', filename=ppmfile.name)
+            if not filecmp.cmp(ppmfile.name, screenshot_path):
+                self.fail('Screenshot does not match')
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 09/11] tests/avocado: Use default CPU for pseries machine
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (7 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10  7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

Use the default CPU with the pseries machine unless there is a
specific requirement.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 tests/avocado/migration.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/avocado/migration.py b/tests/avocado/migration.py
index fdc1d234fb..91ac33919b 100644
--- a/tests/avocado/migration.py
+++ b/tests/avocado/migration.py
@@ -123,7 +123,6 @@ class PPC64(MigrationTest):
     """
     :avocado: tags=arch:ppc64
     :avocado: tags=machine:pseries
-    :avocado: tags=cpu:power9_v2.0
     """
 
     def test_migration_with_tcp_localhost(self):
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (8 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 09/11] tests/avocado: Use default CPU for pseries machine Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10 12:08   ` Joel Stanley
  2023-10-16  8:16   ` Cédric Le Goater
  2023-10-10  7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
  2023-10-10  7:59 ` [RFC PATCH 00/11] ppc: avocado test additions and new defaults Philippe Mathieu-Daudé
  11 siblings, 2 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

POWER10 is the latest pseries CPU.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hw/ppc/spapr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index d4230d3647..9d3475d64b 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4661,7 +4661,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
 
     smc->dr_lmb_enabled = true;
     smc->update_dt_enabled = true;
-    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power9_v2.2");
+    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
     mc->has_hotpluggable_cpus = true;
     mc->nvdimm_supported = true;
     smc->resize_hpt_default = SPAPR_RESIZE_HPT_ENABLED;
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (9 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
@ 2023-10-10  7:52 ` Nicholas Piggin
  2023-10-10 12:05   ` Joel Stanley
  2023-10-16  8:15   ` Cédric Le Goater
  2023-10-10  7:59 ` [RFC PATCH 00/11] ppc: avocado test additions and new defaults Philippe Mathieu-Daudé
  11 siblings, 2 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10  7:52 UTC (permalink / raw)
  To: qemu-ppc
  Cc: Nicholas Piggin, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

POWER10 is the latest IBM Power machine. Although it is not offered in
"OPAL mode" (i.e., powernv configuration), so there is a case that it
should remain at powernv9, most of the development work is going into
powernv10 at the moment.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
 hw/ppc/pnv.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index eb54f93986..f3dad5ae05 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -2195,8 +2195,6 @@ static void pnv_machine_power9_class_init(ObjectClass *oc, void *data)
 
     xfc->match_nvt = pnv_match_nvt;
 
-    mc->alias = "powernv";
-
     pmc->compat = compat;
     pmc->compat_size = sizeof(compat);
     pmc->dt_power_mgt = pnv_dt_power_mgt;
@@ -2220,6 +2218,8 @@ static void pnv_machine_power10_class_init(ObjectClass *oc, void *data)
     mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
     compat_props_add(mc->compat_props, phb_compat, G_N_ELEMENTS(phb_compat));
 
+    mc->alias = "powernv";
+
     pmc->compat = compat;
     pmc->compat_size = sizeof(compat);
     pmc->dt_power_mgt = pnv_dt_power_mgt;
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests
  2023-10-10  7:52 ` [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests Nicholas Piggin
@ 2023-10-10  7:58   ` Philippe Mathieu-Daudé
  2023-10-11  0:25     ` Nicholas Piggin
  0 siblings, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-10-10  7:58 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

Hi Nicholas,

On 10/10/23 09:52, Nicholas Piggin wrote:
> Similarly to the AIX test, this adds some tests that can boot MacOS9
> and OSX images that are provided.
> ---
>   tests/avocado/ppc/macos9.ppm | Bin 0 -> 921615 bytes
>   tests/avocado/ppc_macos.py   |  90 +++++++++++++++++++++++++++++++++++
>   2 files changed, 90 insertions(+)
>   create mode 100644 tests/avocado/ppc/macos9.ppm
>   create mode 100644 tests/avocado/ppc_macos.py


> diff --git a/tests/avocado/ppc_macos.py b/tests/avocado/ppc_macos.py
> new file mode 100644
> index 0000000000..055fc3aca4
> --- /dev/null
> +++ b/tests/avocado/ppc_macos.py
> @@ -0,0 +1,90 @@
> +# Functional test that boots MacOS on ppc mac99
> +#
> +# Copyright (c) 2023 IBM Corporation
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later.  See the COPYING file in the top-level directory.
> +
> +import time
> +import tempfile
> +import filecmp
> +import os
> +
> +from typing import List
> +from avocado.utils import archive
> +from avocado_qemu import QemuSystemTest
> +from avocado_qemu import wait_for_console_pattern
> +
> +class PPCMacOSTest(QemuSystemTest):
> +
> +    timeout = 240
> +
> +    def test_macos9(self):
> +        """
> +        :avocado: tags=arch:ppc
> +        :avocado: tags=machine:mac99
> +        :avocado: tags=device:framebuffer
> +        """
> +
> +        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
> +        screenshot_path = os.path.join(basedir, 'ppc/macos9.ppm')
> +
> +        image = os.getenv('MACOS9_IMAGE')
> +        if not image:
> +            self.cancel('No MACOS9_IMAGE environment variable defined')
> +        drive_path = self.fetch_asset(image)
> +
> +        self.vm.set_console()
> +        self.vm.add_args('-M', 'via=pmu')
> +        self.vm.add_args('-m', '1g')
> +        self.vm.add_args('-cpu', 'G4')
> +        self.vm.add_args('-drive', 'file=' + drive_path)
> +#        self.vm.add_args('-net', 'nic,model=rtl8139')
> +#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')
> +        self.vm.add_args('-vga', 'std')
> +        self.vm.add_args('-g', '640x480')
> +        self.vm.launch()
> +
> +        # This comes up after 60 seconds on a fast x86 CPU. Give it
> +        # 180s to be sure.
> +        time.sleep(180)
> +        with tempfile.NamedTemporaryFile(suffix='.ppm',
> +                                         prefix='screendump-', delete=False) as ppmfile:
> +            self.vm.command('screendump', filename=ppmfile.name)
> +            if not filecmp.cmp(ppmfile.name, screenshot_path):
> +                self.fail('Screenshot does not match')
> +

Nitpicking, I'd rather use:

        @skipUntil(os.getenv('MACOS10_IMAGE'),
                   'No MACOS10_IMAGE environment variable defined')

> +    def test_macos10(self):
> +        """
> +        :avocado: tags=arch:ppc
> +        :avocado: tags=machine:mac99
> +        :avocado: tags=device:framebuffer
> +        """
> +
> +        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
> +        screenshot_path = os.path.join(basedir, 'ppc/macos10.ppm')
> +
> +        image = os.getenv('MACOS10_IMAGE')
> +        if not image:
> +            self.cancel('No MACOS10_IMAGE environment variable defined')
> +        drive_path = self.fetch_asset(image)

Please commit the hash if the image you used.

> +        self.vm.set_console()
> +        self.vm.add_args('-M', 'via=pmu')
> +        self.vm.add_args('-m', '1g')
> +        self.vm.add_args('-cpu', 'G4')
> +        self.vm.add_args('-drive', 'file=' + drive_path)
> +#        self.vm.add_args('-net', 'nic,model=rtl8139')
> +#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')

Why is that commented? If not needed, just drop, since your test
is already useful as it.

> +        self.vm.add_args('-vga', 'std')
> +        self.vm.add_args('-g', '640x480')
> +        self.vm.launch()
> +
> +        # This comes up after 60 seconds on a fast x86 CPU. Give it
> +        # 180s to be sure.
> +        time.sleep(180)
> +        with tempfile.NamedTemporaryFile(suffix='.ppm',
> +                                         prefix='screendump-', delete=False) as ppmfile:
> +            self.vm.command('screendump', filename=ppmfile.name)
> +            if not filecmp.cmp(ppmfile.name, screenshot_path):
> +                self.fail('Screenshot does not match')



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 00/11] ppc: avocado test additions and new defaults
  2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
                   ` (10 preceding siblings ...)
  2023-10-10  7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
@ 2023-10-10  7:59 ` Philippe Mathieu-Daudé
  11 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-10-10  7:59 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> Sorry for going missing for a while, had a few things on but have
> been working on figuring out testing and git setup to get some
> things merged.
> 
> To start with I'd like to add a few more tests. Since most of my
> own tests for missing bits (like KVM backend) are mostly just
> ad hoc scripts, I thought adding them to avocado is a better idea.
> Comments on those in particular from CI gurus would be welcome,
> 
> patch 4, because it boots a Alpine distro image and installs a
> QEMU package via its package manager.
> 
> patch 5, because it grabs some Linux kernel images I put up on
> another gitlab page.
> 
> patch 6, because it adds a FreeBSD boot test.
> 
> patch 7/8, because they add tests for non-public images (flames
> welcome).

IANAL but I don't see license infringement, so personally I'm in
favor of these tests.

> Thanks,
> Nick



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
@ 2023-10-10  8:02   ` Philippe Mathieu-Daudé
  2023-10-10 12:03   ` Joel Stanley
  2023-10-16  8:32   ` Cédric Le Goater
  2 siblings, 0 replies; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-10-10  8:02 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
> using Guenter Roeck's rootfs images for Linux testing, and a gitlab
> repository with kernel images that I built since there are very few
> sources of modern BookE images now.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>   tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
>   1 file changed, 53 insertions(+)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
  2023-10-10  8:02   ` Philippe Mathieu-Daudé
@ 2023-10-10 12:03   ` Joel Stanley
  2023-10-10 20:53     ` Nicholas Piggin
  2023-10-16  8:32   ` Cédric Le Goater
  2 siblings, 1 reply; 38+ messages in thread
From: Joel Stanley @ 2023-10-10 12:03 UTC (permalink / raw)
  To: Nicholas Piggin, Michael Ellerman
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue, 10 Oct 2023 at 18:23, Nicholas Piggin <npiggin@gmail.com> wrote:
>
> Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
> using Guenter Roeck's rootfs images for Linux testing, and a gitlab
> repository with kernel images that I built since there are very few
> sources of modern BookE images now.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Joel Stanley <joel@jms.id.au>

Should we get mpe to add a https://github.com/linuxppc/qemu-ci-images
for you to keep those kernel images? But perhaps you'd prefer to keep
them on gitlab. Just a suggestion.

> ---
>  tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
>
> diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
> index 9434304cd3..dc3346ef49 100644
> --- a/tests/avocado/boot_linux_console.py
> +++ b/tests/avocado/boot_linux_console.py
> @@ -1355,6 +1355,59 @@ def test_ppc64_e500(self):
>          tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
>          self.do_test_advcal_2018('19', tar_hash, 'uImage')
>
> +    def test_ppc64_e6500(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:ppce500
> +        :avocado: tags=cpu:e6500
> +        :avocado: tags=accel:tcg
> +        """
> +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/corenet64_vmlinux?ref_type=heads&inline=false')

Is the ref_type?heads=inline-false required? I seem to get the file
successfully with wget and those omitted.

> +        kernel_hash = '01051590b083fec66cb3b9e2e553e95d4cf47691'
> +        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
> +
> +        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc64/rootfs.cpio.gz')
> +        initrd_hash = '798acffc036c3b1ae6cacf95c869bba2'
> +        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
> +                                       algorithm="md5")
> +
> +        self.vm.set_console()
> +        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
> +        self.vm.add_args('-smp', '2',
> +                         '-kernel', kernel_path,
> +                         '-initrd', initrd_path,
> +                         '-append', kernel_command_line,
> +                         '-no-reboot')
> +        self.vm.launch()
> +        # Wait for VM to shut down gracefully
> +        self.vm.wait()
> +
> +    def test_ppc32_mpc85xx(self):
> +        """
> +        :avocado: tags=arch:ppc
> +        :avocado: tags=machine:ppce500
> +        :avocado: tags=cpu:mpc8568
> +        :avocado: tags=accel:tcg
> +        """
> +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/mpc85xx_vmlinux?ref_type=heads&inline=false')
> +        kernel_hash = '726f7f574a491282454850b48546b3827593142b'
> +        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
> +
> +        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc/rootfs.cpio.gz')
> +        initrd_hash = '4d30fa93b742c493e8cf2140e49bbd9a'
> +        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
> +                                       algorithm="md5")
> +
> +        self.vm.set_console()
> +        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
> +        self.vm.add_args('-kernel', kernel_path,
> +                         '-initrd', initrd_path,
> +                         '-append', kernel_command_line,
> +                         '-no-reboot')
> +        self.vm.launch()
> +        # Wait for VM to shut down gracefully
> +        self.vm.wait()
> +
>      def do_test_ppc64_powernv(self, proc):
>          self.require_accelerator("tcg")
>          images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')
> --
> 2.42.0
>
>


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10
  2023-10-10  7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
@ 2023-10-10 12:05   ` Joel Stanley
  2023-10-10 20:57     ` Nicholas Piggin
  2023-10-16  8:15   ` Cédric Le Goater
  1 sibling, 1 reply; 38+ messages in thread
From: Joel Stanley @ 2023-10-10 12:05 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue, 10 Oct 2023 at 18:24, Nicholas Piggin <npiggin@gmail.com> wrote:
>
> POWER10 is the latest IBM Power machine. Although it is not offered in
> "OPAL mode" (i.e., powernv configuration), so there is a case that it
> should remain at powernv9, most of the development work is going into
> powernv10 at the moment.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Joel Stanley <joel@jms.id.au>

Do we need to update the docs?

We should consider updating the skiboot to the latest release too.


> ---
>  hw/ppc/pnv.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index eb54f93986..f3dad5ae05 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -2195,8 +2195,6 @@ static void pnv_machine_power9_class_init(ObjectClass *oc, void *data)
>
>      xfc->match_nvt = pnv_match_nvt;
>
> -    mc->alias = "powernv";
> -
>      pmc->compat = compat;
>      pmc->compat_size = sizeof(compat);
>      pmc->dt_power_mgt = pnv_dt_power_mgt;
> @@ -2220,6 +2218,8 @@ static void pnv_machine_power10_class_init(ObjectClass *oc, void *data)
>      mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
>      compat_props_add(mc->compat_props, phb_compat, G_N_ELEMENTS(phb_compat));
>
> +    mc->alias = "powernv";
> +
>      pmc->compat = compat;
>      pmc->compat_size = sizeof(compat);
>      pmc->dt_power_mgt = pnv_dt_power_mgt;
> --
> 2.42.0
>
>


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU
  2023-10-10  7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
@ 2023-10-10 12:08   ` Joel Stanley
  2023-10-16  8:16   ` Cédric Le Goater
  1 sibling, 0 replies; 38+ messages in thread
From: Joel Stanley @ 2023-10-10 12:08 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue, 10 Oct 2023 at 18:25, Nicholas Piggin <npiggin@gmail.com> wrote:
>
> POWER10 is the latest pseries CPU.
>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Reviewed-by: Joel Stanley <joel@jms.id.au>

> ---
>  hw/ppc/spapr.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index d4230d3647..9d3475d64b 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -4661,7 +4661,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
>
>      smc->dr_lmb_enabled = true;
>      smc->update_dt_enabled = true;
> -    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power9_v2.2");
> +    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
>      mc->has_hotpluggable_cpus = true;
>      mc->nvdimm_supported = true;
>      smc->resize_hpt_default = SPAPR_RESIZE_HPT_ENABLED;
> --
> 2.42.0
>
>


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10  7:52 ` [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images Nicholas Piggin
@ 2023-10-10 12:43   ` Alex Bennée
  2023-10-10 12:49     ` Philippe Mathieu-Daudé
  2023-10-10 13:01     ` Daniel P. Berrangé
  0 siblings, 2 replies; 38+ messages in thread
From: Alex Bennée @ 2023-10-10 12:43 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel


Nicholas Piggin <npiggin@gmail.com> writes:

> An AIX image can be provided by setting AIX_IMAGE environment
> variable when running avocado.
>
> It's questionable whether we should carry these in upstream QEMU.
> It's convenient to see how to run these things, but simple enough
> to maintain in out of tree branch. I just wanted to see opinions
> about it.

Yeah there is no point adding a test no one else can run. We already
have tests that utilise dead URLs that can only run if you happen to
have the image in the avocado cache which should arguably be removed.

> ---
>  tests/avocado/ppc_aix.py | 63 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>  create mode 100644 tests/avocado/ppc_aix.py
>
> diff --git a/tests/avocado/ppc_aix.py b/tests/avocado/ppc_aix.py
> new file mode 100644
> index 0000000000..b8d5d4cc38
> --- /dev/null
> +++ b/tests/avocado/ppc_aix.py
> @@ -0,0 +1,63 @@
> +# Functional test that boots AIX on ppc pseries TCG and KVM
> +#
> +# Copyright (c) 2023 IBM Corporation
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later.  See the COPYING file in the top-level directory.
> +
> +import os
> +from avocado.utils import archive
> +from avocado_qemu import QemuSystemTest
> +from avocado_qemu import wait_for_console_pattern
> +
> +class pseriesMachine(QemuSystemTest):
> +
> +    timeout = 600
> +
> +    def do_test_ppc64_aix_boot(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        """
> +
> +        image = os.getenv('AIX_IMAGE')
> +        if not image:
> +            self.cancel('No AIX_IMAGE environment variable defined')
> +
> +        _hash = os.getenv('AIX_HASH')
> +        if _hash:
> +            aix_disk = self.fetch_asset(image, asset_hash=_hash)
> +        else:
> +            aix_disk = self.fetch_asset(image)
> +
> +        self.vm.set_console()
> +        self.vm.add_args('-machine', 'ic-mode=xics',
> +                         '-smp', '16,threads=8,cores=2',
> +                         '-m', '4g',
> +#                         '-device', 'spapr-vlan,netdev=net0,mac=52:54:00:49:53:14',
> +#                         '-netdev', 'tap,id=net0,helper=/usr/libexec/qemu-bridge-helper,br=virbr0',
> +                         '-device', 'qemu-xhci',
> +                         '-device', 'virtio-scsi,id=scsi0',
> + '-drive',
> f'file={aix_disk},if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=none',
> + '-device',
> 'scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=1',
> +                         '-nodefaults')
> +        self.vm.launch()
> +        wait_for_console_pattern(self, 'AIX Version 7')
> +
> +    def test_ppc64_aix_boot_tcg(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:tcg
> +        """
> +        self.require_accelerator("tcg")
> +        self.do_test_ppc64_aix_boot()
> +
> +    def test_ppc64_aix_boot_kvm(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:kvm
> +        """
> +        self.require_accelerator("kvm")
> +        self.do_test_ppc64_aix_boot()


-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10 12:43   ` Alex Bennée
@ 2023-10-10 12:49     ` Philippe Mathieu-Daudé
  2023-10-10 21:21       ` Nicholas Piggin
  2023-10-10 13:01     ` Daniel P. Berrangé
  1 sibling, 1 reply; 38+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-10-10 12:49 UTC (permalink / raw)
  To: Alex Bennée, Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

On 10/10/23 14:43, Alex Bennée wrote:
> 
> Nicholas Piggin <npiggin@gmail.com> writes:
> 
>> An AIX image can be provided by setting AIX_IMAGE environment
>> variable when running avocado.
>>
>> It's questionable whether we should carry these in upstream QEMU.
>> It's convenient to see how to run these things, but simple enough
>> to maintain in out of tree branch. I just wanted to see opinions
>> about it.
> 
> Yeah there is no point adding a test no one else can run. We already
> have tests that utilise dead URLs that can only run if you happen to
> have the image in the avocado cache which should arguably be removed.

This isn't quite the same problem. This test image can possibly be
shared among developers within the IBM realm.

>> ---
>>   tests/avocado/ppc_aix.py | 63 ++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 63 insertions(+)
>>   create mode 100644 tests/avocado/ppc_aix.py



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10 12:43   ` Alex Bennée
  2023-10-10 12:49     ` Philippe Mathieu-Daudé
@ 2023-10-10 13:01     ` Daniel P. Berrangé
  2023-10-10 21:14       ` Nicholas Piggin
  1 sibling, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2023-10-10 13:01 UTC (permalink / raw)
  To: Alex Bennée
  Cc: Nicholas Piggin, qemu-ppc, Cleber Rosa,
	Philippe Mathieu-Daudé, Wainer dos Santos Moschetta,
	Beraldo Leal, qemu-devel

On Tue, Oct 10, 2023 at 01:43:16PM +0100, Alex Bennée wrote:
> 
> Nicholas Piggin <npiggin@gmail.com> writes:
> 
> > An AIX image can be provided by setting AIX_IMAGE environment
> > variable when running avocado.
> >
> > It's questionable whether we should carry these in upstream QEMU.
> > It's convenient to see how to run these things, but simple enough
> > to maintain in out of tree branch. I just wanted to see opinions
> > about it.
> 
> Yeah there is no point adding a test no one else can run. We already
> have tests that utilise dead URLs that can only run if you happen to
> have the image in the avocado cache which should arguably be removed.

I can understand the appeal of wanting to sanity check QEMU
with esentially arbitrary guest OS, whether modern, or obsolete,
whether OSS or proprietary.

The appeal of getting the test integrated into QEMU is you don't
have to worry about rebasing / merging local git changes forever
more.

I feel like this tells us we should not require users to be writing
new avocado python test code merely to get a boring old guest OS
boot up smoke test integrated into avocado.

I think we ought to have a 'guest_smoke_test.py' avocado test, that
pulls in guest OS scenarios from external YAML/JSON files. eg

  $ cat ppc_aix.yaml
  image:
    url: https:////some/path
    checksum: xxxxxx
  console:
    expect: ...some console message...
  vm:
    arch: ppc64
    machine: pseries
    ....something something extra cli args something something...

Users could then set

  export  QEMU_SMOKE_TEST_PATHS=$HOME/my-guestos-library:$HOME/shared-guestos-library
  make check-avocado

to load all the guest OS scenarios from these dirs, in addition to
any scenarios that are shipped in qemu.git by default.

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10 12:03   ` Joel Stanley
@ 2023-10-10 20:53     ` Nicholas Piggin
  2023-10-16  8:07       ` Cédric Le Goater
  0 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10 20:53 UTC (permalink / raw)
  To: Joel Stanley, Michael Ellerman
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue Oct 10, 2023 at 10:03 PM AEST, Joel Stanley wrote:
> On Tue, 10 Oct 2023 at 18:23, Nicholas Piggin <npiggin@gmail.com> wrote:
> >
> > Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
> > using Guenter Roeck's rootfs images for Linux testing, and a gitlab
> > repository with kernel images that I built since there are very few
> > sources of modern BookE images now.
> >
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>
> Reviewed-by: Joel Stanley <joel@jms.id.au>
>
> Should we get mpe to add a https://github.com/linuxppc/qemu-ci-images
> for you to keep those kernel images? But perhaps you'd prefer to keep
> them on gitlab. Just a suggestion.

Not a bad idea. Or we could try for gitlab/qemu/ci-images I suppose.

>
> > ---
> >  tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
> >  1 file changed, 53 insertions(+)
> >
> > diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
> > index 9434304cd3..dc3346ef49 100644
> > --- a/tests/avocado/boot_linux_console.py
> > +++ b/tests/avocado/boot_linux_console.py
> > @@ -1355,6 +1355,59 @@ def test_ppc64_e500(self):
> >          tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
> >          self.do_test_advcal_2018('19', tar_hash, 'uImage')
> >
> > +    def test_ppc64_e6500(self):
> > +        """
> > +        :avocado: tags=arch:ppc64
> > +        :avocado: tags=machine:ppce500
> > +        :avocado: tags=cpu:e6500
> > +        :avocado: tags=accel:tcg
> > +        """
> > +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/corenet64_vmlinux?ref_type=heads&inline=false')
>
> Is the ref_type?heads=inline-false required? I seem to get the file
> successfully with wget and those omitted.

I just copied the download link, so if it works without then
I'll remove it.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10
  2023-10-10 12:05   ` Joel Stanley
@ 2023-10-10 20:57     ` Nicholas Piggin
  2023-10-16  1:59       ` Joel Stanley
  0 siblings, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10 20:57 UTC (permalink / raw)
  To: Joel Stanley
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue Oct 10, 2023 at 10:05 PM AEST, Joel Stanley wrote:
> On Tue, 10 Oct 2023 at 18:24, Nicholas Piggin <npiggin@gmail.com> wrote:
> >
> > POWER10 is the latest IBM Power machine. Although it is not offered in
> > "OPAL mode" (i.e., powernv configuration), so there is a case that it
> > should remain at powernv9, most of the development work is going into
> > powernv10 at the moment.
> >
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>
> Reviewed-by: Joel Stanley <joel@jms.id.au>
>
> Do we need to update the docs?

What did you have in mind? Add some powernv10 examples?

> We should consider updating the skiboot to the latest release too.

Yeah I will do that (and SLOF as well).

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10 13:01     ` Daniel P. Berrangé
@ 2023-10-10 21:14       ` Nicholas Piggin
  0 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10 21:14 UTC (permalink / raw)
  To: Daniel P. Berrangé, Alex Bennée
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Tue Oct 10, 2023 at 11:01 PM AEST, Daniel P. Berrangé wrote:
> On Tue, Oct 10, 2023 at 01:43:16PM +0100, Alex Bennée wrote:
> > 
> > Nicholas Piggin <npiggin@gmail.com> writes:
> > 
> > > An AIX image can be provided by setting AIX_IMAGE environment
> > > variable when running avocado.
> > >
> > > It's questionable whether we should carry these in upstream QEMU.
> > > It's convenient to see how to run these things, but simple enough
> > > to maintain in out of tree branch. I just wanted to see opinions
> > > about it.
> > 
> > Yeah there is no point adding a test no one else can run. We already
> > have tests that utilise dead URLs that can only run if you happen to
> > have the image in the avocado cache which should arguably be removed.
>
> I can understand the appeal of wanting to sanity check QEMU
> with esentially arbitrary guest OS, whether modern, or obsolete,
> whether OSS or proprietary.
>
> The appeal of getting the test integrated into QEMU is you don't
> have to worry about rebasing / merging local git changes forever
> more.
>
> I feel like this tells us we should not require users to be writing
> new avocado python test code merely to get a boring old guest OS
> boot up smoke test integrated into avocado.

Interesting thought. It is easier to be able to specify images
location, qemu command line, and some expected output and input
than to write an avocado test entirely. OTOH if you copy an
existing one and don't need to do anything different then it is
not so hard.

>
> I think we ought to have a 'guest_smoke_test.py' avocado test, that
> pulls in guest OS scenarios from external YAML/JSON files. eg
>
>   $ cat ppc_aix.yaml
>   image:
>     url: https:////some/path
>     checksum: xxxxxx
>   console:
>     expect: ...some console message...
>   vm:
>     arch: ppc64
>     machine: pseries
>     ....something something extra cli args something something...
>
> Users could then set
>
>   export  QEMU_SMOKE_TEST_PATHS=$HOME/my-guestos-library:$HOME/shared-guestos-library
>   make check-avocado
>
> to load all the guest OS scenarios from these dirs, in addition to
> any scenarios that are shipped in qemu.git by default.

There would be a bunch of upstream avocado tests that could be
converted to such a format.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images
  2023-10-10 12:49     ` Philippe Mathieu-Daudé
@ 2023-10-10 21:21       ` Nicholas Piggin
  0 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-10 21:21 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Alex Bennée
  Cc: qemu-ppc, Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

On Tue Oct 10, 2023 at 10:49 PM AEST, Philippe Mathieu-Daudé wrote:
> On 10/10/23 14:43, Alex Bennée wrote:
> > 
> > Nicholas Piggin <npiggin@gmail.com> writes:
> > 
> >> An AIX image can be provided by setting AIX_IMAGE environment
> >> variable when running avocado.
> >>
> >> It's questionable whether we should carry these in upstream QEMU.
> >> It's convenient to see how to run these things, but simple enough
> >> to maintain in out of tree branch. I just wanted to see opinions
> >> about it.
> > 
> > Yeah there is no point adding a test no one else can run. We already
> > have tests that utilise dead URLs that can only run if you happen to
> > have the image in the avocado cache which should arguably be removed.
>
> This isn't quite the same problem. This test image can possibly be
> shared among developers within the IBM realm.

Yeah, and other people can have AIX and MacOS legally by other means
(IIRC you could register an acount and get AIX, but that may have
changed).

We do have some people not at IBM who test AIX against upstram and
report bugs. Not too sure if they would find these avocado tests useful
though.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-10  7:52 ` [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc Nicholas Piggin
@ 2023-10-10 21:55   ` Warner Losh
  2023-10-11  0:36     ` Nicholas Piggin
  2023-10-11  2:23     ` Nicholas Piggin
  0 siblings, 2 replies; 38+ messages in thread
From: Warner Losh @ 2023-10-10 21:55 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 6156 bytes --]

On Tue, Oct 10, 2023 at 1:53 AM Nicholas Piggin <npiggin@gmail.com> wrote:

> FreeBSD project provides qcow2 images that work well for testing QEMU.
> Add pseries tests for HPT and Radix, KVM and TCG.
>
> Other architectures could be added so this does not get a ppc_ prefix
> but is instead named similarly to boot_linux.
>
> Cc: Warner Losh <imp@bsdimp.com>
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>
> CC'ing Warner to check if it's okay for us to use these images and
> any comments or suggestions. avocado tests have many Linux boots so we'd
> do much better to expand test coverage by adding some other systems.
>

I like this.... I'm a little worried at the exact hash encoded in it, but
since there's a checksum
to match, it's OK I guess. It will give this code a shelf-life of months,
IIRC our retention policy.

Other than that, I think this is good. Not familiar enough with Avocado to
understand
skipping for gitlab CI, but given the extreme crunch on minutes, I think
that's OK.

Other than one nit below which is fine if it is intentionally left behind
(or removed):

Reviewed-by: Warner Losh <imp@bsdimp.com>

Please don't hesitate to reach out to me if this is failing. I'll act as a
backstop to get
it to the right people.

Warner


> ---
>  tests/avocado/boot_freebsd.py | 109 ++++++++++++++++++++++++++++++++++
>  1 file changed, 109 insertions(+)
>  create mode 100644 tests/avocado/boot_freebsd.py
>
> diff --git a/tests/avocado/boot_freebsd.py b/tests/avocado/boot_freebsd.py
> new file mode 100644
> index 0000000000..9a499a28ad
> --- /dev/null
> +++ b/tests/avocado/boot_freebsd.py
> @@ -0,0 +1,109 @@
> +# Functional tests that boot FreeBSD in various configurations
> +#
> +# Copyright (c) 2023 IBM Corporation
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later. See the COPYING file in the top-level directory.
> +
> +import os
> +
> +from avocado import skipUnless
> +from avocado import skipIf
> +from avocado_qemu import QemuSystemTest
> +from avocado_qemu import wait_for_console_pattern
> +from avocado_qemu import exec_command
> +from avocado.utils import archive
> +from avocado.utils import process
> +from avocado.utils.path import find_command
> +
> +class BootFreeBSDPPC64(QemuSystemTest):
> +    """
> +    :avocado: tags=arch:ppc64
> +    """
> +
> +    timeout = 360
> +
> +    def run_pseries_test(self, force_HPT=False):
> +        # We need zstd for all the tuxrun tests
> +        # See https://github.com/avocado-framework/avocado/issues/5609
> +        zstd = find_command('zstd', False)
> +        if zstd is False:
> +            self.cancel('Could not find "zstd", which is required to '
> +                        'decompress rootfs')
> +        self.zstd = zstd
> +
> +        drive_url = ('
> https://artifact.ci.freebsd.org/snapshot/15.0-CURRENT/a2440348eed75bb7682579af0905b652747fd016/powerpc/powerpc64le/disk.qcow2.zst
> ')
> +        drive_hash = '8ab11a05ccab3d44215fd4667a70454ed10a203f'
> +        drive_path_zstd = self.fetch_asset(drive_url,
> asset_hash=drive_hash)
> +        drive_path = os.path.join(self.workdir, 'disk.qcow2')
> +        # archive.zstd_uncompress(drive_path_zstd, drive_path)
>

Why is this commented out? It looks like a leftover maybe?


> +
> +        cmd = f"{self.zstd} -d {drive_path_zstd} -o {drive_path}"
> +        process.run(cmd)
> +
> +        drive = f"file={drive_path},format=qcow2,if=virtio"
> +
> +        self.vm.set_console()
> +        if force_HPT:
> +            self.vm.add_args('-m', '4g')
> +        else:
> +            self.vm.add_args('-m', '1g')
> +        self.vm.add_args('-smp', '4')
> +        self.vm.add_args('-drive', drive)
> +        self.vm.add_args('-net', 'nic,model=virtio')
> +        self.vm.launch()
> +
> +        wait_for_console_pattern(self, 'Hit [Enter] to boot immediately,
> or any other key for command prompt.')
> +        if force_HPT:
> +            exec_command(self, 'x')
> +            wait_for_console_pattern(self, 'OK')
> +            exec_command(self, 'set radix_mmu=0')
> +            exec_command(self, 'boot')
> +            wait_for_console_pattern(self, 'cas: selected hash MMU',
> 'panic:')
> +        else:
> +            exec_command(self, '')
> +            wait_for_console_pattern(self, 'cas: selected radix MMU')
> +
> +        wait_for_console_pattern(self, 'FreeBSD 15.0-CURRENT #0 a244034:
> Mon Sep 25 02:05:22 UTC 2023', 'panic:')
> +        wait_for_console_pattern(self, 'FreeBSD/SMP: Multiprocessor
> System Detected: 4 CPUs')
> +        wait_for_console_pattern(self, 'FreeBSD/powerpc (Amnesiac)
> (ttyu0)', 'panic:')
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_pseries_tcg(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:tcg
> +        """
> +        self.require_accelerator("tcg")
> +        self.run_pseries_test()
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_pseries_hpt_tcg(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:tcg
> +        """
> +        self.require_accelerator("tcg")
> +        self.run_pseries_test(force_HPT=True)
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_pseries_kvm(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:kvm
> +        """
> +        self.require_accelerator("kvm")
> +        self.run_pseries_test()
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_pseries_hpt_kvm(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:kvm
> +        """
> +        self.require_accelerator("kvm")
> +        self.run_pseries_test(force_HPT=True)
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 8472 bytes --]

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests
  2023-10-10  7:58   ` Philippe Mathieu-Daudé
@ 2023-10-11  0:25     ` Nicholas Piggin
  0 siblings, 0 replies; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-11  0:25 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-ppc
  Cc: Cleber Rosa, Wainer dos Santos Moschetta, Beraldo Leal,
	qemu-devel

On Tue Oct 10, 2023 at 5:58 PM AEST, Philippe Mathieu-Daudé wrote:
> Hi Nicholas,
>
> On 10/10/23 09:52, Nicholas Piggin wrote:
> > Similarly to the AIX test, this adds some tests that can boot MacOS9
> > and OSX images that are provided.
> > ---
> >   tests/avocado/ppc/macos9.ppm | Bin 0 -> 921615 bytes
> >   tests/avocado/ppc_macos.py   |  90 +++++++++++++++++++++++++++++++++++
> >   2 files changed, 90 insertions(+)
> >   create mode 100644 tests/avocado/ppc/macos9.ppm
> >   create mode 100644 tests/avocado/ppc_macos.py
>
>
> > diff --git a/tests/avocado/ppc_macos.py b/tests/avocado/ppc_macos.py
> > new file mode 100644
> > index 0000000000..055fc3aca4
> > --- /dev/null
> > +++ b/tests/avocado/ppc_macos.py
> > @@ -0,0 +1,90 @@
> > +# Functional test that boots MacOS on ppc mac99
> > +#
> > +# Copyright (c) 2023 IBM Corporation
> > +#
> > +# This work is licensed under the terms of the GNU GPL, version 2 or
> > +# later.  See the COPYING file in the top-level directory.
> > +
> > +import time
> > +import tempfile
> > +import filecmp
> > +import os
> > +
> > +from typing import List
> > +from avocado.utils import archive
> > +from avocado_qemu import QemuSystemTest
> > +from avocado_qemu import wait_for_console_pattern
> > +
> > +class PPCMacOSTest(QemuSystemTest):
> > +
> > +    timeout = 240
> > +
> > +    def test_macos9(self):
> > +        """
> > +        :avocado: tags=arch:ppc
> > +        :avocado: tags=machine:mac99
> > +        :avocado: tags=device:framebuffer
> > +        """
> > +
> > +        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
> > +        screenshot_path = os.path.join(basedir, 'ppc/macos9.ppm')
> > +
> > +        image = os.getenv('MACOS9_IMAGE')
> > +        if not image:
> > +            self.cancel('No MACOS9_IMAGE environment variable defined')
> > +        drive_path = self.fetch_asset(image)
> > +
> > +        self.vm.set_console()
> > +        self.vm.add_args('-M', 'via=pmu')
> > +        self.vm.add_args('-m', '1g')
> > +        self.vm.add_args('-cpu', 'G4')
> > +        self.vm.add_args('-drive', 'file=' + drive_path)
> > +#        self.vm.add_args('-net', 'nic,model=rtl8139')
> > +#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')
> > +        self.vm.add_args('-vga', 'std')
> > +        self.vm.add_args('-g', '640x480')
> > +        self.vm.launch()
> > +
> > +        # This comes up after 60 seconds on a fast x86 CPU. Give it
> > +        # 180s to be sure.
> > +        time.sleep(180)
> > +        with tempfile.NamedTemporaryFile(suffix='.ppm',
> > +                                         prefix='screendump-', delete=False) as ppmfile:
> > +            self.vm.command('screendump', filename=ppmfile.name)
> > +            if not filecmp.cmp(ppmfile.name, screenshot_path):
> > +                self.fail('Screenshot does not match')
> > +
>
> Nitpicking, I'd rather use:
>
>         @skipUntil(os.getenv('MACOS10_IMAGE'),
>                    'No MACOS10_IMAGE environment variable defined')

Aha I didn't know about that one. I don't think it's nitpicking, that's
a good suggestion, thank you.

> > +    def test_macos10(self):
> > +        """
> > +        :avocado: tags=arch:ppc
> > +        :avocado: tags=machine:mac99
> > +        :avocado: tags=device:framebuffer
> > +        """
> > +
> > +        basedir = os.getenv('AVOCADO_TEST_BASEDIR')
> > +        screenshot_path = os.path.join(basedir, 'ppc/macos10.ppm')
> > +
> > +        image = os.getenv('MACOS10_IMAGE')
> > +        if not image:
> > +            self.cancel('No MACOS10_IMAGE environment variable defined')
> > +        drive_path = self.fetch_asset(image)
>
> Please commit the hash if the image you used.

Sure.

>
> > +        self.vm.set_console()
> > +        self.vm.add_args('-M', 'via=pmu')
> > +        self.vm.add_args('-m', '1g')
> > +        self.vm.add_args('-cpu', 'G4')
> > +        self.vm.add_args('-drive', 'file=' + drive_path)
> > +#        self.vm.add_args('-net', 'nic,model=rtl8139')
> > +#        self.vm.add_args('-net', 'user,hostfwd=:127.0.0.1:2223-:22,hostname=qemu')
>
> Why is that commented? If not needed, just drop, since your test
> is already useful as it.

Yeah I will. That was the option used by some scripts here but it
doesn't seem to work for me here, whereas the default IIRC sungem
does get networking up. Could be a QEMU regression so I was meaning
to try a bisect.

Thanks for the feedback on these. I'll leave the MacOS and AIX ones
out of the next ppc PR so there is more time for thought and
discussion about them.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-10 21:55   ` Warner Losh
@ 2023-10-11  0:36     ` Nicholas Piggin
  2023-10-11  4:24       ` Warner Losh
  2023-10-11  2:23     ` Nicholas Piggin
  1 sibling, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-11  0:36 UTC (permalink / raw)
  To: Warner Losh
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Wed Oct 11, 2023 at 7:55 AM AEST, Warner Losh wrote:
> On Tue, Oct 10, 2023 at 1:53 AM Nicholas Piggin <npiggin@gmail.com> wrote:
>
> > FreeBSD project provides qcow2 images that work well for testing QEMU.
> > Add pseries tests for HPT and Radix, KVM and TCG.
> >
> > Other architectures could be added so this does not get a ppc_ prefix
> > but is instead named similarly to boot_linux.
> >
> > Cc: Warner Losh <imp@bsdimp.com>
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> >
> > CC'ing Warner to check if it's okay for us to use these images and
> > any comments or suggestions. avocado tests have many Linux boots so we'd
> > do much better to expand test coverage by adding some other systems.
> >
>
> I like this.... I'm a little worried at the exact hash encoded in it, but
> since there's a checksum
> to match, it's OK I guess. It will give this code a shelf-life of months,
> IIRC our retention policy.

Oh I didn't realise, I saw some 2021 dates in the directory listing but looks
like they're not for the artifacts themselves.

I don't suppose you know if there are any long-term artifacts kept
around, or someone who I could ask?

The downside of using short term images is that it can be harder to
reproduce reports from others, bisect, run manual testing, etc. I think
these would still be useful, so long as they get updated regularly.

>
> Other than that, I think this is good. Not familiar enough with Avocado to
> understand
> skipping for gitlab CI, but given the extreme crunch on minutes, I think
> that's OK.

Yeah I'm not sure what the situation there is, I didn't want to add new
tests of any significant weight yet. We could always flip it on later if
people want it.

>
> Other than one nit below which is fine if it is intentionally left behind
> (or removed):
>
> Reviewed-by: Warner Losh <imp@bsdimp.com>
>
> Please don't hesitate to reach out to me if this is failing. I'll act as a
> backstop to get
> it to the right people.

Thanks Warner.

>
> Warner
>
>
[snip]

> > +    def run_pseries_test(self, force_HPT=False):
> > +        # We need zstd for all the tuxrun tests
> > +        # See https://github.com/avocado-framework/avocado/issues/5609
> > +        zstd = find_command('zstd', False)
> > +        if zstd is False:
> > +            self.cancel('Could not find "zstd", which is required to '
> > +                        'decompress rootfs')
> > +        self.zstd = zstd
> > +
> > +        drive_url = ('
> > https://artifact.ci.freebsd.org/snapshot/15.0-CURRENT/a2440348eed75bb7682579af0905b652747fd016/powerpc/powerpc64le/disk.qcow2.zst
> > ')
> > +        drive_hash = '8ab11a05ccab3d44215fd4667a70454ed10a203f'
> > +        drive_path_zstd = self.fetch_asset(drive_url,
> > asset_hash=drive_hash)
> > +        drive_path = os.path.join(self.workdir, 'disk.qcow2')
> > +        # archive.zstd_uncompress(drive_path_zstd, drive_path)
> >
>
> Why is this commented out? It looks like a leftover maybe?
>

Ah yes, avocado recently got zstd_uncompress but it seems not
available for QEMU yet so we have to do it by hand. I'll remove.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-10 21:55   ` Warner Losh
  2023-10-11  0:36     ` Nicholas Piggin
@ 2023-10-11  2:23     ` Nicholas Piggin
  2023-10-11  4:25       ` Warner Losh
  1 sibling, 1 reply; 38+ messages in thread
From: Nicholas Piggin @ 2023-10-11  2:23 UTC (permalink / raw)
  To: Warner Losh
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Wed Oct 11, 2023 at 7:55 AM AEST, Warner Losh wrote:
> On Tue, Oct 10, 2023 at 1:53 AM Nicholas Piggin <npiggin@gmail.com> wrote:
>
> > FreeBSD project provides qcow2 images that work well for testing QEMU.
> > Add pseries tests for HPT and Radix, KVM and TCG.
> >
> > Other architectures could be added so this does not get a ppc_ prefix
> > but is instead named similarly to boot_linux.
> >
> > Cc: Warner Losh <imp@bsdimp.com>
> > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> >
> > CC'ing Warner to check if it's okay for us to use these images and
> > any comments or suggestions. avocado tests have many Linux boots so we'd
> > do much better to expand test coverage by adding some other systems.
> >
>
> I like this.... I'm a little worried at the exact hash encoded in it, but
> since there's a checksum
> to match, it's OK I guess. It will give this code a shelf-life of months,
> IIRC our retention policy.

The oldest 15.0 CURRENT image on there is May 1st, so ~6 months? That's
not too bad. There are some release qcow2 images as well which sound
like they're maintained longer-term:

https://download.freebsd.org/releases/VM-IMAGES/

No builds for powerpc, but those might be preferable for other targets.

Another option for powerpc might be to use a release .iso. It's much
nicer to have a qcow image already installed though. I'll tinker with
it a bit more, but may stick with the snapshot for now.

Thanks,
Nick


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-11  0:36     ` Nicholas Piggin
@ 2023-10-11  4:24       ` Warner Losh
  0 siblings, 0 replies; 38+ messages in thread
From: Warner Losh @ 2023-10-11  4:24 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3881 bytes --]

On Tue, Oct 10, 2023 at 6:36 PM Nicholas Piggin <npiggin@gmail.com> wrote:

> On Wed Oct 11, 2023 at 7:55 AM AEST, Warner Losh wrote:
> > On Tue, Oct 10, 2023 at 1:53 AM Nicholas Piggin <npiggin@gmail.com>
> wrote:
> >
> > > FreeBSD project provides qcow2 images that work well for testing QEMU.
> > > Add pseries tests for HPT and Radix, KVM and TCG.
> > >
> > > Other architectures could be added so this does not get a ppc_ prefix
> > > but is instead named similarly to boot_linux.
> > >
> > > Cc: Warner Losh <imp@bsdimp.com>
> > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> > >
> > > CC'ing Warner to check if it's okay for us to use these images and
> > > any comments or suggestions. avocado tests have many Linux boots so
> we'd
> > > do much better to expand test coverage by adding some other systems.
> > >
> >
> > I like this.... I'm a little worried at the exact hash encoded in it, but
> > since there's a checksum
> > to match, it's OK I guess. It will give this code a shelf-life of months,
> > IIRC our retention policy.
>
> Oh I didn't realise, I saw some 2021 dates in the directory listing but
> looks
> like they're not for the artifacts themselves.
>
> I don't suppose you know if there are any long-term artifacts kept
> around, or someone who I could ask?
>
> The downside of using short term images is that it can be harder to
> reproduce reports from others, bisect, run manual testing, etc. I think
> these would still be useful, so long as they get updated regularly.
>

Yes. We're in kind of a weird zone. powerpc64le is a new architecture, so
hasn't had artifacts for long. 14.0 is in progress, but not done yet, so
there's
no 'long term stable' version to use yet.

I don't know what our current retention policy is, hence my caution.


> >
> > Other than that, I think this is good. Not familiar enough with Avocado
> to
> > understand
> > skipping for gitlab CI, but given the extreme crunch on minutes, I think
> > that's OK.
>
> Yeah I'm not sure what the situation there is, I didn't want to add new
> tests of any significant weight yet. We could always flip it on later if
> people want it.
>

That makes sense.


> >
> > Other than one nit below which is fine if it is intentionally left behind
> > (or removed):
> >
> > Reviewed-by: Warner Losh <imp@bsdimp.com>
> >
> > Please don't hesitate to reach out to me if this is failing. I'll act as
> a
> > backstop to get
> > it to the right people.
>
> Thanks Warner.
>

You bet. I'll give a heads up once we have 14.0 out so we can switch to
a more stable artifact.

Warner


> >
> > Warner
> >
> >
> [snip]
>
> > > +    def run_pseries_test(self, force_HPT=False):
> > > +        # We need zstd for all the tuxrun tests
> > > +        # See
> https://github.com/avocado-framework/avocado/issues/5609
> > > +        zstd = find_command('zstd', False)
> > > +        if zstd is False:
> > > +            self.cancel('Could not find "zstd", which is required to '
> > > +                        'decompress rootfs')
> > > +        self.zstd = zstd
> > > +
> > > +        drive_url = ('
> > >
> https://artifact.ci.freebsd.org/snapshot/15.0-CURRENT/a2440348eed75bb7682579af0905b652747fd016/powerpc/powerpc64le/disk.qcow2.zst
> > > ')
> > > +        drive_hash = '8ab11a05ccab3d44215fd4667a70454ed10a203f'
> > > +        drive_path_zstd = self.fetch_asset(drive_url,
> > > asset_hash=drive_hash)
> > > +        drive_path = os.path.join(self.workdir, 'disk.qcow2')
> > > +        # archive.zstd_uncompress(drive_path_zstd, drive_path)
> > >
> >
> > Why is this commented out? It looks like a leftover maybe?
> >
>
> Ah yes, avocado recently got zstd_uncompress but it seems not
> available for QEMU yet so we have to do it by hand. I'll remove.
>
> Thanks,
> Nick
>

[-- Attachment #2: Type: text/html, Size: 5898 bytes --]

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc
  2023-10-11  2:23     ` Nicholas Piggin
@ 2023-10-11  4:25       ` Warner Losh
  0 siblings, 0 replies; 38+ messages in thread
From: Warner Losh @ 2023-10-11  4:25 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1735 bytes --]

On Tue, Oct 10, 2023 at 8:23 PM Nicholas Piggin <npiggin@gmail.com> wrote:

> On Wed Oct 11, 2023 at 7:55 AM AEST, Warner Losh wrote:
> > On Tue, Oct 10, 2023 at 1:53 AM Nicholas Piggin <npiggin@gmail.com>
> wrote:
> >
> > > FreeBSD project provides qcow2 images that work well for testing QEMU.
> > > Add pseries tests for HPT and Radix, KVM and TCG.
> > >
> > > Other architectures could be added so this does not get a ppc_ prefix
> > > but is instead named similarly to boot_linux.
> > >
> > > Cc: Warner Losh <imp@bsdimp.com>
> > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> > >
> > > CC'ing Warner to check if it's okay for us to use these images and
> > > any comments or suggestions. avocado tests have many Linux boots so
> we'd
> > > do much better to expand test coverage by adding some other systems.
> > >
> >
> > I like this.... I'm a little worried at the exact hash encoded in it, but
> > since there's a checksum
> > to match, it's OK I guess. It will give this code a shelf-life of months,
> > IIRC our retention policy.
>
> The oldest 15.0 CURRENT image on there is May 1st, so ~6 months? That's
> not too bad. There are some release qcow2 images as well which sound
> like they're maintained longer-term:
>
> https://download.freebsd.org/releases/VM-IMAGES/
>
> No builds for powerpc, but those might be preferable for other targets.
>
> Another option for powerpc might be to use a release .iso. It's much
> nicer to have a qcow image already installed though. I'll tinker with
> it a bit more, but may stick with the snapshot for now.
>

I'll try to track that down. It may just be an oversight since powerpc64le
is
new.

Warner


> Thanks,
> Nick
>

[-- Attachment #2: Type: text/html, Size: 2717 bytes --]

^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10
  2023-10-10 20:57     ` Nicholas Piggin
@ 2023-10-16  1:59       ` Joel Stanley
  0 siblings, 0 replies; 38+ messages in thread
From: Joel Stanley @ 2023-10-16  1:59 UTC (permalink / raw)
  To: Nicholas Piggin
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On Wed, 11 Oct 2023 at 07:28, Nicholas Piggin <npiggin@gmail.com> wrote:
>
> On Tue Oct 10, 2023 at 10:05 PM AEST, Joel Stanley wrote:
> > On Tue, 10 Oct 2023 at 18:24, Nicholas Piggin <npiggin@gmail.com> wrote:
> > >
> > > POWER10 is the latest IBM Power machine. Although it is not offered in
> > > "OPAL mode" (i.e., powernv configuration), so there is a case that it
> > > should remain at powernv9, most of the development work is going into
> > > powernv10 at the moment.
> > >
> > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> >
> > Reviewed-by: Joel Stanley <joel@jms.id.au>
> >
> > Do we need to update the docs?
>
> What did you have in mind? Add some powernv10 examples?

Nothing in mind. The docs don't actually mention which cpu is the
default, which has the upside of us not needing to update it.

Cheers,

Joel


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests
  2023-10-10  7:52 ` [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests Nicholas Piggin
@ 2023-10-16  6:39   ` Harsh Prateek Bora
  0 siblings, 0 replies; 38+ messages in thread
From: Harsh Prateek Bora @ 2023-10-16  6:39 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel,
	anushree.mathur, hariharan.ts

+ Anushree, Hari - FYI

On 10/10/23 13:22, Nicholas Piggin wrote:
> The powernv and pseries machines both provide hypervisor facilities,
> which is a large and complicated set of features that don't get much
> system testing in CI.
> 
> Add a new test case for these which runs QEMU KVM inside the target.
> ---
>   tests/avocado/ppc_hv_tests.py | 173 ++++++++++++++++++++++++++++++++++
>   1 file changed, 173 insertions(+)
>   create mode 100644 tests/avocado/ppc_hv_tests.py
> 
> diff --git a/tests/avocado/ppc_hv_tests.py b/tests/avocado/ppc_hv_tests.py
> new file mode 100644
> index 0000000000..16aac1d35d
> --- /dev/null
> +++ b/tests/avocado/ppc_hv_tests.py
> @@ -0,0 +1,173 @@
> +# Tests that specifically try to exercise hypervisor features of the
> +# target machines. powernv supports the Power hypervisor ISA, and
> +# pseries supports the nested-HV hypervisor spec.
> +#
> +# Copyright (c) 2023 IBM Corporation
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2 or
> +# later.  See the COPYING file in the top-level directory.
> +
> +from avocado import skipIf
> +from avocado.utils import archive
> +from avocado_qemu import QemuSystemTest
> +from avocado_qemu import wait_for_console_pattern, exec_command
> +import os
> +import time
> +import subprocess
> +
> +# Alpine is a light weight distro that supports QEMU. These tests boot
> +# that on the machine then run a QEMU guest inside it in KVM mode,
> +# that runs the same Alpine distro image.
> +# QEMU packages are downloaded and installed on each test. That's not a
> +# large download, but it may be more polite to create qcow2 image with
> +# QEMU already installed and use that.
> +class HypervisorTest(QemuSystemTest):
> +
> +    timeout = 600
> +    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
> +    panic_message = 'Kernel panic - not syncing'
> +    good_message = 'VFS: Cannot open root device'
> +
> +    def extract_from_iso(self, iso, path):
> +        """
> +        Extracts a file from an iso file into the test workdir
> +
> +        :param iso: path to the iso file
> +        :param path: path within the iso file of the file to be extracted
> +        :returns: path of the extracted file
> +        """
> +        filename = os.path.basename(path)
> +
> +        cwd = os.getcwd()
> +        os.chdir(self.workdir)
> +
> +        with open(filename, "w") as outfile:
> +            cmd = "isoinfo -i %s -R -x %s" % (iso, path)
> +            subprocess.run(cmd.split(), stdout=outfile)
> +
> +        os.chdir(cwd)
> +
> +        # Return complete path to extracted file.  Because callers to
> +        # extract_from_iso() specify 'path' with a leading slash, it is
> +        # necessary to use os.path.relpath() as otherwise os.path.join()
> +        # interprets it as an absolute path and drops the self.workdir part.
> +        return os.path.normpath(os.path.join(self.workdir, filename))
> +
> +    def do_start_alpine(self):
> +        iso_url = ('https://dl-cdn.alpinelinux.org/alpine/v3.18/releases/ppc64le/alpine-standard-3.18.4-ppc64le.iso')
> +
> +        # Alpine use sha256 so I recalculated this myself
> +        iso_sha256 = 'c26b8d3e17c2f3f0fed02b4b1296589c2390e6d5548610099af75300edd7b3ff'
> +        iso_path = self.fetch_asset(iso_url, asset_hash=iso_sha256,
> +                                    algorithm = "sha256")
> +
> +        vmlinuz = self.extract_from_iso(iso_path, '/boot/vmlinuz-lts')
> +        initramfs = self.extract_from_iso(iso_path, '/boot/initramfs-lts')
> +
> +        self.vm.set_console()
> +        self.vm.add_args("-kernel", vmlinuz)
> +        self.vm.add_args("-initrd", initramfs)
> +        kernel_command_line = (self.KERNEL_COMMON_COMMAND_LINE +
> +                               'console=hvc0')

console=hvc0 was already added to KERNEL_COMMON_COMMAND_LINE during init.

> +        self.require_accelerator("tcg")
> +
> +        self.vm.add_args("-accel", "tcg,thread=multi")
> +        self.vm.add_args("-smp", "4", "-m", "2g")
> +        self.vm.add_args("-drive", f"file={iso_path},format=raw,if=none,id=drive0")
> +#        self.vm.add_args("-drive", f"file={iso_path},format=raw")

commented code can be removed.

> +
> +        self.vm.launch()
> +        wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
> +        exec_command(self, 'root')
> +        wait_for_console_pattern(self, 'localhost login:')
> +        wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
> +        exec_command(self, 'setup-alpine -qe')
> +        wait_for_console_pattern(self, 'localhost:~#')
> +
> +    def do_stop_alpine(self):
> +        exec_command(self, 'poweroff')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +        self.vm.wait()
> +
> +    def do_setup_kvm(self):
> +        exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/main > /etc/apk/repositories')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +        exec_command(self, 'echo http://dl-cdn.alpinelinux.org/alpine/v3.18/community >> /etc/apk/repositories')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +        exec_command(self, 'apk update')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +        exec_command(self, 'apk add qemu-system-ppc64')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +        exec_command(self, 'modprobe kvm-hv')
> +        wait_for_console_pattern(self, 'alpine:~#')
> +
> +    def do_test_kvm(self, hpt=False):
> +        if hpt:
> +            append = 'disable_radix'
> +        else:
> +            append = ''
> +        exec_command(self, 'qemu-system-ppc64 -nographic -smp 2 -m 1g '
> +                           '-machine pseries,x-vof=on,accel=kvm '
> +                           '-machine cap-cfpc=broken,cap-sbbc=broken,'
> +                                    'cap-ibs=broken,cap-ccf-assist=off '
> +                           '-drive file=/dev/nvme0n1,format=raw,readonly=on '
> +                           '-initrd /media/nvme0n1/boot/initramfs-lts '
> +                           '-kernel /media/nvme0n1/boot/vmlinuz-lts '
> +                           '-append \'usbcore.nousb ' + append + '\'')
> +        # Alpine 3.18 kernel seems to crash in XHCI USB driver.
> +        wait_for_console_pattern(self, 'Welcome to Alpine Linux 3.18')
> +        exec_command(self, 'root')
> +        wait_for_console_pattern(self, 'localhost login:')
> +        wait_for_console_pattern(self, 'You may change this message by editing /etc/motd.')
> +        exec_command(self, 'poweroff >& /dev/null')
> +        wait_for_console_pattern(self, 'localhost:~#')
> +        wait_for_console_pattern(self, 'reboot: Power down')
> +        time.sleep(1)
> +        exec_command(self, '') # console has strange issue after qemu exit
> +        exec_command(self, 'reset')
> +        exec_command(self, 'echo VM finished')
> +        wait_for_console_pattern(self, 'VM finished')
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_hv_pseries(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:tcg
> +        """
> +        self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
> +        self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")
> +        self.do_start_alpine()
> +        self.do_setup_kvm()
> +        self.do_test_kvm()
> +        self.do_stop_alpine()
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_hv_pseries_kvm(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        :avocado: tags=accel:kvm
> +        """
> +        self.vm.add_args('-device', 'nvme,serial=1234,drive=drive0')
> +        self.vm.add_args("-machine", "x-vof=on,cap-nested-hv=on")

Is this meant to launch an L0 with KVM accel on pseries with 
cap-nested-hv=on and then do another nested guest using KVM (with below 
steps). Is cap-nested-hv really supported on actual pseries LPARs yet?

regards,
Harsh

> +        self.do_start_alpine()
> +        self.do_setup_kvm()
> +        self.do_test_kvm()
> +        self.do_stop_alpine()
> +
> +    @skipIf(os.getenv('GITLAB_CI'), 'Running on GitLab')
> +    def test_hv_powernv(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:powernv
> +        :avocado: tags=accel:tcg
> +        """
> +        self.vm.add_args('-device', 'nvme,bus=pcie.2,addr=0x0,serial=1234,drive=drive0',
> +                         '-device', 'e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0',
> +                         '-netdev', 'user,id=net0,hostfwd=::20022-:22,hostname=alpine')
> +        self.do_start_alpine()
> +        self.do_setup_kvm()
> +        self.do_test_kvm()
> +        self.do_test_kvm(True)
> +        self.do_stop_alpine()


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10 20:53     ` Nicholas Piggin
@ 2023-10-16  8:07       ` Cédric Le Goater
  0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2023-10-16  8:07 UTC (permalink / raw)
  To: Nicholas Piggin, Joel Stanley, Michael Ellerman
  Cc: qemu-ppc, Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On 10/10/23 22:53, Nicholas Piggin wrote:
> On Tue Oct 10, 2023 at 10:03 PM AEST, Joel Stanley wrote:
>> On Tue, 10 Oct 2023 at 18:23, Nicholas Piggin <npiggin@gmail.com> wrote:
>>>
>>> Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
>>> using Guenter Roeck's rootfs images for Linux testing, and a gitlab
>>> repository with kernel images that I built since there are very few
>>> sources of modern BookE images now.
>>>
>>> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
>>
>> Reviewed-by: Joel Stanley <joel@jms.id.au>
>>
>> Should we get mpe to add a https://github.com/linuxppc/qemu-ci-images
>> for you to keep those kernel images? But perhaps you'd prefer to keep
>> them on gitlab. Just a suggestion.
> 
> Not a bad idea. Or we could try for gitlab/qemu/ci-images I suppose.

Feel free to take these :

   https://github.com/legoater/qemu-ppc-boot/tree/main/buildroot

Supported machines

     prep/ppc 604 CPU
     ref405ep/ppc 405EP CPU
     bamboo/ppc 440EP CPU
     sam460ex/ppc 460EX CPU (equivalent to a 440)
     g3beige/ppc G3 CPU
     mac99/ppc G4 CPU
     e500mc/ppc e500mc CPU
     mpc8544ds/ppc e500v2 CPU
     ppce500/ppc64 e5500, e6500
     mac99/ppc64 970 CPU with 64bit and 32bit user space
     pseries/ppc64 POWER5+, 970, 970MP, POWER7
     pseries/ppc64le POWER8, POWER9, POWER10
     powernv8/ppc64le POWER8 HV CPU
     powernv9/ppc64le POWER9 HV CPU

Thanks,

C.


> 
>>
>>> ---
>>>   tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
>>>   1 file changed, 53 insertions(+)
>>>
>>> diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
>>> index 9434304cd3..dc3346ef49 100644
>>> --- a/tests/avocado/boot_linux_console.py
>>> +++ b/tests/avocado/boot_linux_console.py
>>> @@ -1355,6 +1355,59 @@ def test_ppc64_e500(self):
>>>           tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
>>>           self.do_test_advcal_2018('19', tar_hash, 'uImage')
>>>
>>> +    def test_ppc64_e6500(self):
>>> +        """
>>> +        :avocado: tags=arch:ppc64
>>> +        :avocado: tags=machine:ppce500
>>> +        :avocado: tags=cpu:e6500
>>> +        :avocado: tags=accel:tcg
>>> +        """
>>> +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/corenet64_vmlinux?ref_type=heads&inline=false')
>>
>> Is the ref_type?heads=inline-false required? I seem to get the file
>> successfully with wget and those omitted.
> 
> I just copied the download link, so if it works without then
> I'll remove it.
> 
> Thanks,
> Nick
> 



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10
  2023-10-10  7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
  2023-10-10 12:05   ` Joel Stanley
@ 2023-10-16  8:15   ` Cédric Le Goater
  1 sibling, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2023-10-16  8:15 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> POWER10 is the latest IBM Power machine. Although it is not offered in
> "OPAL mode" (i.e., powernv configuration), so there is a case that it
> should remain at powernv9, most of the development work is going into
> powernv10 at the moment.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

I think we would update skiboot to v7.1 also.

Reviewed-by: Cédric Le Goater <clg@redhat.com>

Thanks,

C.



> ---
>   hw/ppc/pnv.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
> index eb54f93986..f3dad5ae05 100644
> --- a/hw/ppc/pnv.c
> +++ b/hw/ppc/pnv.c
> @@ -2195,8 +2195,6 @@ static void pnv_machine_power9_class_init(ObjectClass *oc, void *data)
>   
>       xfc->match_nvt = pnv_match_nvt;
>   
> -    mc->alias = "powernv";
> -
>       pmc->compat = compat;
>       pmc->compat_size = sizeof(compat);
>       pmc->dt_power_mgt = pnv_dt_power_mgt;
> @@ -2220,6 +2218,8 @@ static void pnv_machine_power10_class_init(ObjectClass *oc, void *data)
>       mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
>       compat_props_add(mc->compat_props, phb_compat, G_N_ELEMENTS(phb_compat));
>   
> +    mc->alias = "powernv";
> +
>       pmc->compat = compat;
>       pmc->compat_size = sizeof(compat);
>       pmc->dt_power_mgt = pnv_dt_power_mgt;



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU
  2023-10-10  7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
  2023-10-10 12:08   ` Joel Stanley
@ 2023-10-16  8:16   ` Cédric Le Goater
  1 sibling, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2023-10-16  8:16 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> POWER10 is the latest pseries CPU.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>


Reviewed-by: Cédric Le Goater <clg@redhat.com>

Thanks,

C.


> ---
>   hw/ppc/spapr.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index d4230d3647..9d3475d64b 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -4661,7 +4661,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
>   
>       smc->dr_lmb_enabled = true;
>       smc->update_dt_enabled = true;
> -    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power9_v2.2");
> +    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("power10_v2.0");
>       mc->has_hotpluggable_cpus = true;
>       mc->nvdimm_supported = true;
>       smc->resize_hpt_default = SPAPR_RESIZE_HPT_ENABLED;



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests
  2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
  2023-10-10  8:02   ` Philippe Mathieu-Daudé
  2023-10-10 12:03   ` Joel Stanley
@ 2023-10-16  8:32   ` Cédric Le Goater
  2 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2023-10-16  8:32 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> Add simple Linux kernel boot tests for BookE 64-bit and 32-bit CPUs
> using Guenter Roeck's rootfs images for Linux testing, and a gitlab
> repository with kernel images that I built since there are very few
> sources of modern BookE images now.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
>   tests/avocado/boot_linux_console.py | 53 +++++++++++++++++++++++++++++
>   1 file changed, 53 insertions(+)
> 
> diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
> index 9434304cd3..dc3346ef49 100644
> --- a/tests/avocado/boot_linux_console.py
> +++ b/tests/avocado/boot_linux_console.py
> @@ -1355,6 +1355,59 @@ def test_ppc64_e500(self):
>           tar_hash = '6951d86d644b302898da2fd701739c9406527fe1'
>           self.do_test_advcal_2018('19', tar_hash, 'uImage')
>   
> +    def test_ppc64_e6500(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:ppce500
> +        :avocado: tags=cpu:e6500
> +        :avocado: tags=accel:tcg
> +        """
> +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/corenet64_vmlinux?ref_type=heads&inline=false')
> +        kernel_hash = '01051590b083fec66cb3b9e2e553e95d4cf47691'
> +        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
> +
> +        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc64/rootfs.cpio.gz')


I think you should use buildroot images from the qemu_ppc64_e5500 defconfig:

   https://github.com/buildroot/buildroot/tree/master/board/qemu/ppc64-e5500

The question is where to store them. I did under my GH account for PPC and
Aspeed but it is not satisfactory in the long term.

May be could have a common repo for all the buildroot QEMU boards images ?
and rebuild once a year ?

Thanks,

C.


> +        initrd_hash = '798acffc036c3b1ae6cacf95c869bba2'
> +        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
> +                                       algorithm="md5")
> +
> +        self.vm.set_console()
> +        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
> +        self.vm.add_args('-smp', '2',
> +                         '-kernel', kernel_path,
> +                         '-initrd', initrd_path,
> +                         '-append', kernel_command_line,
> +                         '-no-reboot')
> +        self.vm.launch()
> +        # Wait for VM to shut down gracefully
> +        self.vm.wait()
> +
> +    def test_ppc32_mpc85xx(self):
> +        """
> +        :avocado: tags=arch:ppc
> +        :avocado: tags=machine:ppce500
> +        :avocado: tags=cpu:mpc8568
> +        :avocado: tags=accel:tcg
> +        """
> +        kernel_url = ('https://gitlab.com/npiggin/qemu-ci-images/-/raw/main/ppc/mpc85xx_vmlinux?ref_type=heads&inline=false')
> +        kernel_hash = '726f7f574a491282454850b48546b3827593142b'
> +        kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
> +
> +        initrd_url = ('https://github.com/groeck/linux-build-test/raw/master/rootfs/ppc/rootfs.cpio.gz')
> +        initrd_hash = '4d30fa93b742c493e8cf2140e49bbd9a'
> +        initrd_path = self.fetch_asset(initrd_url, asset_hash=initrd_hash,
> +                                       algorithm="md5")
> +
> +        self.vm.set_console()
> +        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE
> +        self.vm.add_args('-kernel', kernel_path,
> +                         '-initrd', initrd_path,
> +                         '-append', kernel_command_line,
> +                         '-no-reboot')
> +        self.vm.launch()
> +        # Wait for VM to shut down gracefully
> +        self.vm.wait()
> +
>       def do_test_ppc64_powernv(self, proc):
>           self.require_accelerator("tcg")
>           images_url = ('https://github.com/open-power/op-build/releases/download/v2.7/')



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests
  2023-10-10  7:52 ` [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests Nicholas Piggin
@ 2023-10-16  8:40   ` Cédric Le Goater
  0 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2023-10-16  8:40 UTC (permalink / raw)
  To: Nicholas Piggin, qemu-ppc
  Cc: Cleber Rosa, Philippe Mathieu-Daudé,
	Wainer dos Santos Moschetta, Beraldo Leal, qemu-devel

On 10/10/23 09:52, Nicholas Piggin wrote:
> The Hash MMU mode is supported along side Radix in POWER hardware, and
> Linux supports running in either mode. Radix is the default so to keep
> up testing of QEMU Hash MMU, add some explicit Hash MMU tests.
> 
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

Nice ! Could we do the same with XICS and XIVE (xive=off) ? since XIVE
is the default now.

May be we should add a boot test for all CPUs supported by pseries :

   970, 970mp, POWER5+, P8, P9, P10.

Same for PowerNV.

Thanks,

C.

> ---
>   tests/avocado/ppc_powernv.py | 21 ++++++++++++++++++---
>   tests/avocado/ppc_pseries.py | 20 +++++++++++++++++---
>   2 files changed, 35 insertions(+), 6 deletions(-)
> 
> diff --git a/tests/avocado/ppc_powernv.py b/tests/avocado/ppc_powernv.py
> index d0e5c07bde..2be322c47d 100644
> --- a/tests/avocado/ppc_powernv.py
> +++ b/tests/avocado/ppc_powernv.py
> @@ -12,11 +12,11 @@
>   class powernvMachine(QemuSystemTest):
>   
>       timeout = 90
> -    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
> +    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
>       panic_message = 'Kernel panic - not syncing'
>       good_message = 'VFS: Cannot open root device'
>   
> -    def do_test_linux_boot(self):
> +    def do_test_linux_boot(self, kernel_command_line = KERNEL_COMMON_COMMAND_LINE):
>           self.require_accelerator("tcg")
>           kernel_url = ('https://archives.fedoraproject.org/pub/archive'
>                         '/fedora-secondary/releases/29/Everything/ppc64le/os'
> @@ -25,7 +25,6 @@ def do_test_linux_boot(self):
>           kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
>   
>           self.vm.set_console()
> -        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
>           self.vm.add_args('-kernel', kernel_path,
>                            '-append', kernel_command_line)
>           self.vm.launch()
> @@ -54,6 +53,22 @@ def test_linux_smp_boot(self):
>           wait_for_console_pattern(self, console_pattern, self.panic_message)
>           wait_for_console_pattern(self, self.good_message, self.panic_message)
>   
> +    def test_linux_smp_hpt_boot(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:powernv
> +        :avocado: tags=accel:tcg
> +        """
> +
> +        self.vm.add_args('-smp', '4')
> +        self.do_test_linux_boot(self.KERNEL_COMMON_COMMAND_LINE +
> +                                'disable_radix')
> +        console_pattern = 'smp: Brought up 1 node, 4 CPUs'
> +        wait_for_console_pattern(self, 'hash-mmu: Initializing hash mmu',
> +                                 self.panic_message)
> +        wait_for_console_pattern(self, console_pattern, self.panic_message)
> +        wait_for_console_pattern(self, self.good_message, self.panic_message)
> +
>       def test_linux_smt_boot(self):
>           """
>           :avocado: tags=arch:ppc64
> diff --git a/tests/avocado/ppc_pseries.py b/tests/avocado/ppc_pseries.py
> index a8311e6555..74aaa4ac4a 100644
> --- a/tests/avocado/ppc_pseries.py
> +++ b/tests/avocado/ppc_pseries.py
> @@ -12,11 +12,11 @@
>   class pseriesMachine(QemuSystemTest):
>   
>       timeout = 90
> -    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 '
> +    KERNEL_COMMON_COMMAND_LINE = 'printk.time=0 console=hvc0 '
>       panic_message = 'Kernel panic - not syncing'
>       good_message = 'VFS: Cannot open root device'
>   
> -    def do_test_ppc64_linux_boot(self):
> +    def do_test_ppc64_linux_boot(self, kernel_command_line = KERNEL_COMMON_COMMAND_LINE):
>           kernel_url = ('https://archives.fedoraproject.org/pub/archive'
>                         '/fedora-secondary/releases/29/Everything/ppc64le/os'
>                         '/ppc/ppc64/vmlinuz')
> @@ -24,7 +24,6 @@ def do_test_ppc64_linux_boot(self):
>           kernel_path = self.fetch_asset(kernel_url, asset_hash=kernel_hash)
>   
>           self.vm.set_console()
> -        kernel_command_line = self.KERNEL_COMMON_COMMAND_LINE + 'console=hvc0'
>           self.vm.add_args('-kernel', kernel_path,
>                            '-append', kernel_command_line)
>           self.vm.launch()
> @@ -62,6 +61,21 @@ def test_ppc64_linux_smp_boot(self):
>           wait_for_console_pattern(self, console_pattern, self.panic_message)
>           wait_for_console_pattern(self, self.good_message, self.panic_message)
>   
> +    def test_ppc64_linux_hpt_smp_boot(self):
> +        """
> +        :avocado: tags=arch:ppc64
> +        :avocado: tags=machine:pseries
> +        """
> +
> +        self.vm.add_args('-smp', '4')
> +        self.do_test_ppc64_linux_boot(self.KERNEL_COMMON_COMMAND_LINE +
> +                                      'disable_radix')
> +        console_pattern = 'smp: Brought up 1 node, 4 CPUs'
> +        wait_for_console_pattern(self, 'hash-mmu: Initializing hash mmu',
> +                                 self.panic_message)
> +        wait_for_console_pattern(self, console_pattern, self.panic_message)
> +        wait_for_console_pattern(self, self.good_message, self.panic_message)
> +
>       def test_ppc64_linux_smt_boot(self):
>           """
>           :avocado: tags=arch:ppc64



^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2023-10-16  8:41 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-10  7:52 [RFC PATCH 00/11] ppc: avocado test additions and new defaults Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 01/11] tests/avocado: ppc add powernv10 boot_linux_console test Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 02/11] tests/avocado: Add ppc pseries and powernv Hash MMU tests Nicholas Piggin
2023-10-16  8:40   ` Cédric Le Goater
2023-10-10  7:52 ` [RFC PATCH 03/11] tests/avocado: Add pseries KVM boot_linux test Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 04/11] tests/avocado: ppc add hypervisor tests Nicholas Piggin
2023-10-16  6:39   ` Harsh Prateek Bora
2023-10-10  7:52 ` [RFC PATCH 05/11] testing/avocado: ppc add new BookE boot_linux_console.py tests Nicholas Piggin
2023-10-10  8:02   ` Philippe Mathieu-Daudé
2023-10-10 12:03   ` Joel Stanley
2023-10-10 20:53     ` Nicholas Piggin
2023-10-16  8:07       ` Cédric Le Goater
2023-10-16  8:32   ` Cédric Le Goater
2023-10-10  7:52 ` [RFC PATCH 06/11] tests/avocado: Add FreeBSD distro boot tests for ppc Nicholas Piggin
2023-10-10 21:55   ` Warner Losh
2023-10-11  0:36     ` Nicholas Piggin
2023-10-11  4:24       ` Warner Losh
2023-10-11  2:23     ` Nicholas Piggin
2023-10-11  4:25       ` Warner Losh
2023-10-10  7:52 ` [RFC PATCH 07/11] tests/avocado: Add ppc boot tests for non-free AIX images Nicholas Piggin
2023-10-10 12:43   ` Alex Bennée
2023-10-10 12:49     ` Philippe Mathieu-Daudé
2023-10-10 21:21       ` Nicholas Piggin
2023-10-10 13:01     ` Daniel P. Berrangé
2023-10-10 21:14       ` Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 08/11] tests/avocado: Add ppc MacOS tests Nicholas Piggin
2023-10-10  7:58   ` Philippe Mathieu-Daudé
2023-10-11  0:25     ` Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 09/11] tests/avocado: Use default CPU for pseries machine Nicholas Piggin
2023-10-10  7:52 ` [RFC PATCH 10/11] ppc/spapr: change pseries machine default to POWER10 CPU Nicholas Piggin
2023-10-10 12:08   ` Joel Stanley
2023-10-16  8:16   ` Cédric Le Goater
2023-10-10  7:52 ` [RFC PATCH 11/11] ppc/pnv: Change powernv default to powernv10 Nicholas Piggin
2023-10-10 12:05   ` Joel Stanley
2023-10-10 20:57     ` Nicholas Piggin
2023-10-16  1:59       ` Joel Stanley
2023-10-16  8:15   ` Cédric Le Goater
2023-10-10  7:59 ` [RFC PATCH 00/11] ppc: avocado test additions and new defaults Philippe Mathieu-Daudé

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).