mirror of https://github.com/xemu-project/xemu.git
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:
commit
175198ad91
|
@ -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
|
||||
|
|
|
@ -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.
|
|
@ -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"``.
|
|
@ -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
|
|
@ -23,6 +23,9 @@ or vfio-ap is also available.
|
|||
|
||||
.. toctree::
|
||||
s390x/vfio-ap
|
||||
s390x/css
|
||||
s390x/3270
|
||||
s390x/vfio-ccw
|
||||
|
||||
Architectural features
|
||||
======================
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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) {};
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue