123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- .. SPDX-License-Identifier: GPL-2.0
- =============================
- The s390 DIAGNOSE call on KVM
- =============================
- KVM on s390 supports the DIAGNOSE call for making hypercalls, both for
- native hypercalls and for selected hypercalls found on other s390
- hypervisors.
- Note that bits are numbered as by the usual s390 convention (most significant
- bit on the left).
- General remarks
- ---------------
- DIAGNOSE calls by the guest cause a mandatory intercept. This implies
- all supported DIAGNOSE calls need to be handled by either KVM or its
- userspace.
- All DIAGNOSE calls supported by KVM use the RS-a format::
- --------------------------------------
- | '83' | R1 | R3 | B2 | D2 |
- --------------------------------------
- 0 8 12 16 20 31
- The second-operand address (obtained by the base/displacement calculation)
- is not used to address data. Instead, bits 48-63 of this address specify
- the function code, and bits 0-47 are ignored.
- The supported DIAGNOSE function codes vary by the userspace used. For
- DIAGNOSE function codes not specific to KVM, please refer to the
- documentation for the s390 hypervisors defining them.
- DIAGNOSE function code 'X'500' - KVM virtio functions
- -----------------------------------------------------
- If the function code specifies 0x500, various virtio-related functions
- are performed.
- General register 1 contains the virtio subfunction code. Supported
- virtio subfunctions depend on KVM's userspace. Generally, userspace
- provides either s390-virtio (subcodes 0-2) or virtio-ccw (subcode 3).
- Upon completion of the DIAGNOSE instruction, general register 2 contains
- the function's return code, which is either a return code or a subcode
- specific value.
- Subcode 0 - s390-virtio notification and early console printk
- Handled by userspace.
- Subcode 1 - s390-virtio reset
- Handled by userspace.
- Subcode 2 - s390-virtio set status
- Handled by userspace.
- Subcode 3 - virtio-ccw notification
- Handled by either userspace or KVM (ioeventfd case).
- General register 2 contains a subchannel-identification word denoting
- the subchannel of the virtio-ccw proxy device to be notified.
- General register 3 contains the number of the virtqueue to be notified.
- General register 4 contains a 64bit identifier for KVM usage (the
- kvm_io_bus cookie). If general register 4 does not contain a valid
- identifier, it is ignored.
- After completion of the DIAGNOSE call, general register 2 may contain
- a 64bit identifier (in the kvm_io_bus cookie case), or a negative
- error value, if an internal error occurred.
- See also the virtio standard for a discussion of this hypercall.
- DIAGNOSE function code 'X'501 - KVM breakpoint
- ----------------------------------------------
- If the function code specifies 0x501, breakpoint functions may be performed.
- This function code is handled by userspace.
- This diagnose function code has no subfunctions and uses no parameters.
- DIAGNOSE function code 'X'9C - Voluntary Time Slice Yield
- ---------------------------------------------------------
- General register 1 contains the target CPU address.
- In a guest of a hypervisor like LPAR, KVM or z/VM using shared host CPUs,
- DIAGNOSE with function code 0x9c may improve system performance by
- yielding the host CPU on which the guest CPU is running to be assigned
- to another guest CPU, preferably the logical CPU containing the specified
- target CPU.
- DIAG 'X'9C forwarding
- +++++++++++++++++++++
- The guest may send a DIAGNOSE 0x9c in order to yield to a certain
- other vcpu. An example is a Linux guest that tries to yield to the vcpu
- that is currently holding a spinlock, but not running.
- However, on the host the real cpu backing the vcpu may itself not be
- running.
- Forwarding the DIAGNOSE 0x9c initially sent by the guest to yield to
- the backing cpu will hopefully cause that cpu, and thus subsequently
- the guest's vcpu, to be scheduled.
- diag9c_forwarding_hz
- KVM kernel parameter allowing to specify the maximum number of DIAGNOSE
- 0x9c forwarding per second in the purpose of avoiding a DIAGNOSE 0x9c
- forwarding storm.
- A value of 0 turns the forwarding off.
|