Skip to content

Commit

Permalink
Merge tag 'pull-ppc-for-9.0-2-20240313' of https://gitlab.com/npiggin…
Browse files Browse the repository at this point in the history
…/qemu into staging

* PAPR nested hypervisor host implementation for spapr TCG
* excp_helper.c code cleanups and improvements
* Move more ops to decodetree
* Deprecate pseries-2.12 machines and P9 and P10 DD1.0 CPUs
* Document running Linux on AmigaNG
* Update dt feature advertising POWER CPUs.
* Add P10 PMU SPRs
* Improve pnv topology calculation for SMT8 CPUs.
* Various bug fixes.

# -----BEGIN PGP SIGNATURE-----
#
# iQIzBAABCgAdFiEETkN92lZhb0MpsKeVZ7MCdqhiHK4FAmXwiT8ACgkQZ7MCdqhi
# HK7C/w//XxEO2bQTFPLFDTrP/voq7pcX8XeQNVyXCkXYjvsbu05oQow50k+Y5UAE
# US4MFjt8jFz0vuIKuKyoA3kG41zDSOzoX4TQXMM+tyTWbuFF3KAyfizb1xE6SYAN
# xJEGvmiXv/EgoSBD7BTKQp1tMPdIGZLwSdYiA0lmOo7YaMCgYAXaujW5hnNjQecT
# 873sN+10pHtQY++mINtD9Nfb6AcDGMWw0b+bykqIXhNRkI8IGOS4WF4vAuMBrwfe
# UM00wDnNRb86Dk14bv2XVNDr6/i0VRtUMwM4yiptrQ1TQx18LZaPSQFYjQfPaan7
# LwN4QkMFnBX54yJ7Npvjvu8BCBF47kwOVu4CIAFJ4sIm0WfTmozDpPttwcZ5w7Ve
# iXDOB9ECAB4pQ2rCgbSNG8MYUZgoHHOuThqolOP0Vh9NHRRJxpdw6CyAbmCGftc0
# lvRDPFiKp8xmCNJ/j3XzoUdHoG7NMwpUmHv9ruGU18SdQ8hyJN9AcQGWYrB4v0RV
# /hs2RAbwntG7ahkcwd8uy5aFw88Wph/uGXPXc49EWj7i49vHeIV2y5+gtthMywje
# qqjFXkistXuF+JHVnyoYmqqCyXaHX5CEwtawMv4EQeaJs76bLhMeMTKKl9rRp8qB
# DtbIZphO8iMsocrBnje48sA5HR0PM+H4HTjw10i8R0fLlWitaIY=
# =XnY5
# -----END PGP SIGNATURE-----
# gpg: Signature made Tue 12 Mar 2024 16:56:31 GMT
# gpg:                using RSA key 4E437DDA56616F4329B0A79567B30276A8621CAE
# gpg: Good signature from "Nicholas Piggin <npiggin@gmail.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 4E43 7DDA 5661 6F43 29B0  A795 67B3 0276 A862 1CAE

* tag 'pull-ppc-for-9.0-2-20240313' of https://gitlab.com/npiggin/qemu: (38 commits)
  spapr: nested: Introduce cap-nested-papr for Nested PAPR API
  spapr: nested: Introduce H_GUEST_RUN_VCPU hcall.
  spapr: nested: Use correct source for parttbl info for nested PAPR API.
  spapr: nested: Introduce H_GUEST_[GET|SET]_STATE hcalls.
  spapr: nested: Initialize the GSB elements lookup table.
  spapr: nested: Extend nested_ppc_state for nested PAPR API
  spapr: nested: Introduce H_GUEST_CREATE_VCPU hcall.
  spapr: nested: Introduce H_GUEST_[CREATE|DELETE] hcalls.
  spapr: nested: Introduce H_GUEST_[GET|SET]_CAPABILITIES hcalls.
  spapr: nested: Document Nested PAPR API
  spapr: nested: keep nested-hv related code restricted to its API.
  spapr: nested: Introduce SpaprMachineStateNested to store related info.
  spapr: nested: move nested part of spapr_get_pate into spapr_nested.c
  spapr: nested: register nested-hv api hcalls only for cap-nested-hv
  target/ppc: Remove interrupt handler wrapper functions
  target/ppc: Clean up ifdefs in excp_helper.c, part 3
  target/ppc: Clean up ifdefs in excp_helper.c, part 2
  target/ppc: Clean up ifdefs in excp_helper.c, part 1
  target/ppc: Add gen_exception_err_nip() function
  target/ppc: Readability improvements in exception handlers
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Mar 13, 2024
2 parents bab9dab + e1617b8 commit 51e31f2
Show file tree
Hide file tree
Showing 28 changed files with 2,883 additions and 563 deletions.
4 changes: 1 addition & 3 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,6 @@ F: tests/tcg/openrisc/
PowerPC TCG CPUs
M: Nicholas Piggin <npiggin@gmail.com>
M: Daniel Henrique Barboza <danielhb413@gmail.com>
R: Cédric Le Goater <clg@kaod.org>
L: qemu-ppc@nongnu.org
S: Odd Fixes
F: target/ppc/
Expand Down Expand Up @@ -468,7 +467,6 @@ F: target/mips/sysemu/
PPC KVM CPUs
M: Nicholas Piggin <npiggin@gmail.com>
R: Daniel Henrique Barboza <danielhb413@gmail.com>
R: Cédric Le Goater <clg@kaod.org>
S: Odd Fixes
F: target/ppc/kvm.c

