s390x update:

- enhance s390x documentation
 - allow ORBs without prefetch specified for vfio-ccw
 - various cleanups and enhancements
 -----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEEw9DWbcNiT/aowBjO3s9rk8bwL68FAl7aZZsSHGNvaHVja0By
 ZWRoYXQuY29tAAoJEN7Pa5PG8C+vf2MP/Rzvi7vVtykq/nA8oX6tQ7gNm+eF8pF/
 URZ5eM11lDFsp4QE8SfTx548uTrr97NniI8AZZPSZSDozcdw7pM8DEqjutgq40eB
 nrYiXma9p5i2f6QTGsirD9A8Tsyi6vNONVRL1KRr/Ihd/B9V3o7eBLvDLh3xKrj8
 2TxdXWaVwZrG8jvKjH+wDRGB1GktDL9q7vYaEowYvXf7P48kPCP7QiE9pw8O9XAh
 0rdR+eCVg6IzM5LxxyUu60v+b1bOvxE0wvEgKpFpS+oKVlTt8GPwjDzOMZMvlI61
 qGfJRg5+dr1c587QFtfT7oSlNHdI5AoeEUtEgFrUwR4WKKc8J5FA8DhTBQm154OZ
 kk3tFOYJ1LKWTP7Q486Jn3yPE9qy2MdnHod4GY3LFrCuPWPEsySR4l4gs28BPPu3
 7j0QuqZk/J4xoHMCdIwn7tk7XNYTG3ggLCGu5EmkWtYl8+Lqo3QtYgNLno/PijwU
 PutLRb5y1/0Jku3WS1o5FjGRIq8QMacekJlME2k6/KyPpjXT2T5/WReTftnbYi1O
 q67wlIf7FVc+/eWEh4BqQFwtWJ1u1sHLelj5vdl17Nrmf8dY+ED8v0QtlT1CauOi
 OJRCKtV//uKHNFIC1ZXuuo3FA7gyM55ws96kaMjbXpS2a1Xgan4R3eT+BZwcRvhZ
 80jjQ/yjtLY+
 =O5n4
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20200605' into staging

s390x update:
- enhance s390x documentation
- allow ORBs without prefetch specified for vfio-ccw
- various cleanups and enhancements

# gpg: Signature made Fri 05 Jun 2020 16:32:43 BST
# gpg:                using RSA key C3D0D66DC3624FF6A8C018CEDECF6B93C6F02FAF
# gpg:                issuer "cohuck@redhat.com"
# gpg: Good signature from "Cornelia Huck <conny@cornelia-huck.de>" [marginal]
# gpg:                 aka "Cornelia Huck <huckc@linux.vnet.ibm.com>" [full]
# gpg:                 aka "Cornelia Huck <cornelia.huck@de.ibm.com>" [full]
# gpg:                 aka "Cornelia Huck <cohuck@kernel.org>" [marginal]
# gpg:                 aka "Cornelia Huck <cohuck@redhat.com>" [marginal]
# Primary key fingerprint: C3D0 D66D C362 4FF6 A8C0  18CE DECF 6B93 C6F0 2FAF

* remotes/cohuck/tags/s390x-20200605:
  target/s390x: Restrict system-mode declarations
  target/s390x/helper: Clean ifdef'ry
  target/s390x: Only compile decode_basedisp() on system-mode
  MAINTAINERS: add Thomas as additional s390x maintainer
  docs/s390x: document vfio-ccw
  vfio-ccw: allow non-prefetch ORBs
  docs/s390x: document 3270
  docs/s390x: document the virtual css
  s390x: pv: Fix KVM_PV_PREP_RESET command wrapper name
  s390x/kvm: help valgrind in several places

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2020-06-05 17:45:59 +01:00
commit 175198ad91
12 changed files with 219 additions and 26 deletions

View File

@ -85,6 +85,7 @@ Architecture support
--------------------
S390 general architecture support
M: Cornelia Huck <cohuck@redhat.com>
M: Thomas Huth <thuth@redhat.com>
S: Supported
F: default-configs/s390x-softmmu.mak
F: gdb-xml/s390*.xml

View File

