Jump to: navigation, search

QEMU s390x Guest Support

QEMU supports running s390x (aka zSystems aka mainframe) guests via the s390-virtio-ccw machine, with kvm or tcg acceleration.

Supported Devices

The s390-virtio-ccw machine emulates a virtual channel subsystem. Currently, only virtio-ccw proxy devices (for most virtio device types) are supported.

As a console device, supported types are SCLP VT220-compatible (preferred), SCLP line-mode or virtio-serial console.

Guest Operating Systems

Currently, the only supported guest operation system is Linux.

When using kvm, you should be able to use any recent distribution that you would be able to run on your host as well (RHEL, SLES, Ubuntu, Debian, Fedora). Older versions may not yet support virtio-ccw.

When using tcg with version 2.11 or before, the machine emulated is at an older level not supported on any of the recent enterprise distributions. Your best bet is probably using Debian.

When using tcg with version 2.12 or newer, the machine emulated should be good enough to run kernel 4.x based distributions. At least Fedora 26/27 and Ubuntu 18.04 (current build) have been reported to work.

Build Directions

 ./configure --target-list=s390x-softmmu && make

Minimal command-line

 qemu-system-s390x -M s390-ccw-virtio -kernel <kernel file name> -initrd <initrd file name> -m 512 -nographic

This command line will start a machine with the default SCLP VT220-compatible console. If you want any actual I/O devices, you need to add the respective virtio-*-ccw devices.

If you do not have a kernel and initrd image yet, you can have a try with the latest version from Debian stable for example:

I/O devices

The virtio-ccw transport provides access to paravirtualized virtio devices. They are configured in a similar way to virtio-pci devices. For example,

 -drive file=/dev/dasdb,if=none,id=drive-virtio-disk0,format=raw,serial=ccwdasd1,cache=none \
 -device virtio-blk-ccw,devno=fe.0.0001,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1,scsi=off

will add a virtio-blk device that uses the host disk /dev/dasdb as backing and is seen in the guest as the channel device 0.0.0001.

Multiple subchannel sets are supported. For example,

 -device virtio-balloon-ccw,devno=fe.1.0101

will add a virtio-ballon device that the guest sees as the channel device 0.1.0101.

A note on PCI support

PCI devices are available on s390x, but they are not quite what you know from other platforms.

  • PCI devices on s390x are not accessed via memory mapped I/O, but via special instructions that require kernel mode.
  • No PCI topology; PCI functions are instead identified via a fid (function identifier) and a uid (unique identifier).
    • Any topology information you provide on the command line is basically invisible to the guest, as the device discovery instructions only return fid and uid.
    • You can specify fid and uid as properties of a zpci device that needs to be linked to the pci device.

As of 2.10, only devices passed through via vfio-pci have a chance of working. Prior to 2.10 (this includes compat machines), you may be able to add devices, but Linux guests will not use them.

PCI feature bits

PCI support is indicated as a cpu feature; Linux guests also test for the AIS cpu feature (which requires support in the KVM kernel module; 4.12 or later). The emulated machine needs to be a zEC12 or later; for machines prior to z14, the bits need to be explicitly enabled. For example,

 -cpu zEC12-base,zpci=on,aen=on,ais=on

turns on the PCI support, adapter-event notification and adapter interrupt suppression bits.

If you try to specify a PCI device for a machine without the PCI feature bit, for example

 -cpu zEC12-base,zpci=off (...) -device virtio-net-pci

qemu (2.11 or later) will fail with

 qemu-system-s390x: -device virtio-net-pci: No 'PCI' bus found for device 'virtio-net-pci'

This can be a bit confusing; but the root cause is the missing PCI feature bit.


TCG (non-KVM)

Richard Henderson
Alexander Graf

KVM and virtio-ccw

Christian Borntraeger
Cornelia Huck
Alexander Graf


Wikipedia page for the System 390
Installing Ubuntu Linux
Installing SUSE Linux
Installing s390x emulator for Ubuntu
Debian S/390 port
Fedora s390x port