Expand Down Expand Up @@ -1508,7 +1506,6 @@ F: tests/avocado/ppc_prep_40p.py
sPAPR (pseries)
M: Nicholas Piggin <npiggin@gmail.com>
R: Daniel Henrique Barboza <danielhb413@gmail.com>
R: Cédric Le Goater <clg@kaod.org>
R: David Gibson <david@gibson.dropbear.id.au>
R: Harsh Prateek Bora <harshpb@linux.ibm.com>
L: qemu-ppc@nongnu.org
Expand Down Expand Up @@ -1575,6 +1572,7 @@ F: hw/rtc/m41t80.c
F: pc-bios/canyonlands.dt[sb]
F: pc-bios/u-boot-sam460ex-20100605.bin
F: roms/u-boot-sam460ex
F: docs/system/ppc/amigang.rst

pegasos2
M: BALATON Zoltan <balaton@eik.bme.hu>
Expand Down
6 changes: 3 additions & 3 deletions docs/about/deprecated.rst
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,13 @@ The Nios II architecture is orphan.
The machine is no longer in existence and has been long unmaintained
in QEMU. This also holds for the TC51828 16MiB flash that it uses.

``pseries-2.1`` up to ``pseries-2.11`` (since 9.0)
``pseries-2.1`` up to ``pseries-2.12`` (since 9.0)
''''''''''''''''''''''''''''''''''''''''''''''''''

Older pseries machines before version 2.12 have undergone many changes
Older pseries machines before version 3.0 have undergone many changes
to correct issues, mostly regarding migration compatibility. These are
no longer maintained and removing them will make the code easier to
read and maintain. Use versions 2.12 and above as a replacement.
read and maintain. Use versions 3.0 and above as a replacement.

Arm machines ``akita``, ``borzoi``, ``cheetah``, ``connex``, ``mainstone``, ``n800``, ``n810``, ``spitz``, ``terrier``, ``tosa``, ``verdex``, ``z2`` (since 9.0)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Expand Down
119 changes: 119 additions & 0 deletions docs/devel/nested-papr.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
Nested PAPR API (aka KVM on PowerVM)
====================================

This API aims at providing support to enable nested virtualization with
KVM on PowerVM. While the existing support for nested KVM on PowerNV was
introduced with cap-nested-hv option, however, with a slight design change,
to enable this on papr/pseries, a new cap-nested-papr option is added. eg:

qemu-system-ppc64 -cpu POWER10 -machine pseries,cap-nested-papr=true ...

Work by:
Michael Neuling <mikey@neuling.org>
Vaibhav Jain <vaibhav@linux.ibm.com>
Jordan Niethe <jniethe5@gmail.com>
Harsh Prateek Bora <harshpb@linux.ibm.com>
Shivaprasad G Bhat <sbhat@linux.ibm.com>
Kautuk Consul <kconsul@linux.vnet.ibm.com>

Below taken from the kernel documentation:

Introduction
============

This document explains how a guest operating system can act as a
hypervisor and run nested guests through the use of hypercalls, if the
hypervisor has implemented them. The terms L0, L1, and L2 are used to
refer to different software entities. L0 is the hypervisor mode entity
that would normally be called the "host" or "hypervisor". L1 is a
guest virtual machine that is directly run under L0 and is initiated
and controlled by L0. L2 is a guest virtual machine that is initiated
and controlled by L1 acting as a hypervisor. A significant design change
wrt existing API is that now the entire L2 state is maintained within L0.

Existing Nested-HV API
======================

Linux/KVM has had support for Nesting as an L0 or L1 since 2018

The L0 code was added::