@ -0,0 +1,32 @@
3270 devices
============
QEMU supports connecting an external 3270 terminal emulator (such as
``x3270``) to make a single 3270 device available to a guest. Note that this
supports basic features only.
To provide a 3270 device to a guest, create a ``x-terminal3270`` linked to
a ``tn3270`` chardev. The guest will see a 3270 channel device. In order
to actually be able to use it, attach the ``x3270`` emulator to the chardev.
Example configuration
---------------------
* Add a ``tn3270`` chardev and a ``x-terminal3270`` to the QEMU command line::
-chardev socket,id=char_0,host=0.0.0.0,port=2300,nowait,server,tn3270
-device x-terminal3270,chardev=char_0,devno=fe.0.000a,id=terminal_0
* Start the guest. In the guest, use ``chccwdev -e 0.0.000a`` to enable
the device.
* On the host, start the ``x3270`` emulator::
x3270 <host>:2300
* In the guest, locate the 3270 device node under ``/dev/3270/`` (say,
``tty1``) and start a getty on it::
systemctl start serial-getty@3270-tty1.service
This should get you an addtional tty for logging into the guest.

86
docs/system/s390x/css.rst Normal file
View File

@ -0,0 +1,86 @@
The virtual channel subsystem
=============================
QEMU implements a virtual channel subsystem with subchannels, (mostly
functionless) channel paths, and channel devices (virtio-ccw, 3270, and
devices passed via vfio-ccw). It supports multiple subchannel sets (MSS) and
multiple channel subsystems extended (MCSS-E).
All channel devices support the ``devno`` property, which takes a parameter
in the form ``<cssid>.<ssid>.<device number>``.
The default channel subsystem image id (``<cssid>``) is ``0xfe``. Devices in
there will show up in channel subsystem image ``0`` to guests that do not
enable MCSS-E. Note that devices with a different cssid will not be visible
if the guest OS does not enable MCSS-E (which is true for all supported guest
operating systems today).
Supported values for the subchannel set id (``<ssid>``) range from ``0-3``.
Devices with a ssid that is not ``0`` will not be visible if the guest OS
does not enable MSS (any Linux version that supports virtio also enables MSS).
Any device may be put into any subchannel set, there is no restriction by
device type.
The device number can range from ``0-0xffff``.
If the ``devno`` property is not specified for a device, QEMU will choose the
next free device number in subchannel set 0, skipping to the next subchannel
set if no more device numbers are free.
QEMU places a device at the first free subchannel in the specified subchannel
set. If a device is hotunplugged and later replugged, it may appear at a
different subchannel. (This is similar to how z/VM works.)
Examples
--------
* a virtio-net device, cssid/ssid/devno automatically assigned::
-device virtio-net-ccw
In a Linux guest (without default devices and no other devices specified
prior to this one), this will show up as ``0.0.0000`` under subchannel
``0.0.0000``.
The auto-assigned-properties in QEMU (as seen via e.g. ``info qtree``)
would be ``dev_id = "fe.0.0000"`` and ``subch_id = "fe.0.0000"``.
* a virtio-rng device in subchannel set ``0``::
-device virtio-rng-ccw,devno=fe.0.0042
If added to the same Linux guest as above, it would show up as ``0.0.0042``
under subchannel ``0.0.0001``.
The properties for the device would be ``dev_id = "fe.0.0042"`` and
``subch_id = "fe.0.0001"``.
* a virtio-gpu device in subchannel set ``2``::
-device virtio-gpu-ccw,devno=fe.2.1111
If added to the same Linux guest as above, it would show up as ``0.2.1111``
under subchannel ``0.2.0000``.
The properties for the device would be ``dev_id = "fe.2.1111"`` and
``subch_id = "fe.2.0000"``.
* a virtio-mouse device in a non-standard channel subsystem image::
-device virtio-mouse-ccw,devno=2.0.2222
This would not show up in a standard Linux guest.
The properties for the device would be ``dev_id = "2.0.2222"`` and
``subch_id = "2.0.0000"``.
* a virtio-keyboard device in another non-standard channel subsystem image::
-device virtio-keyboard-ccw,devno=0.0.1234
This would not show up in a standard Linux guest, either, as ``0`` is not
the standard channel subsystem image id.
The properties for the device would be ``dev_id = "0.0.1234"`` and
``subch_id = "0.0.0000"``.

View File

