| =================================== | 
 | pSeries family boards (``pseries``) | 
 | =================================== | 
 |  | 
 | The Power machine para-virtualized environment described by the Linux on Power | 
 | Architecture Reference ([LoPAR]_) document is called pSeries. This environment | 
 | is also known as sPAPR, System p guests, or simply Power Linux guests (although | 
 | it is capable of running other operating systems, such as AIX). | 
 |  | 
 | Even though pSeries is designed to behave as a guest environment, it is also | 
 | capable of acting as a hypervisor OS, providing, on that role, nested | 
 | virtualization capabilities. | 
 |  | 
 | Supported devices | 
 | ================= | 
 |  | 
 |  * Multi processor support for many Power processors generations: | 
 |    - POWER7, POWER7+ | 
 |    - POWER8, POWER8NVL | 
 |    - POWER9 | 
 |    - Power10 | 
 |    - Power11 | 
 |    - Support for POWER5+ also exists, works with correct kernel/userspace | 
 |  * Interrupt Controller | 
 |     - XICS (POWER8) | 
 |     - XIVE (Supported by below:) | 
 |         - POWER9 | 
 |         - Power10 | 
 |         - Power11 | 
 |  * vPHB PCIe Host bridge. | 
 |  * vscsi and vnet devices, compatible with the same devices available on a | 
 |    PowerVM hypervisor with VIOS managing LPARs. | 
 |  * Virtio based devices. | 
 |  * PCIe device pass through. | 
 |  | 
 | Missing devices | 
 | =============== | 
 |  | 
 |  * SPICE support. | 
 |  | 
 | Firmware | 
 | ======== | 
 |  | 
 | The pSeries platform in QEMU comes with 2 firmwares: | 
 |  | 
 | `SLOF <https://github.com/aik/SLOF>`_ (Slimline Open Firmware) is an | 
 | implementation of the `IEEE 1275-1994, Standard for Boot (Initialization | 
 | Configuration) Firmware: Core Requirements and Practices | 
 | <https://standards.ieee.org/standard/1275-1994.html>`_. | 
 |  | 
 | SLOF performs bus scanning, PCI resource allocation, provides the client | 
 | interface to boot from block devices and network. | 
 |  | 
 | QEMU includes a prebuilt image of SLOF which is updated when a more recent | 
 | version is required. | 
 |  | 
 | VOF (Virtual Open Firmware) is a minimalistic firmware to work with | 
 | ``-machine pseries,x-vof=on``. When enabled, the firmware acts as a slim | 
 | shim and QEMU implements parts of the IEEE 1275 Open Firmware interface. | 
 |  | 
 | VOF does not have device drivers, does not do PCI resource allocation and | 
 | relies on ``-kernel`` used with Linux kernels recent enough (v5.4+) | 
 | to PCI resource assignment. It is ideal to use with petitboot. | 
 |  | 
 | Booting via ``-kernel`` supports the following: | 
 |  | 
 | +-------------------+-------------------+------------------+ | 
 | | kernel            | pseries,x-vof=off | pseries,x-vof=on | | 
 | +===================+===================+==================+ | 
 | | vmlinux BE        |     ✓             |     ✓            | | 
 | +-------------------+-------------------+------------------+ | 
 | | vmlinux LE        |     ✓             |     ✓            | | 
 | +-------------------+-------------------+------------------+ | 
 | | zImage.pseries BE |     ✓¹            |     ✓¹           | | 
 | +-------------------+-------------------+------------------+ | 
 | | zImage.pseries LE |     ✓             |     ✓            | | 
 | +-------------------+-------------------+------------------+ | 
 |  | 
 | ¹ must set kernel-addr=0 | 
 |  | 
 | Build directions | 
 | ================ | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |   ./configure --target-list=ppc64-softmmu && make | 
 |  | 
 | Running instructions | 
 | ==================== | 
 |  | 
 | Someone can select the pSeries machine type by running QEMU with the following | 
 | options: | 
 |  | 
 | .. code-block:: bash | 
 |  | 
 |   qemu-system-ppc64 -M pseries <other QEMU arguments> | 
 |  | 
 | sPAPR devices | 
 | ============= | 
 |  | 
 | The sPAPR specification defines a set of para-virtualized devices, which are | 
 | also supported by the pSeries machine in QEMU and can be instantiated with the | 
 | ``-device`` option: | 
 |  | 
 | * ``spapr-vlan`` : a virtual network interface. | 
 | * ``spapr-vscsi`` : a virtual SCSI disk interface. | 
 | * ``spapr-rng`` : a pseudo-device for passing random number generator data to the | 
 |   guest (see the `H_RANDOM hypercall feature | 
 |   <https://wiki.qemu.org/Features/HRandomHypercall>`_ for details). | 
 | * ``spapr-vty``: a virtual teletype. | 
 | * ``spapr-pci-host-bridge``: a PCI host bridge. | 
 | * ``tpm-spapr``: a Trusted Platform Module (TPM). | 
 | * ``spapr-tpm-proxy``: a TPM proxy. | 
 |  | 
 | These are compatible with the devices historically available for use when | 
 | running the IBM PowerVM hypervisor with LPARs. | 
 |  | 
 | However, since these devices have originally been specified with another | 
 | hypervisor and non-Linux guests in mind, you should use the virtio counterparts | 
 | (virtio-net, virtio-blk/scsi and virtio-rng for instance) if possible instead, | 
 | since they will most probably give you better performance with Linux guests in a | 
 | QEMU environment. | 
 |  | 
 | The pSeries machine in QEMU is always instantiated with the following devices: | 
 |  | 
 | * A NVRAM device (``spapr-nvram``). | 
 | * A virtual teletype (``spapr-vty``). | 
 | * A PCI host bridge (``spapr-pci-host-bridge``). | 
 |  | 
 | Hence, it is not needed to add them manually, unless you use the ``-nodefaults`` | 
 | command line option in QEMU. | 
 |  | 
 | In the case of the default ``spapr-nvram`` device, if someone wants to make the | 
 | contents of the NVRAM device persistent, they will need to specify a PFLASH | 
 | device when starting QEMU, i.e. either use | 
 | ``-drive if=pflash,file=<filename>,format=raw`` to set the default PFLASH | 
 | device, or specify one with an ID | 
 | (``-drive if=none,file=<filename>,format=raw,id=pfid``) and pass that ID to the | 
 | NVRAM device with ``-global spapr-nvram.drive=pfid``. | 
 |  | 
 | sPAPR specification | 
 | ------------------- | 
 |  | 
 | The main source of documentation on the sPAPR standard is the [LoPAR]_ document. | 
 | However, documentation specific to QEMU's implementation of the specification | 
 | can  also be found in QEMU documentation: | 
 |  | 
 | .. toctree:: | 
 |    :maxdepth: 1 | 
 |  | 
 |    ../../specs/ppc-spapr-hotplug.rst | 
 |    ../../specs/ppc-spapr-hcalls.rst | 
 |    ../../specs/ppc-spapr-numa.rst | 
 |    ../../specs/ppc-spapr-uv-hcalls.rst | 
 |    ../../specs/ppc-spapr-xive.rst | 
 |  | 
 | Switching between the KVM-PR and KVM-HV kernel module | 
 | ===================================================== | 
 |  | 
 | Currently, there are two implementations of KVM on Power, ``kvm_hv.ko`` and | 
 | ``kvm_pr.ko``. | 
 |  | 
 |  | 
 | If a host supports both KVM modes, and both KVM kernel modules are loaded, it is | 
 | possible to switch between the two modes with the ``kvm-type`` parameter: | 
 |  | 
 | * Use ``qemu-system-ppc64 -M pseries,accel=kvm,kvm-type=PR`` to use the | 
 |   ``kvm_pr.ko`` kernel module. | 
 | * Use ``qemu-system-ppc64 -M pseries,accel=kvm,kvm-type=HV`` to use ``kvm_hv.ko`` | 
 |   instead. | 
 |  | 
 | KVM-PR | 
 | ------ | 
 |  | 
 | KVM-PR uses the so-called **PR**\ oblem state of the PPC CPUs to run the guests, | 
 | i.e. the virtual machine is run in user mode and all privileged instructions | 
 | trap and have to be emulated by the host. That means you can run KVM-PR inside | 
 | a pSeries guest (or a PowerVM LPAR for that matter), and that is where it has | 
 | originated, as historically (prior to POWER7) it was not possible to run Linux | 
 | on hypervisor mode on a Power processor (this function was restricted to | 
 | PowerVM, the IBM proprietary hypervisor). | 
 |  | 
 | Because all privileged instructions are trapped, guests that use a lot of | 
 | privileged instructions run quite slow with KVM-PR. On the other hand, because | 
 | of that, this kernel module can run on pretty much every PPC hardware, and is | 
 | able to emulate a lot of guests CPUs. This module can even be used to run other | 
 | PowerPC guests like an emulated PowerMac. | 
 |  | 
 | As KVM-PR can be run inside a pSeries guest, it can also provide nested | 
 | virtualization capabilities (i.e. running a guest from within a guest). | 
 |  | 
 | It is important to notice that, as KVM-HV provides a much better execution | 
 | performance, maintenance work has been much more focused on it in the past | 
 | years. Maintenance for KVM-PR has been minimal. | 
 |  | 
 | In order to run KVM-PR guests with POWER9 processors, someone will need to start | 
 | QEMU with ``kernel_irqchip=off`` command line option. | 
 |  | 
 | KVM-HV | 
 | ------ | 
 |  | 
 | KVM-HV uses the hypervisor mode of more recent Power processors, that allow | 
 | access to the bare metal hardware directly. Although POWER7 had this capability, | 
 | it was only starting with POWER8 that this was officially supported by IBM. | 
 |  | 
 | Originally, KVM-HV was only available when running on a PowerNV platform (a.k.a. | 
 | Power bare metal). Although it runs on a PowerNV platform, it can only be used | 
 | to start pSeries guests. As the pSeries guest doesn't have access to the | 
 | hypervisor mode of the Power CPU, it wasn't possible to run KVM-HV on a guest. | 
 | This limitation has been lifted, and now it is possible to run KVM-HV inside | 
 | pSeries guests as well, making nested virtualization possible with KVM-HV. | 
 |  | 
 | As KVM-HV has access to privileged instructions, guests that use a lot of these | 
 | can run much faster than with KVM-PR. On the other hand, the guest CPU has to be | 
 | of the same type as the host CPU this way, e.g. it is not possible to specify an | 
 | embedded PPC CPU for the guest with KVM-HV. However, there is at least the | 
 | possibility to run the guest in a backward-compatibility mode of the previous | 
 | CPUs generations, e.g. you can run a POWER7 guest on a POWER8 host by using | 
 | ``-cpu POWER8,compat=power7`` as parameter to QEMU. | 
 |  | 
 | Modules support | 
 | =============== | 
 |  | 
 | As noticed in the sections above, each module can run in a different | 
 | environment. The following table shows with which environment each module can | 
 | run. As long as you are in a supported environment, you can run KVM-PR or KVM-HV | 
 | nested. Combinations not shown in the table are not available. | 
 |  | 
 | +--------------+------------+------+-------------------+----------+--------+ | 
 | | Platform     | Host type  | Bits | Page table format | KVM-HV   | KVM-PR | | 
 | +==============+============+======+===================+==========+========+ | 
 | | PowerNV      | bare metal | 32   | hash              | no       | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix             | N/A      | N/A    | | 
 | |              |            +------+-------------------+----------+--------+ | 
 | |              |            | 64   | hash              | yes      | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix             | yes      | no     | | 
 | +--------------+------------+------+-------------------+----------+--------+ | 
 | | pSeries [1]_ | PowerNV    | 32   | hash              | no       | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix             | N/A      | N/A    | | 
 | |              |            +------+-------------------+----------+--------+ | 
 | |              |            | 64   | hash              | no       | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix             | yes [2]_ | no     | | 
 | |              +------------+------+-------------------+----------+--------+ | 
 | |              | PowerVM    | 32   | hash              | no       | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix             | N/A      | N/A    | | 
 | |              |            +------+-------------------+----------+--------+ | 
 | |              |            | 64   | hash              | no       | yes    | | 
 | |              |            |      +-------------------+----------+--------+ | 
 | |              |            |      | radix [3]_        | no       | yes    | | 
 | +--------------+------------+------+-------------------+----------+--------+ | 
 |  | 
 | .. [1] On POWER9 DD2.1 processors, the page table format on the host and guest | 
 |    must be the same. | 
 |  | 
 | .. [2] KVM-HV cannot run nested on POWER8 machines. | 
 |  | 
 | .. [3] Introduced on Power10 machines. | 
 |  | 
 |  | 
 | .. _power-papr-protected-execution-facility-pef: | 
 |  | 
 | POWER (PAPR) Protected Execution Facility (PEF) | 
 | ----------------------------------------------- | 
 |  | 
 | Protected Execution Facility (PEF), also known as Secure Guest support | 
 | is a feature found on IBM POWER9 and POWER10 processors. | 
 |  | 
 | If a suitable firmware including an Ultravisor is installed, it adds | 
 | an extra memory protection mode to the CPU.  The ultravisor manages a | 
 | pool of secure memory which cannot be accessed by the hypervisor. | 
 |  | 
 | When this feature is enabled in QEMU, a guest can use ultracalls to | 
 | enter "secure mode".  This transfers most of its memory to secure | 
 | memory, where it cannot be eavesdropped by a compromised hypervisor. | 
 |  | 
 | Launching | 
 | ^^^^^^^^^ | 
 |  | 
 | To launch a guest which will be permitted to enter PEF secure mode:: | 
 |  | 
 |   $ qemu-system-ppc64 \ | 
 |       -object pef-guest,id=pef0 \ | 
 |       -machine confidential-guest-support=pef0 \ | 
 |       ... | 
 |  | 
 | Live Migration | 
 | ^^^^^^^^^^^^^^ | 
 |  | 
 | Live migration is not yet implemented for PEF guests.  For | 
 | consistency, QEMU currently prevents migration if the PEF feature is | 
 | enabled, whether or not the guest has actually entered secure mode. | 
 |  | 
 |  | 
 | Maintainer contact information | 
 | ============================== | 
 |  | 
 | Cédric Le Goater <clg@kaod.org> | 
 |  | 
 | Daniel Henrique Barboza <danielhb413@gmail.com> | 
 |  | 
 | .. [LoPAR] `Linux on Power Architecture Reference document (LoPAR) revision | 
 |    2.9 <https://openpowerfoundation.org/wp-content/uploads/2020/07/LoPAR-20200812.pdf>`_. |