commit 8e3f5fc1045dc49fd175b978c5457f5f51e7a2ce
Author: Paul Mackerras <paulus@ozlabs.org>
Date: Mon Oct 8 16:31:03 2018 +1100
KVM: PPC: Book3S HV: Framework and hcall stubs for nested virtualization

The L1 code was added::

commit 360cae313702cdd0b90f82c261a8302fecef030a
Author: Paul Mackerras <paulus@ozlabs.org>
Date: Mon Oct 8 16:31:04 2018 +1100
KVM: PPC: Book3S HV: Nested guest entry via hypercall

This API works primarily using a signal hcall h_enter_nested(). This
call made by the L1 to tell the L0 to start an L2 vCPU with the given
state. The L0 then starts this L2 and runs until an L2 exit condition
is reached. Once the L2 exits, the state of the L2 is given back to
the L1 by the L0. The full L2 vCPU state is always transferred from
and to L1 when the L2 is run. The L0 doesn't keep any state on the L2
vCPU (except in the short sequence in the L0 on L1 -> L2 entry and L2
-> L1 exit).

The only state kept by the L0 is the partition table. The L1 registers
it's partition table using the h_set_partition_table() hcall. All
other state held by the L0 about the L2s is cached state (such as
shadow page tables).

The L1 may run any L2 or vCPU without first informing the L0. It
simply starts the vCPU using h_enter_nested(). The creation of L2s and
vCPUs is done implicitly whenever h_enter_nested() is called.

In this document, we call this existing API the v1 API.

New PAPR API
===============

The new PAPR API changes from the v1 API such that the creating L2 and
associated vCPUs is explicit. In this document, we call this the v2
API.

h_enter_nested() is replaced with H_GUEST_VCPU_RUN(). Before this can
be called the L1 must explicitly create the L2 using h_guest_create()
and any associated vCPUs() created with h_guest_create_vCPU(). Getting
and setting vCPU state can also be performed using h_guest_{g|s}et
hcall.

The basic execution flow is for an L1 to create an L2, run it, and
delete it is:

- L1 and L0 negotiate capabilities with H_GUEST_{G,S}ET_CAPABILITIES()
(normally at L1 boot time).

- L1 requests the L0 to create an L2 with H_GUEST_CREATE() and receives a token

- L1 requests the L0 to create an L2 vCPU with H_GUEST_CREATE_VCPU()

- L1 and L0 communicate the vCPU state using the H_GUEST_{G,S}ET() hcall

- L1 requests the L0 to run the vCPU using H_GUEST_RUN_VCPU() hcall

- L1 deletes L2 with H_GUEST_DELETE()

For more details, please refer:

[1] Linux Kernel documentation (upstream documentation commit):

commit 476652297f94a2e5e5ef29e734b0da37ade94110
Author: Michael Neuling <mikey@neuling.org>
Date: Thu Sep 14 13:06:00 2023 +1000

docs: powerpc: Document nested KVM on POWER

Document support for nested KVM on POWER using the existing API as well
as the new PAPR API. This includes the new HCALL interface and how it
used by KVM.

Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Jordan Niethe <jniethe5@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20230914030600.16993-12-jniethe5@gmail.com
161 changes: 161 additions & 0 deletions docs/system/ppc/amigang.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
=========================================================
AmigaNG boards (``amigaone``, ``pegasos2``, ``sam460ex``)
=========================================================

These PowerPC machines emulate boards that are primarily used for
running Amiga like OSes (AmigaOS 4, MorphOS and AROS) but these can
also run Linux which is what this section documents.

Eyetech AmigaOne/Mai Logic Teron (``amigaone``)
===============================================

The ``amigaone`` machine emulates an AmigaOne XE mainboard by Eyetech
which is a rebranded Mai Logic Teron board with modified U-Boot
firmware to support AmigaOS 4.

Emulated devices
----------------

* PowerPC 7457 CPU (can also use``-cpu g3, 750cxe, 750fx`` or ``750gx``)
* Articia S north bridge
* VIA VT82C686B south bridge
* PCI VGA compatible card (guests may need other card instead)
* PS/2 keyboard and mouse

Firmware
--------

A firmware binary is necessary for the boot process. It is a modified
U-Boot under GPL but its source is lost so it cannot be included in
QEMU. A binary is available at
https://www.hyperion-entertainment.com/index.php/downloads?view=files&parent=28.
The ROM image is in the last 512kB which can be extracted with the
following command:

.. code-block:: bash
$ tail -c 524288 updater.image > u-boot-amigaone.bin
The BIOS emulator in the firmware is unable to run QEMU‘s standard
vgabios so ``VGABIOS-lgpl-latest.bin`` is needed instead which can be
downloaded from http://www.nongnu.org/vgabios.