@ -0,0 +1,77 @@
Subchannel passthrough via vfio-ccw
===================================
vfio-ccw (based upon the mediated vfio device infrastructure) allows to
make certain I/O subchannels and their devices available to a guest. The
host will not interact with those subchannels/devices any more.
Note that while vfio-ccw should work with most non-QDIO devices, only ECKD
DASDs have really been tested.
Example configuration
---------------------
Step 1: configure the host device
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
As every mdev is identified by a uuid, the first step is to obtain one::
[root@host ~]# uuidgen
7e270a25-e163-4922-af60-757fc8ed48c6
Note: it is recommended to use the ``mdevctl`` tool for actually configuring
the host device.
To define the same device as configured below to be started
automatically, use
::
[root@host ~]# driverctl -b css set-override 0.0.0313 vfio_ccw
[root@host ~]# mdevctl define -u 7e270a25-e163-4922-af60-757fc8ed48c6 \
-p 0.0.0313 -t vfio-ccw_io -a
If using ``mdevctl`` is not possible or wanted, follow the manual procedure
below.
* Locate the subchannel for the device (in this example, ``0.0.2b09``)::
[root@host ~]# lscss | grep 0.0.2b09 | awk '{print $2}'
0.0.0313
* Unbind the subchannel (in this example, ``0.0.0313``) from the standard
I/O subchannel driver and bind it to the vfio-ccw driver::
[root@host ~]# echo 0.0.0313 > /sys/bus/css/devices/0.0.0313/driver/unbind
[root@host ~]# echo 0.0.0313 > /sys/bus/css/drivers/vfio_ccw/bind
* Create the mediated device (identified by the uuid)::
[root@host ~]# echo "7e270a25-e163-4922-af60-757fc8ed48c6" > \
/sys/bus/css/devices/0.0.0313/mdev_supported_types/vfio_ccw-io/create
Step 2: configure QEMU
~~~~~~~~~~~~~~~~~~~~~~
* Reference the created mediated device and (optionally) pick a device id to
be presented in the guest (here, ``fe.0.1234``, which will end up visible
in the guest as ``0.0.1234``::
-device vfio-ccw,devno=fe.0.1234,sysfsdev=\
/sys/bus/mdev/devices/7e270a25-e163-4922-af60-757fc8ed48c6
* Start the guest. The device (here, ``0.0.1234``) should now be usable::
[root@guest ~]# lscss -d 0.0.1234
Device Subchan. DevType CU Type Use PIM PAM POM CHPID
----------------------------------------------------------------------
0.0.1234 0.0.0007 3390/0e 3990/e9 f0 f0 ff 1a2a3a0a 00000000
[root@guest ~]# chccwdev -e 0.0.1234
Setting device 0.0.1234 online
Done
[root@guest ~]# dmesg -t
(...)
dasd-eckd 0.0.1234: A channel path to the device has become operational
dasd-eckd 0.0.1234: New DASD 3390/0E (CU 3990/01) with 10017 cylinders, 15 heads, 224 sectors
dasd-eckd 0.0.1234: DASD with 4 KB/block, 7212240 KB total size, 48 KB/track, compatible disk layout
dasda:VOL1/ 0X2B09: dasda1

View File

@ -23,6 +23,9 @@ or vfio-ap is also available.
.. toctree::
s390x/vfio-ap
s390x/css
s390x/3270
s390x/vfio-ccw
Architectural features
======================

View File

@ -88,7 +88,7 @@ int s390_pv_unpack(uint64_t addr, uint64_t size, uint64_t tweak)
return s390_pv_cmd(KVM_PV_UNPACK, &args);
}
void s390_pv_perf_clear_reset(void)
void s390_pv_prep_reset(void)
{
s390_pv_cmd_exit(KVM_PV_PREP_RESET, NULL);
}

View File

@ -401,7 +401,7 @@ static void s390_pv_prepare_reset(S390CcwMachineState *ms)
s390_cpu_set_state(S390_CPU_STATE_STOPPED, S390_CPU(cs));
}
s390_pv_unshare();
s390_pv_perf_clear_reset();
s390_pv_prep_reset();
}
static void s390_machine_reset(MachineState *machine)

View File