Running Linux
-------------

There are some Linux images under the following link that work on the
``amigaone`` machine:
https://sourceforge.net/projects/amigaone-linux/files/debian-installer/.
To boot the system run:

.. code-block:: bash
$ qemu-system-ppc -machine amigaone -bios u-boot-amigaone.bin \
-cdrom "A1 Linux Net Installer.iso" \
-device ati-vga,model=rv100,romfile=VGABIOS-lgpl-latest.bin
From the firmware menu that appears select ``Boot sequence`` →
``Amiga Multiboot Options`` and set ``Boot device 1`` to
``Onboard VIA IDE CDROM``. Then hit escape until the main screen appears again,
hit escape once more and from the exit menu that appears select either
``Save settings and exit`` or ``Use settings for this session only``. It may
take a long time loading the kernel into memory but eventually it boots and the
installer becomes visible. The ``ati-vga`` RV100 emulation is not
complete yet so only frame buffer works, DRM and 3D is not available.

Genesi/bPlan Pegasos II (``pegasos2``)
======================================

The ``pegasos2`` machine emulates the Pegasos II sold by Genesi and
designed by bPlan. Its schematics are available at
https://www.powerdeveloper.org/platforms/pegasos/schematics.

Emulated devices
----------------

* PowerPC 7457 CPU (can also use``-cpu g3`` or ``750cxe``)
* Marvell MV64361 Discovery II north bridge
* VIA VT8231 south bridge
* PCI VGA compatible card (guests may need other card instead)
* PS/2 keyboard and mouse

Firmware
--------

The Pegasos II board has an Open Firmware compliant ROM based on
SmartFirmware with some changes that are not open-sourced therefore
the ROM binary cannot be included in QEMU. An updater was available
from bPlan, it can be found in the `Internet Archive
<http://web.archive.org/web/20071021223056/http://www.bplan-gmbh.de/up050404/up050404>`_.
The ROM image can be extracted from it with the following command:

.. code-block:: bash
$ tail -c +85581 up050404 | head -c 524288 > pegasos2.rom
Running Linux
-------------

The PowerPC version of Debian 8.11 supported Pegasos II. The BIOS
emulator in the firmware binary is unable to run QEMU‘s standard
vgabios so it needs to be disabled. To boot the system run:

.. code-block:: bash
$ qemu-system-ppc -machine pegasos2 -bios pegasos2.rom \
-cdrom debian-8.11.0-powerpc-netinst.iso \
-device VGA,romfile="" -serial stdio
At the firmware ``ok`` prompt enter ``boot cd install/pegasos``.

Alternatively, it is possible to boot the kernel directly without
firmware ROM using the QEMU built-in minimal Virtual Open Firmware
(VOF) emulation which is also supported on ``pegasos2``. For this,
extract the kernel ``install/powerpc/vmlinuz-chrp.initrd`` from the CD
image, then run:

.. code-block:: bash
$ qemu-system-ppc -machine pegasos2 -serial stdio \
-kernel vmlinuz-chrp.initrd -append "---" \
-cdrom debian-8.11.0-powerpc-netinst.iso
aCube Sam460ex (``sam460ex``)
=============================

The ``sam460ex`` machine emulates the Sam460ex board by aCube which is
based on the AMCC PowerPC 460EX SoC (that despite its name has a
PPC440 CPU core).

Firmware
--------

The board has a firmware based on an older U-Boot version with
modifications to support booting AmigaOS 4. The firmware ROM is
included with QEMU.

Emulated devices
----------------

* PowerPC 460EX SoC
* M41T80 serial RTC chip
* Silicon Motion SM501 display parts (identical to SM502 on real board)
* Silicon Image SiI3112 2 port SATA controller
* USB keyboard and mouse

Running Linux
-------------

The only Linux distro that supported Sam460ex out of box was CruxPPC
2.x. It can be booted by running:

.. code-block:: bash
$ qemu-system-ppc -machine sam460ex -serial stdio \
-drive if=none,id=cd,format=raw,file=crux-ppc-2.7a.iso \
-device ide-cd,drive=cd,bus=ide.1
There are some other kernels and instructions for booting other
distros on aCube's product page at
https://www.acube-systems.biz/index.php?page=hardware&pid=5
but those are untested.
1 change: 1 addition & 0 deletions docs/system/target-ppc.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ help``.
.. toctree::
:maxdepth: 1

ppc/amigang
ppc/embedded
ppc/powermac
ppc/powernv
Expand Down

0 comments on commit 51e31f2

Please sign in to comment.