@ -74,16 +74,9 @@ static IOInstEnding vfio_ccw_handle_request(SubchDev *sch)
struct ccw_io_region *region = vcdev->io_region;
int ret;
if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH)) {
if (!(vcdev->force_orb_pfch)) {
warn_once_pfch(vcdev, sch, "requires PFCH flag set");
sch_gen_unit_exception(sch);
css_inject_io_interrupt(sch);
return IOINST_CC_EXPECTED;
} else {
sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
warn_once_pfch(vcdev, sch, "PFCH flag forced");
}
if (!(sch->orb.ctrl0 & ORB_CTRL0_MASK_PFCH) && vcdev->force_orb_pfch) {
sch->orb.ctrl0 |= ORB_CTRL0_MASK_PFCH;
warn_once_pfch(vcdev, sch, "PFCH flag forced");
}
QEMU_BUILD_BUG_ON(sizeof(region->orb_area) != sizeof(ORB));

View File

@ -39,7 +39,7 @@ int s390_pv_vm_enable(void);
void s390_pv_vm_disable(void);
int s390_pv_set_sec_parms(uint64_t origin, uint64_t length);
int s390_pv_unpack(uint64_t addr, uint64_t size, uint64_t tweak);
void s390_pv_perf_clear_reset(void);
void s390_pv_prep_reset(void);
int s390_pv_verify(void);
void s390_pv_unshare(void);
void s390_pv_inject_reset_error(CPUState *cs);
@ -49,7 +49,7 @@ static inline int s390_pv_vm_enable(void) { return 0; }
static inline void s390_pv_vm_disable(void) {}
static inline int s390_pv_set_sec_parms(uint64_t origin, uint64_t length) { return 0; }
static inline int s390_pv_unpack(uint64_t addr, uint64_t size, uint64_t tweak) { return 0; }
static inline void s390_pv_perf_clear_reset(void) {}
static inline void s390_pv_prep_reset(void) {}
static inline int s390_pv_verify(void) { return 0; }
static inline void s390_pv_unshare(void) {}
static inline void s390_pv_inject_reset_error(CPUState *cs) {};

View File

@ -42,9 +42,6 @@ void s390x_cpu_timer(void *opaque)
{
cpu_inject_cpu_timer((S390CPU *) opaque);
}
#endif
#ifndef CONFIG_USER_ONLY
hwaddr s390_cpu_get_phys_page_debug(CPUState *cs, vaddr vaddr)
{
@ -98,14 +95,12 @@ void s390_handle_wait(S390CPU *cpu)
CPUState *cs = CPU(cpu);
if (s390_cpu_halt(cpu) == 0) {
#ifndef CONFIG_USER_ONLY
if (is_special_wait_psw(cpu->env.psw.addr)) {
qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
} else {
cpu->env.crash_reason = S390_CRASH_REASON_DISABLED_WAIT;
qemu_system_guest_panicked(cpu_get_crash_info(cs));
}
#endif
}
}

View File

@ -204,6 +204,8 @@ enum cc_op {
CC_OP_MAX
};
#ifndef CONFIG_USER_ONLY
static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
uint8_t *ar)
{
@ -225,6 +227,8 @@ static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
/* Base/displacement are at the same locations. */
#define decode_basedisp_rs decode_basedisp_s
#endif /* CONFIG_USER_ONLY */
/* arch_dump.c */
int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
int cpuid, void *opaque);
@ -232,9 +236,11 @@ int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
/* cc_helper.c */
const char *cc_name(enum cc_op cc_op);
void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst,
uint64_t vr);
#ifndef CONFIG_USER_ONLY
void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
#endif /* CONFIG_USER_ONLY */
/* cpu.c */
@ -299,18 +305,18 @@ void s390_cpu_gdb_init(CPUState *cs);
/* helper.c */
void s390_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
void do_restart_interrupt(CPUS390XState *env);
#ifndef CONFIG_USER_ONLY
uint64_t get_psw_mask(CPUS390XState *env);
void s390_cpu_recompute_watchpoints(CPUState *cs);
void s390x_tod_timer(void *opaque);
void s390x_cpu_timer(void *opaque);
void do_restart_interrupt(CPUS390XState *env);
void s390_handle_wait(S390CPU *cpu);
hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
#define S390_STORE_STATUS_DEF_ADDR offsetof(LowCore, floating_pt_save_area)
int s390_store_status(S390CPU *cpu, hwaddr addr, bool store_arch);
int s390_store_adtl_status(S390CPU *cpu, hwaddr addr, hwaddr len);
#ifndef CONFIG_USER_ONLY
LowCore *cpu_map_lowcore(CPUS390XState *env);
void cpu_unmap_lowcore(LowCore *lowcore);
#endif /* CONFIG_USER_ONLY */

View File

@ -2165,7 +2165,7 @@ int kvm_arch_msi_data_to_gsi(uint32_t data)
static int query_cpu_subfunc(S390FeatBitmap features)
{
struct kvm_s390_vm_cpu_subfunc prop;
struct kvm_s390_vm_cpu_subfunc prop = {};
struct kvm_device_attr attr = {
.group = KVM_S390_VM_CPU_MODEL,
.attr = KVM_S390_VM_CPU_MACHINE_SUBFUNC,
@ -2292,7 +2292,7 @@ static int kvm_to_feat[][2] = {
static int query_cpu_feat(S390FeatBitmap features)
{
struct kvm_s390_vm_cpu_feat prop;
struct kvm_s390_vm_cpu_feat prop = {};
struct kvm_device_attr attr = {
.group = KVM_S390_VM_CPU_MODEL,
.attr = KVM_S390_VM_CPU_MACHINE_FEAT,