2017-11-24 14:00:38 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 */
|
2008-03-25 17:47:20 +00:00
|
|
|
/*
|
2012-07-20 09:15:04 +00:00
|
|
|
* definition for kernel virtual machines on s390
|
2008-03-25 17:47:20 +00:00
|
|
|
*
|
2018-01-23 12:28:40 +00:00
|
|
|
* Copyright IBM Corp. 2008, 2018
|
2008-03-25 17:47:20 +00:00
|
|
|
*
|
|
|
|
* Author(s): Carsten Otte <cotte@de.ibm.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef ASM_KVM_HOST_H
|
|
|
|
#define ASM_KVM_HOST_H
|
2014-08-29 12:01:17 +00:00
|
|
|
|
|
|
|
#include <linux/types.h>
|
2009-05-12 15:21:49 +00:00
|
|
|
#include <linux/hrtimer.h>
|
|
|
|
#include <linux/interrupt.h>
|
2014-08-29 12:01:17 +00:00
|
|
|
#include <linux/kvm_types.h>
|
2008-03-25 17:47:20 +00:00
|
|
|
#include <linux/kvm_host.h>
|
2013-10-07 14:13:44 +00:00
|
|
|
#include <linux/kvm.h>
|
2016-02-17 20:53:33 +00:00
|
|
|
#include <linux/seqlock.h>
|
2019-05-21 15:34:34 +00:00
|
|
|
#include <linux/module.h>
|
2008-03-25 17:47:20 +00:00
|
|
|
#include <asm/debug.h>
|
2009-09-11 08:29:04 +00:00
|
|
|
#include <asm/cpu.h>
|
2015-10-06 10:25:59 +00:00
|
|
|
#include <asm/fpu/api.h>
|
2013-07-15 11:36:01 +00:00
|
|
|
#include <asm/isc.h>
|
2016-11-29 06:17:55 +00:00
|
|
|
#include <asm/guarded_storage.h>
|
2008-03-25 17:47:20 +00:00
|
|
|
|
2015-04-23 14:09:06 +00:00
|
|
|
#define KVM_S390_BSCA_CPU_SLOTS 64
|
|
|
|
#define KVM_S390_ESCA_CPU_SLOTS 248
|
2016-08-08 20:39:32 +00:00
|
|
|
#define KVM_MAX_VCPUS 255
|
2012-12-10 17:33:09 +00:00
|
|
|
#define KVM_USER_MEM_SLOTS 32
|
2008-03-25 17:47:20 +00:00
|
|
|
|
2013-07-15 11:36:01 +00:00
|
|
|
/*
|
|
|
|
* These seem to be used for allocating ->chip in the routing table,
|
|
|
|
* which we don't use. 4096 is an out-of-thin-air value. If we need
|
|
|
|
* to look at ->chip later on, we'll need to revisit this.
|
|
|
|
*/
|
|
|
|
#define KVM_NR_IRQCHIPS 1
|
|
|
|
#define KVM_IRQCHIP_NUM_PINS 4096
|
2019-05-15 07:59:08 +00:00
|
|
|
#define KVM_HALT_POLL_NS_DEFAULT 50000
|
2013-07-15 11:36:01 +00:00
|
|
|
|
2016-01-07 14:05:10 +00:00
|
|
|
/* s390-specific vcpu->requests bit members */
|
2017-06-04 12:43:51 +00:00
|
|
|
#define KVM_REQ_ENABLE_IBS KVM_ARCH_REQ(0)
|
|
|
|
#define KVM_REQ_DISABLE_IBS KVM_ARCH_REQ(1)
|
|
|
|
#define KVM_REQ_ICPT_OPEREXC KVM_ARCH_REQ(2)
|
2017-06-30 10:38:26 +00:00
|
|
|
#define KVM_REQ_START_MIGRATION KVM_ARCH_REQ(3)
|
|
|
|
#define KVM_REQ_STOP_MIGRATION KVM_ARCH_REQ(4)
|
2018-09-25 23:16:17 +00:00
|
|
|
#define KVM_REQ_VSIE_RESTART KVM_ARCH_REQ(5)
|
2016-01-07 14:05:10 +00:00
|
|
|
|
2014-10-14 13:29:30 +00:00
|
|
|
#define SIGP_CTRL_C 0x80
|
|
|
|
#define SIGP_CTRL_SCN_MASK 0x3f
|
2014-02-21 07:59:59 +00:00
|
|
|
|
2015-04-23 14:09:06 +00:00
|
|
|
union bsca_sigp_ctrl {
|
|
|
|
__u8 value;
|
|
|
|
struct {
|
|
|
|
__u8 c : 1;
|
|
|
|
__u8 r : 1;
|
|
|
|
__u8 scn : 6;
|
|
|
|
};
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2015-04-23 14:09:06 +00:00
|
|
|
|
|
|
|
union esca_sigp_ctrl {
|
|
|
|
__u16 value;
|
|
|
|
struct {
|
|
|
|
__u8 c : 1;
|
|
|
|
__u8 reserved: 7;
|
|
|
|
__u8 scn;
|
|
|
|
};
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2015-04-23 14:09:06 +00:00
|
|
|
|
|
|
|
struct esca_entry {
|
|
|
|
union esca_sigp_ctrl sigp_ctrl;
|
|
|
|
__u16 reserved1[3];
|
|
|
|
__u64 sda;
|
|
|
|
__u64 reserved2[6];
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2015-04-23 14:09:06 +00:00
|
|
|
|
|
|
|
struct bsca_entry {
|
2014-10-14 13:29:30 +00:00
|
|
|
__u8 reserved0;
|
2015-04-23 14:09:06 +00:00
|
|
|
union bsca_sigp_ctrl sigp_ctrl;
|
2014-10-14 13:29:30 +00:00
|
|
|
__u16 reserved[3];
|
2008-03-25 17:47:20 +00:00
|
|
|
__u64 sda;
|
|
|
|
__u64 reserved2[2];
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2008-03-25 17:47:20 +00:00
|
|
|
|
2014-01-10 13:33:28 +00:00
|
|
|
union ipte_control {
|
|
|
|
unsigned long val;
|
|
|
|
struct {
|
|
|
|
unsigned long k : 1;
|
|
|
|
unsigned long kh : 31;
|
|
|
|
unsigned long kg : 32;
|
|
|
|
};
|
|
|
|
};
|
2008-03-25 17:47:20 +00:00
|
|
|
|
2015-04-23 14:09:06 +00:00
|
|
|
struct bsca_block {
|
2014-01-10 13:33:28 +00:00
|
|
|
union ipte_control ipte_control;
|
2008-03-25 17:47:20 +00:00
|
|
|
__u64 reserved[5];
|
|
|
|
__u64 mcn;
|
|
|
|
__u64 reserved2;
|
2015-04-23 14:09:06 +00:00
|
|
|
struct bsca_entry cpu[KVM_S390_BSCA_CPU_SLOTS];
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2008-03-25 17:47:20 +00:00
|
|
|
|
2015-04-23 14:09:06 +00:00
|
|
|
struct esca_block {
|
|
|
|
union ipte_control ipte_control;
|
|
|
|
__u64 reserved1[7];
|
|
|
|
__u64 mcn[4];
|
|
|
|
__u64 reserved2[20];
|
|
|
|
struct esca_entry cpu[KVM_S390_ESCA_CPU_SLOTS];
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2015-04-23 14:09:06 +00:00
|
|
|
|
KVM: s390: Backup the guest's machine check info
When a machine check happens in the guest, related mcck info (mcic,
external damage code, ...) is stored in the vcpu's lowcore on the host.
Then the machine check handler's low-level part is executed, followed
by the high-level part.
If the high-level part's execution is interrupted by a new machine check
happening on the same vcpu on the host, the mcck info in the lowcore is
overwritten with the new machine check's data.
If the high-level part's execution is scheduled to a different cpu,
the mcck info in the lowcore is uncertain.
Therefore, for both cases, the further reinjection to the guest will use
the wrong data.
Let's backup the mcck info in the lowcore to the sie page
for further reinjection, so that the right data will be used.
Add new member into struct sie_page to store related machine check's
info of mcic, failing storage address and external damage code.
Signed-off-by: QingFeng Hao <haoqf@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
2017-06-07 09:41:19 +00:00
|
|
|
/*
|
|
|
|
* This struct is used to store some machine check info from lowcore
|
|
|
|
* for machine checks that happen while the guest is running.
|
|
|
|
* This info in host's lowcore might be overwritten by a second machine
|
|
|
|
* check from host when host is in the machine check's high-level handling.
|
|
|
|
* The size is 24 bytes.
|
|
|
|
*/
|
|
|
|
struct mcck_volatile_info {
|
|
|
|
__u64 mcic;
|
|
|
|
__u64 failing_storage_address;
|
|
|
|
__u32 ext_damage_code;
|
|
|
|
__u32 reserved;
|
|
|
|
};
|
|
|
|
|
2020-01-31 10:02:01 +00:00
|
|
|
#define CR0_INITIAL_MASK (CR0_UNUSED_56 | CR0_INTERRUPT_KEY_SUBMASK | \
|
|
|
|
CR0_MEASUREMENT_ALERT_SUBMASK)
|
|
|
|
#define CR14_INITIAL_MASK (CR14_UNUSED_32 | CR14_UNUSED_33 | \
|
|
|
|
CR14_EXTERNAL_DAMAGE_SUBMASK)
|
|
|
|
|
2011-11-17 10:00:41 +00:00
|
|
|
#define CPUSTAT_STOPPED 0x80000000
|
2008-03-25 17:47:20 +00:00
|
|
|
#define CPUSTAT_WAIT 0x10000000
|
|
|
|
#define CPUSTAT_ECALL_PEND 0x08000000
|
|
|
|
#define CPUSTAT_STOP_INT 0x04000000
|
|
|
|
#define CPUSTAT_IO_INT 0x02000000
|
|
|
|
#define CPUSTAT_EXT_INT 0x01000000
|
|
|
|
#define CPUSTAT_RUNNING 0x00800000
|
|
|
|
#define CPUSTAT_RETAINED 0x00400000
|
|
|
|
#define CPUSTAT_TIMING_SUB 0x00020000
|
|
|
|
#define CPUSTAT_SIE_SUB 0x00010000
|
|
|
|
#define CPUSTAT_RRF 0x00008000
|
|
|
|
#define CPUSTAT_SLSV 0x00004000
|
|
|
|
#define CPUSTAT_SLSR 0x00002000
|
|
|
|
#define CPUSTAT_ZARCH 0x00000800
|
|
|
|
#define CPUSTAT_MCDS 0x00000100
|
2017-02-24 21:12:56 +00:00
|
|
|
#define CPUSTAT_KSS 0x00000200
|
2008-03-25 17:47:20 +00:00
|
|
|
#define CPUSTAT_SM 0x00000080
|
2014-03-14 10:00:21 +00:00
|
|
|
#define CPUSTAT_IBS 0x00000040
|
2015-02-18 10:13:03 +00:00
|
|
|
#define CPUSTAT_GED2 0x00000010
|
2008-03-25 17:47:20 +00:00
|
|
|
#define CPUSTAT_G 0x00000008
|
2013-06-12 11:54:53 +00:00
|
|
|
#define CPUSTAT_GED 0x00000004
|
2008-03-25 17:47:20 +00:00
|
|
|
#define CPUSTAT_J 0x00000002
|
|
|
|
#define CPUSTAT_P 0x00000001
|
|
|
|
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_sie_block {
|
2008-03-25 17:47:20 +00:00
|
|
|
atomic_t cpuflags; /* 0x0000 */
|
2014-05-13 14:58:30 +00:00
|
|
|
__u32 : 1; /* 0x0004 */
|
|
|
|
__u32 prefix : 18;
|
2015-02-02 14:49:35 +00:00
|
|
|
__u32 : 1;
|
|
|
|
__u32 ibc : 12;
|
2013-05-17 12:41:34 +00:00
|
|
|
__u8 reserved08[4]; /* 0x0008 */
|
|
|
|
#define PROG_IN_SIE (1<<0)
|
|
|
|
__u32 prog0c; /* 0x000c */
|
2013-05-17 12:41:35 +00:00
|
|
|
__u8 reserved10[16]; /* 0x0010 */
|
2015-04-09 11:49:04 +00:00
|
|
|
#define PROG_BLOCK_SIE (1<<0)
|
|
|
|
#define PROG_REQUEST (1<<1)
|
2013-05-17 12:41:35 +00:00
|
|
|
atomic_t prog20; /* 0x0020 */
|
|
|
|
__u8 reserved24[4]; /* 0x0024 */
|
2008-03-25 17:47:20 +00:00
|
|
|
__u64 cputm; /* 0x0028 */
|
|
|
|
__u64 ckc; /* 0x0030 */
|
|
|
|
__u64 epoch; /* 0x0038 */
|
2015-07-08 11:19:48 +00:00
|
|
|
__u32 svcc; /* 0x0040 */
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
#define LCTL_CR0 0x8000
|
2012-12-20 14:32:08 +00:00
|
|
|
#define LCTL_CR6 0x0200
|
2014-01-23 11:26:52 +00:00
|
|
|
#define LCTL_CR9 0x0040
|
|
|
|
#define LCTL_CR10 0x0020
|
|
|
|
#define LCTL_CR11 0x0010
|
2012-12-20 14:32:09 +00:00
|
|
|
#define LCTL_CR14 0x0002
|
2008-03-25 17:47:20 +00:00
|
|
|
__u16 lctl; /* 0x0044 */
|
|
|
|
__s16 icpua; /* 0x0046 */
|
2016-05-23 13:11:58 +00:00
|
|
|
#define ICTL_OPEREXC 0x80000000
|
2014-01-23 11:26:52 +00:00
|
|
|
#define ICTL_PINT 0x20000000
|
|
|
|
#define ICTL_LPSW 0x00400000
|
|
|
|
#define ICTL_STCTL 0x00040000
|
|
|
|
#define ICTL_ISKE 0x00004000
|
|
|
|
#define ICTL_SSKE 0x00002000
|
|
|
|
#define ICTL_RRBE 0x00001000
|
2013-01-29 16:48:20 +00:00
|
|
|
#define ICTL_TPROT 0x00000200
|
2008-03-25 17:47:20 +00:00
|
|
|
__u32 ictl; /* 0x0048 */
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECA_CEI 0x80000000
|
|
|
|
#define ECA_IB 0x40000000
|
|
|
|
#define ECA_SIGPI 0x10000000
|
|
|
|
#define ECA_MVPGI 0x01000000
|
2017-05-30 12:26:02 +00:00
|
|
|
#define ECA_AIV 0x00200000
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECA_VX 0x00020000
|
|
|
|
#define ECA_PROTEXCI 0x00002000
|
2018-09-25 23:16:18 +00:00
|
|
|
#define ECA_APIE 0x00000008
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECA_SII 0x00000001
|
2008-03-25 17:47:20 +00:00
|
|
|
__u32 eca; /* 0x004c */
|
2014-03-03 09:55:13 +00:00
|
|
|
#define ICPT_INST 0x04
|
|
|
|
#define ICPT_PROGI 0x08
|
|
|
|
#define ICPT_INSTPROGI 0x0C
|
2017-03-17 13:59:32 +00:00
|
|
|
#define ICPT_EXTREQ 0x10
|
2015-07-08 11:19:48 +00:00
|
|
|
#define ICPT_EXTINT 0x14
|
2017-03-17 13:59:32 +00:00
|
|
|
#define ICPT_IOREQ 0x18
|
|
|
|
#define ICPT_WAIT 0x1c
|
2015-07-08 11:19:48 +00:00
|
|
|
#define ICPT_VALIDITY 0x20
|
|
|
|
#define ICPT_STOP 0x28
|
2014-03-03 09:55:13 +00:00
|
|
|
#define ICPT_OPEREXC 0x2C
|
|
|
|
#define ICPT_PARTEXEC 0x38
|
|
|
|
#define ICPT_IOINST 0x40
|
2017-02-24 21:12:56 +00:00
|
|
|
#define ICPT_KSS 0x5c
|
2008-03-25 17:47:20 +00:00
|
|
|
__u8 icptcode; /* 0x0050 */
|
2014-11-12 16:13:29 +00:00
|
|
|
__u8 icptstatus; /* 0x0051 */
|
2008-03-25 17:47:20 +00:00
|
|
|
__u16 ihcpu; /* 0x0052 */
|
|
|
|
__u8 reserved54[2]; /* 0x0054 */
|
|
|
|
__u16 ipa; /* 0x0056 */
|
|
|
|
__u32 ipb; /* 0x0058 */
|
|
|
|
__u32 scaoh; /* 0x005c */
|
2018-01-17 13:44:34 +00:00
|
|
|
#define FPF_BPBC 0x20
|
|
|
|
__u8 fpf; /* 0x0060 */
|
2016-11-29 06:17:55 +00:00
|
|
|
#define ECB_GS 0x40
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECB_TE 0x10
|
|
|
|
#define ECB_SRSI 0x04
|
|
|
|
#define ECB_HOSTPROTINT 0x02
|
2008-03-25 17:47:20 +00:00
|
|
|
__u8 ecb; /* 0x0061 */
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECB2_CMMA 0x80
|
|
|
|
#define ECB2_IEP 0x20
|
|
|
|
#define ECB2_PFMFI 0x08
|
|
|
|
#define ECB2_ESCA 0x04
|
2013-06-12 11:54:53 +00:00
|
|
|
__u8 ecb2; /* 0x0062 */
|
2014-09-03 08:13:53 +00:00
|
|
|
#define ECB3_DEA 0x08
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECB3_AES 0x04
|
|
|
|
#define ECB3_RI 0x01
|
2014-09-03 08:13:53 +00:00
|
|
|
__u8 ecb3; /* 0x0063 */
|
2008-03-25 17:47:20 +00:00
|
|
|
__u32 scaol; /* 0x0064 */
|
2016-07-26 19:29:44 +00:00
|
|
|
__u8 reserved68; /* 0x0068 */
|
|
|
|
__u8 epdx; /* 0x0069 */
|
|
|
|
__u8 reserved6a[2]; /* 0x006a */
|
2008-03-25 17:47:20 +00:00
|
|
|
__u32 todpr; /* 0x006c */
|
2017-06-23 11:51:25 +00:00
|
|
|
#define GISA_FORMAT1 0x00000001
|
2017-05-30 12:26:02 +00:00
|
|
|
__u32 gd; /* 0x0070 */
|
|
|
|
__u8 reserved74[12]; /* 0x0074 */
|
2015-04-16 10:32:41 +00:00
|
|
|
__u64 mso; /* 0x0080 */
|
|
|
|
__u64 msl; /* 0x0088 */
|
2008-03-25 17:47:20 +00:00
|
|
|
psw_t gpsw; /* 0x0090 */
|
|
|
|
__u64 gg14; /* 0x00a0 */
|
|
|
|
__u64 gg15; /* 0x00a8 */
|
2018-08-31 16:51:19 +00:00
|
|
|
__u8 reservedb0[8]; /* 0x00b0 */
|
|
|
|
#define HPID_KVM 0x4
|
|
|
|
#define HPID_VSIE 0x5
|
|
|
|
__u8 hpid; /* 0x00b8 */
|
|
|
|
__u8 reservedb9[11]; /* 0x00b9 */
|
2014-01-15 15:46:07 +00:00
|
|
|
__u16 extcpuaddr; /* 0x00c4 */
|
|
|
|
__u16 eic; /* 0x00c6 */
|
|
|
|
__u32 reservedc8; /* 0x00c8 */
|
2014-03-03 09:54:33 +00:00
|
|
|
__u16 pgmilc; /* 0x00cc */
|
|
|
|
__u16 iprcc; /* 0x00ce */
|
|
|
|
__u32 dxc; /* 0x00d0 */
|
|
|
|
__u16 mcn; /* 0x00d4 */
|
|
|
|
__u8 perc; /* 0x00d6 */
|
|
|
|
__u8 peratmid; /* 0x00d7 */
|
|
|
|
__u64 peraddr; /* 0x00d8 */
|
|
|
|
__u8 eai; /* 0x00e0 */
|
|
|
|
__u8 peraid; /* 0x00e1 */
|
|
|
|
__u8 oai; /* 0x00e2 */
|
|
|
|
__u8 armid; /* 0x00e3 */
|
|
|
|
__u8 reservede4[4]; /* 0x00e4 */
|
|
|
|
__u64 tecmc; /* 0x00e8 */
|
2014-06-27 18:46:01 +00:00
|
|
|
__u8 reservedf0[12]; /* 0x00f0 */
|
2018-09-25 23:16:18 +00:00
|
|
|
#define CRYCB_FORMAT_MASK 0x00000003
|
2018-09-25 23:16:26 +00:00
|
|
|
#define CRYCB_FORMAT0 0x00000000
|
2014-06-27 18:46:01 +00:00
|
|
|
#define CRYCB_FORMAT1 0x00000001
|
2015-01-13 16:33:26 +00:00
|
|
|
#define CRYCB_FORMAT2 0x00000003
|
2014-06-27 18:46:01 +00:00
|
|
|
__u32 crycbd; /* 0x00fc */
|
2008-03-25 17:47:20 +00:00
|
|
|
__u64 gcr[16]; /* 0x0100 */
|
|
|
|
__u64 gbea; /* 0x0180 */
|
2016-11-29 06:17:55 +00:00
|
|
|
__u8 reserved188[8]; /* 0x0188 */
|
|
|
|
__u64 sdnxo; /* 0x0190 */
|
|
|
|
__u8 reserved198[8]; /* 0x0198 */
|
2009-06-23 15:24:07 +00:00
|
|
|
__u32 fac; /* 0x01a0 */
|
2013-04-17 15:36:29 +00:00
|
|
|
__u8 reserved1a4[20]; /* 0x01a4 */
|
|
|
|
__u64 cbrlo; /* 0x01b8 */
|
2014-04-30 17:39:46 +00:00
|
|
|
__u8 reserved1c0[8]; /* 0x01c0 */
|
2017-03-13 10:48:28 +00:00
|
|
|
#define ECD_HOSTREGMGMT 0x20000000
|
2016-07-26 19:29:44 +00:00
|
|
|
#define ECD_MEF 0x08000000
|
2018-03-08 16:08:49 +00:00
|
|
|
#define ECD_ETOKENF 0x02000000
|
2019-04-03 07:00:35 +00:00
|
|
|
#define ECD_ECC 0x00200000
|
2014-04-30 17:39:46 +00:00
|
|
|
__u32 ecd; /* 0x01c8 */
|
|
|
|
__u8 reserved1cc[18]; /* 0x01cc */
|
2014-02-10 14:32:19 +00:00
|
|
|
__u64 pp; /* 0x01de */
|
|
|
|
__u8 reserved1e6[2]; /* 0x01e6 */
|
2013-06-28 11:30:24 +00:00
|
|
|
__u64 itdba; /* 0x01e8 */
|
2016-01-07 10:24:29 +00:00
|
|
|
__u64 riccbd; /* 0x01f0 */
|
2015-11-25 10:08:32 +00:00
|
|
|
__u64 gvrd; /* 0x01f8 */
|
2008-03-25 17:47:20 +00:00
|
|
|
} __attribute__((packed));
|
|
|
|
|
2013-06-28 11:30:24 +00:00
|
|
|
struct kvm_s390_itdb {
|
|
|
|
__u8 data[256];
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2013-06-28 11:30:24 +00:00
|
|
|
|
|
|
|
struct sie_page {
|
|
|
|
struct kvm_s390_sie_block sie_block;
|
KVM: s390: Backup the guest's machine check info
When a machine check happens in the guest, related mcck info (mcic,
external damage code, ...) is stored in the vcpu's lowcore on the host.
Then the machine check handler's low-level part is executed, followed
by the high-level part.
If the high-level part's execution is interrupted by a new machine check
happening on the same vcpu on the host, the mcck info in the lowcore is
overwritten with the new machine check's data.
If the high-level part's execution is scheduled to a different cpu,
the mcck info in the lowcore is uncertain.
Therefore, for both cases, the further reinjection to the guest will use
the wrong data.
Let's backup the mcck info in the lowcore to the sie page
for further reinjection, so that the right data will be used.
Add new member into struct sie_page to store related machine check's
info of mcic, failing storage address and external damage code.
Signed-off-by: QingFeng Hao <haoqf@linux.vnet.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
2017-06-07 09:41:19 +00:00
|
|
|
struct mcck_volatile_info mcck_info; /* 0x0200 */
|
|
|
|
__u8 reserved218[1000]; /* 0x0218 */
|
2013-06-28 11:30:24 +00:00
|
|
|
struct kvm_s390_itdb itdb; /* 0x0600 */
|
2016-01-14 21:15:08 +00:00
|
|
|
__u8 reserved700[2304]; /* 0x0700 */
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2013-06-28 11:30:24 +00:00
|
|
|
|
2008-03-25 17:47:20 +00:00
|
|
|
struct kvm_vcpu_stat {
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 exit_userspace;
|
|
|
|
u64 exit_null;
|
|
|
|
u64 exit_external_request;
|
2018-02-23 07:57:33 +00:00
|
|
|
u64 exit_io_request;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 exit_external_interrupt;
|
|
|
|
u64 exit_stop_request;
|
|
|
|
u64 exit_validity;
|
|
|
|
u64 exit_instruction;
|
|
|
|
u64 exit_pei;
|
|
|
|
u64 halt_successful_poll;
|
|
|
|
u64 halt_attempted_poll;
|
|
|
|
u64 halt_poll_invalid;
|
2019-03-05 10:30:02 +00:00
|
|
|
u64 halt_no_poll_steal;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 halt_wakeup;
|
|
|
|
u64 instruction_lctl;
|
|
|
|
u64 instruction_lctlg;
|
|
|
|
u64 instruction_stctl;
|
|
|
|
u64 instruction_stctg;
|
|
|
|
u64 exit_program_interruption;
|
|
|
|
u64 exit_instr_and_program;
|
|
|
|
u64 exit_operation_exception;
|
2018-03-08 12:48:05 +00:00
|
|
|
u64 deliver_ckc;
|
|
|
|
u64 deliver_cputm;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 deliver_external_call;
|
|
|
|
u64 deliver_emergency_signal;
|
|
|
|
u64 deliver_service_signal;
|
2018-03-08 12:48:05 +00:00
|
|
|
u64 deliver_virtio;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 deliver_stop_signal;
|
|
|
|
u64 deliver_prefix_signal;
|
|
|
|
u64 deliver_restart_signal;
|
2018-03-08 12:48:05 +00:00
|
|
|
u64 deliver_program;
|
|
|
|
u64 deliver_io;
|
2018-03-02 10:56:47 +00:00
|
|
|
u64 deliver_machine_check;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 exit_wait_state;
|
2018-03-08 12:48:05 +00:00
|
|
|
u64 inject_ckc;
|
|
|
|
u64 inject_cputm;
|
|
|
|
u64 inject_external_call;
|
|
|
|
u64 inject_emergency_signal;
|
|
|
|
u64 inject_mchk;
|
|
|
|
u64 inject_pfault_init;
|
|
|
|
u64 inject_program;
|
|
|
|
u64 inject_restart;
|
|
|
|
u64 inject_set_prefix;
|
|
|
|
u64 inject_stop_signal;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 instruction_epsw;
|
|
|
|
u64 instruction_gs;
|
|
|
|
u64 instruction_io_other;
|
|
|
|
u64 instruction_lpsw;
|
|
|
|
u64 instruction_lpswe;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 instruction_pfmf;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 instruction_ptff;
|
|
|
|
u64 instruction_sck;
|
|
|
|
u64 instruction_sckpf;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 instruction_stidp;
|
|
|
|
u64 instruction_spx;
|
|
|
|
u64 instruction_stpx;
|
|
|
|
u64 instruction_stap;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 instruction_iske;
|
|
|
|
u64 instruction_ri;
|
|
|
|
u64 instruction_rrbe;
|
|
|
|
u64 instruction_sske;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 instruction_ipte_interlock;
|
|
|
|
u64 instruction_stsi;
|
|
|
|
u64 instruction_stfl;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 instruction_tb;
|
|
|
|
u64 instruction_tpi;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 instruction_tprot;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 instruction_tsch;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 instruction_sie;
|
|
|
|
u64 instruction_essa;
|
|
|
|
u64 instruction_sthyi;
|
|
|
|
u64 instruction_sigp_sense;
|
|
|
|
u64 instruction_sigp_sense_running;
|
|
|
|
u64 instruction_sigp_external_call;
|
|
|
|
u64 instruction_sigp_emergency;
|
|
|
|
u64 instruction_sigp_cond_emergency;
|
|
|
|
u64 instruction_sigp_start;
|
|
|
|
u64 instruction_sigp_stop;
|
|
|
|
u64 instruction_sigp_stop_store_status;
|
|
|
|
u64 instruction_sigp_store_status;
|
|
|
|
u64 instruction_sigp_store_adtl_status;
|
|
|
|
u64 instruction_sigp_arch;
|
|
|
|
u64 instruction_sigp_prefix;
|
|
|
|
u64 instruction_sigp_restart;
|
|
|
|
u64 instruction_sigp_init_cpu_reset;
|
|
|
|
u64 instruction_sigp_cpu_reset;
|
|
|
|
u64 instruction_sigp_unknown;
|
|
|
|
u64 diagnose_10;
|
|
|
|
u64 diagnose_44;
|
|
|
|
u64 diagnose_9c;
|
2019-02-15 12:47:20 +00:00
|
|
|
u64 diagnose_9c_ignored;
|
2016-08-02 04:03:22 +00:00
|
|
|
u64 diagnose_258;
|
|
|
|
u64 diagnose_308;
|
|
|
|
u64 diagnose_500;
|
2018-01-23 12:28:40 +00:00
|
|
|
u64 diagnose_other;
|
2008-03-25 17:47:20 +00:00
|
|
|
};
|
|
|
|
|
2014-02-11 10:07:05 +00:00
|
|
|
#define PGM_OPERATION 0x01
|
|
|
|
#define PGM_PRIVILEGED_OP 0x02
|
|
|
|
#define PGM_EXECUTE 0x03
|
|
|
|
#define PGM_PROTECTION 0x04
|
|
|
|
#define PGM_ADDRESSING 0x05
|
|
|
|
#define PGM_SPECIFICATION 0x06
|
|
|
|
#define PGM_DATA 0x07
|
|
|
|
#define PGM_FIXED_POINT_OVERFLOW 0x08
|
|
|
|
#define PGM_FIXED_POINT_DIVIDE 0x09
|
|
|
|
#define PGM_DECIMAL_OVERFLOW 0x0a
|
|
|
|
#define PGM_DECIMAL_DIVIDE 0x0b
|
|
|
|
#define PGM_HFP_EXPONENT_OVERFLOW 0x0c
|
|
|
|
#define PGM_HFP_EXPONENT_UNDERFLOW 0x0d
|
|
|
|
#define PGM_HFP_SIGNIFICANCE 0x0e
|
|
|
|
#define PGM_HFP_DIVIDE 0x0f
|
|
|
|
#define PGM_SEGMENT_TRANSLATION 0x10
|
|
|
|
#define PGM_PAGE_TRANSLATION 0x11
|
|
|
|
#define PGM_TRANSLATION_SPEC 0x12
|
|
|
|
#define PGM_SPECIAL_OPERATION 0x13
|
|
|
|
#define PGM_OPERAND 0x15
|
|
|
|
#define PGM_TRACE_TABEL 0x16
|
2015-02-02 20:01:06 +00:00
|
|
|
#define PGM_VECTOR_PROCESSING 0x1b
|
2014-02-11 10:07:05 +00:00
|
|
|
#define PGM_SPACE_SWITCH 0x1c
|
|
|
|
#define PGM_HFP_SQUARE_ROOT 0x1d
|
|
|
|
#define PGM_PC_TRANSLATION_SPEC 0x1f
|
|
|
|
#define PGM_AFX_TRANSLATION 0x20
|
|
|
|
#define PGM_ASX_TRANSLATION 0x21
|
|
|
|
#define PGM_LX_TRANSLATION 0x22
|
|
|
|
#define PGM_EX_TRANSLATION 0x23
|
|
|
|
#define PGM_PRIMARY_AUTHORITY 0x24
|
|
|
|
#define PGM_SECONDARY_AUTHORITY 0x25
|
|
|
|
#define PGM_LFX_TRANSLATION 0x26
|
|
|
|
#define PGM_LSX_TRANSLATION 0x27
|
|
|
|
#define PGM_ALET_SPECIFICATION 0x28
|
|
|
|
#define PGM_ALEN_TRANSLATION 0x29
|
|
|
|
#define PGM_ALE_SEQUENCE 0x2a
|
|
|
|
#define PGM_ASTE_VALIDITY 0x2b
|
|
|
|
#define PGM_ASTE_SEQUENCE 0x2c
|
|
|
|
#define PGM_EXTENDED_AUTHORITY 0x2d
|
|
|
|
#define PGM_LSTE_SEQUENCE 0x2e
|
|
|
|
#define PGM_ASTE_INSTANCE 0x2f
|
|
|
|
#define PGM_STACK_FULL 0x30
|
|
|
|
#define PGM_STACK_EMPTY 0x31
|
|
|
|
#define PGM_STACK_SPECIFICATION 0x32
|
|
|
|
#define PGM_STACK_TYPE 0x33
|
|
|
|
#define PGM_STACK_OPERATION 0x34
|
|
|
|
#define PGM_ASCE_TYPE 0x38
|
|
|
|
#define PGM_REGION_FIRST_TRANS 0x39
|
|
|
|
#define PGM_REGION_SECOND_TRANS 0x3a
|
|
|
|
#define PGM_REGION_THIRD_TRANS 0x3b
|
|
|
|
#define PGM_MONITOR 0x40
|
|
|
|
#define PGM_PER 0x80
|
|
|
|
#define PGM_CRYPTO_OPERATION 0x119
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
|
2017-06-29 16:39:27 +00:00
|
|
|
/* irq types in ascend order of priorities */
|
2013-07-29 18:54:15 +00:00
|
|
|
enum irq_types {
|
2017-06-29 16:39:27 +00:00
|
|
|
IRQ_PEND_SET_PREFIX = 0,
|
2013-07-29 18:54:15 +00:00
|
|
|
IRQ_PEND_RESTART,
|
2017-06-29 16:39:27 +00:00
|
|
|
IRQ_PEND_SIGP_STOP,
|
|
|
|
IRQ_PEND_IO_ISC_7,
|
|
|
|
IRQ_PEND_IO_ISC_6,
|
|
|
|
IRQ_PEND_IO_ISC_5,
|
|
|
|
IRQ_PEND_IO_ISC_4,
|
|
|
|
IRQ_PEND_IO_ISC_3,
|
|
|
|
IRQ_PEND_IO_ISC_2,
|
|
|
|
IRQ_PEND_IO_ISC_1,
|
|
|
|
IRQ_PEND_IO_ISC_0,
|
|
|
|
IRQ_PEND_VIRTIO,
|
|
|
|
IRQ_PEND_PFAULT_DONE,
|
|
|
|
IRQ_PEND_PFAULT_INIT,
|
|
|
|
IRQ_PEND_EXT_HOST,
|
|
|
|
IRQ_PEND_EXT_SERVICE,
|
|
|
|
IRQ_PEND_EXT_TIMING,
|
|
|
|
IRQ_PEND_EXT_CPU_TIMER,
|
|
|
|
IRQ_PEND_EXT_CLOCK_COMP,
|
|
|
|
IRQ_PEND_EXT_EXTERNAL,
|
|
|
|
IRQ_PEND_EXT_EMERGENCY,
|
|
|
|
IRQ_PEND_EXT_MALFUNC,
|
|
|
|
IRQ_PEND_EXT_IRQ_KEY,
|
|
|
|
IRQ_PEND_MCHK_REP,
|
|
|
|
IRQ_PEND_PROG,
|
|
|
|
IRQ_PEND_SVC,
|
|
|
|
IRQ_PEND_MCHK_EX,
|
2013-07-29 18:54:15 +00:00
|
|
|
IRQ_PEND_COUNT
|
|
|
|
};
|
|
|
|
|
2013-07-03 13:18:35 +00:00
|
|
|
/* We have 2M for virtio device descriptor pages. Smallest amount of
|
|
|
|
* memory per page is 24 bytes (1 queue), so (2048*1024) / 24 = 87381
|
|
|
|
*/
|
|
|
|
#define KVM_S390_MAX_VIRTIO_IRQS 87381
|
|
|
|
|
2013-07-29 18:54:15 +00:00
|
|
|
/*
|
|
|
|
* Repressible (non-floating) machine check interrupts
|
|
|
|
* subclass bits in MCIC
|
|
|
|
*/
|
|
|
|
#define MCHK_EXTD_BIT 58
|
|
|
|
#define MCHK_DEGR_BIT 56
|
|
|
|
#define MCHK_WARN_BIT 55
|
|
|
|
#define MCHK_REP_MASK ((1UL << MCHK_DEGR_BIT) | \
|
|
|
|
(1UL << MCHK_EXTD_BIT) | \
|
|
|
|
(1UL << MCHK_WARN_BIT))
|
|
|
|
|
|
|
|
/* Exigent machine check interrupts subclass bits in MCIC */
|
|
|
|
#define MCHK_SD_BIT 63
|
|
|
|
#define MCHK_PD_BIT 62
|
|
|
|
#define MCHK_EX_MASK ((1UL << MCHK_SD_BIT) | (1UL << MCHK_PD_BIT))
|
|
|
|
|
|
|
|
#define IRQ_PEND_EXT_MASK ((1UL << IRQ_PEND_EXT_IRQ_KEY) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_CLOCK_COMP) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_CPU_TIMER) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_MALFUNC) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_EMERGENCY) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_EXTERNAL) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_TIMING) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_HOST) | \
|
|
|
|
(1UL << IRQ_PEND_EXT_SERVICE) | \
|
|
|
|
(1UL << IRQ_PEND_VIRTIO) | \
|
|
|
|
(1UL << IRQ_PEND_PFAULT_INIT) | \
|
|
|
|
(1UL << IRQ_PEND_PFAULT_DONE))
|
|
|
|
|
|
|
|
#define IRQ_PEND_IO_MASK ((1UL << IRQ_PEND_IO_ISC_0) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_1) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_2) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_3) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_4) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_5) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_6) | \
|
|
|
|
(1UL << IRQ_PEND_IO_ISC_7))
|
|
|
|
|
|
|
|
#define IRQ_PEND_MCHK_MASK ((1UL << IRQ_PEND_MCHK_REP) | \
|
|
|
|
(1UL << IRQ_PEND_MCHK_EX))
|
|
|
|
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_interrupt_info {
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
struct list_head list;
|
|
|
|
u64 type;
|
|
|
|
union {
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_io_info io;
|
|
|
|
struct kvm_s390_ext_info ext;
|
|
|
|
struct kvm_s390_pgm_info pgm;
|
2011-07-24 08:48:31 +00:00
|
|
|
struct kvm_s390_emerg_info emerg;
|
2011-10-18 10:27:15 +00:00
|
|
|
struct kvm_s390_extcall_info extcall;
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_prefix_info prefix;
|
2014-10-15 14:48:16 +00:00
|
|
|
struct kvm_s390_stop_info stop;
|
2012-12-20 14:32:09 +00:00
|
|
|
struct kvm_s390_mchk_info mchk;
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2013-07-29 18:54:15 +00:00
|
|
|
struct kvm_s390_irq_payload {
|
|
|
|
struct kvm_s390_io_info io;
|
|
|
|
struct kvm_s390_ext_info ext;
|
|
|
|
struct kvm_s390_pgm_info pgm;
|
|
|
|
struct kvm_s390_emerg_info emerg;
|
|
|
|
struct kvm_s390_extcall_info extcall;
|
|
|
|
struct kvm_s390_prefix_info prefix;
|
2014-10-15 14:48:16 +00:00
|
|
|
struct kvm_s390_stop_info stop;
|
2013-07-29 18:54:15 +00:00
|
|
|
struct kvm_s390_mchk_info mchk;
|
|
|
|
};
|
|
|
|
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_local_interrupt {
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
spinlock_t lock;
|
2013-07-29 18:54:15 +00:00
|
|
|
DECLARE_BITMAP(sigp_emerg_pending, KVM_MAX_VCPUS);
|
|
|
|
struct kvm_s390_irq_payload irq;
|
|
|
|
unsigned long pending_irqs;
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
};
|
|
|
|
|
2013-07-03 13:18:35 +00:00
|
|
|
#define FIRQ_LIST_IO_ISC_0 0
|
|
|
|
#define FIRQ_LIST_IO_ISC_1 1
|
|
|
|
#define FIRQ_LIST_IO_ISC_2 2
|
|
|
|
#define FIRQ_LIST_IO_ISC_3 3
|
|
|
|
#define FIRQ_LIST_IO_ISC_4 4
|
|
|
|
#define FIRQ_LIST_IO_ISC_5 5
|
|
|
|
#define FIRQ_LIST_IO_ISC_6 6
|
|
|
|
#define FIRQ_LIST_IO_ISC_7 7
|
|
|
|
#define FIRQ_LIST_PFAULT 8
|
|
|
|
#define FIRQ_LIST_VIRTIO 9
|
|
|
|
#define FIRQ_LIST_COUNT 10
|
|
|
|
#define FIRQ_CNTR_IO 0
|
|
|
|
#define FIRQ_CNTR_SERVICE 1
|
|
|
|
#define FIRQ_CNTR_VIRTIO 2
|
|
|
|
#define FIRQ_CNTR_PFAULT 3
|
|
|
|
#define FIRQ_MAX_COUNT 4
|
|
|
|
|
2017-02-17 09:06:26 +00:00
|
|
|
/* mask the AIS mode for a given ISC */
|
|
|
|
#define AIS_MODE_MASK(isc) (0x80 >> isc)
|
|
|
|
|
|
|
|
#define KVM_S390_AIS_MODE_ALL 0
|
|
|
|
#define KVM_S390_AIS_MODE_SINGLE 1
|
|
|
|
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_float_interrupt {
|
2013-07-03 13:18:35 +00:00
|
|
|
unsigned long pending_irqs;
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
spinlock_t lock;
|
2013-07-03 13:18:35 +00:00
|
|
|
struct list_head lists[FIRQ_LIST_COUNT];
|
|
|
|
int counters[FIRQ_MAX_COUNT];
|
|
|
|
struct kvm_s390_mchk_info mchk;
|
|
|
|
struct kvm_s390_ext_info srv_signal;
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
int next_rr_cpu;
|
2017-02-17 09:06:26 +00:00
|
|
|
struct mutex ais_lock;
|
|
|
|
u8 simm;
|
|
|
|
u8 nimm;
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
};
|
|
|
|
|
2014-01-23 11:26:52 +00:00
|
|
|
struct kvm_hw_wp_info_arch {
|
|
|
|
unsigned long addr;
|
|
|
|
unsigned long phys_addr;
|
|
|
|
int len;
|
|
|
|
char *old_data;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct kvm_hw_bp_info_arch {
|
|
|
|
unsigned long addr;
|
|
|
|
int len;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Only the upper 16 bits of kvm_guest_debug->control are arch specific.
|
|
|
|
* Further KVM_GUESTDBG flags which an be used from userspace can be found in
|
|
|
|
* arch/s390/include/uapi/asm/kvm.h
|
|
|
|
*/
|
|
|
|
#define KVM_GUESTDBG_EXIT_PENDING 0x10000000
|
|
|
|
|
|
|
|
#define guestdbg_enabled(vcpu) \
|
|
|
|
(vcpu->guest_debug & KVM_GUESTDBG_ENABLE)
|
|
|
|
#define guestdbg_sstep_enabled(vcpu) \
|
|
|
|
(vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP)
|
|
|
|
#define guestdbg_hw_bp_enabled(vcpu) \
|
|
|
|
(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP)
|
|
|
|
#define guestdbg_exit_pending(vcpu) (guestdbg_enabled(vcpu) && \
|
|
|
|
(vcpu->guest_debug & KVM_GUESTDBG_EXIT_PENDING))
|
|
|
|
|
|
|
|
struct kvm_guestdbg_info_arch {
|
|
|
|
unsigned long cr0;
|
|
|
|
unsigned long cr9;
|
|
|
|
unsigned long cr10;
|
|
|
|
unsigned long cr11;
|
|
|
|
struct kvm_hw_bp_info_arch *hw_bp_info;
|
|
|
|
struct kvm_hw_wp_info_arch *hw_wp_info;
|
|
|
|
int nr_hw_bp;
|
|
|
|
int nr_hw_wp;
|
|
|
|
unsigned long last_bp;
|
|
|
|
};
|
KVM: s390: interrupt subsystem, cpu timer, waitpsw
This patch contains the s390 interrupt subsystem (similar to in kernel apic)
including timer interrupts (similar to in-kernel-pit) and enabled wait
(similar to in kernel hlt).
In order to achieve that, this patch also introduces intercept handling
for instruction intercepts, and it implements load control instructions.
This patch introduces an ioctl KVM_S390_INTERRUPT which is valid for both
the vm file descriptors and the vcpu file descriptors. In case this ioctl is
issued against a vm file descriptor, the interrupt is considered floating.
Floating interrupts may be delivered to any virtual cpu in the configuration.
The following interrupts are supported:
SIGP STOP - interprocessor signal that stops a remote cpu
SIGP SET PREFIX - interprocessor signal that sets the prefix register of a
(stopped) remote cpu
INT EMERGENCY - interprocessor interrupt, usually used to signal need_reshed
and for smp_call_function() in the guest.
PROGRAM INT - exception during program execution such as page fault, illegal
instruction and friends
RESTART - interprocessor signal that starts a stopped cpu
INT VIRTIO - floating interrupt for virtio signalisation
INT SERVICE - floating interrupt for signalisations from the system
service processor
struct kvm_s390_interrupt, which is submitted as ioctl parameter when injecting
an interrupt, also carrys parameter data for interrupts along with the interrupt
type. Interrupts on s390 usually have a state that represents the current
operation, or identifies which device has caused the interruption on s390.
kvm_s390_handle_wait() does handle waitpsw in two flavors: in case of a
disabled wait (that is, disabled for interrupts), we exit to userspace. In case
of an enabled wait we set up a timer that equals the cpu clock comparator value
and sleep on a wait queue.
[christian: change virtio interrupt to 0x2603]
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
2008-03-25 17:47:26 +00:00
|
|
|
|
2008-03-25 17:47:20 +00:00
|
|
|
struct kvm_vcpu_arch {
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_sie_block *sie_block;
|
2016-05-27 20:03:52 +00:00
|
|
|
/* if vsie is active, currently executed shadow sie control block */
|
|
|
|
struct kvm_s390_sie_block *vsie_block;
|
2008-03-25 17:47:20 +00:00
|
|
|
unsigned int host_acrs[NUM_ACRS];
|
2016-11-29 06:17:55 +00:00
|
|
|
struct gs_cb *host_gscb;
|
s390/kernel: lazy restore fpu registers
Improve the save and restore behavior of FPU register contents to use the
vector extension within the kernel.
The kernel does not use floating-point or vector registers and, therefore,
saving and restoring the FPU register contents are performed for handling
signals or switching processes only. To prepare for using vector
instructions and vector registers within the kernel, enhance the save
behavior and implement a lazy restore at return to user space from a
system call or interrupt.
To implement the lazy restore, the save_fpu_regs() sets a CPU information
flag, CIF_FPU, to indicate that the FPU registers must be restored.
Saving and setting CIF_FPU is performed in an atomic fashion to be
interrupt-safe. When the kernel wants to use the vector extension or
wants to change the FPU register state for a task during signal handling,
the save_fpu_regs() must be called first. The CIF_FPU flag is also set at
process switch. At return to user space, the FPU state is restored. In
particular, the FPU state includes the floating-point or vector register
contents, as well as, vector-enablement and floating-point control. The
FPU state restore and clearing CIF_FPU is also performed in an atomic
fashion.
For KVM, the restore of the FPU register state is performed when restoring
the general-purpose guest registers before the SIE instructions is started.
Because the path towards the SIE instruction is interruptible, the CIF_FPU
flag must be checked again right before going into SIE. If set, the guest
registers must be reloaded again by re-entering the outer SIE loop. This
is the same behavior as if the SIE critical section is interrupted.
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
2015-06-10 10:53:42 +00:00
|
|
|
struct fpu host_fpregs;
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_local_interrupt local_int;
|
2009-05-12 15:21:49 +00:00
|
|
|
struct hrtimer ckc_timer;
|
2014-01-01 15:31:49 +00:00
|
|
|
struct kvm_s390_pgm_info pgm;
|
2011-07-24 08:48:21 +00:00
|
|
|
struct gmap *gmap;
|
2015-03-11 15:47:33 +00:00
|
|
|
/* backup location for the currently enabled gmap when scheduled out */
|
|
|
|
struct gmap *enabled_gmap;
|
2014-01-23 11:26:52 +00:00
|
|
|
struct kvm_guestdbg_info_arch guestdbg;
|
2013-10-07 15:11:48 +00:00
|
|
|
unsigned long pfault_token;
|
|
|
|
unsigned long pfault_select;
|
|
|
|
unsigned long pfault_compare;
|
2016-02-15 08:42:25 +00:00
|
|
|
bool cputm_enabled;
|
2016-02-17 20:53:33 +00:00
|
|
|
/*
|
|
|
|
* The seqcount protects updates to cputm_start and sie_block.cputm,
|
|
|
|
* this way we can have non-blocking reads with consistent values.
|
|
|
|
* Only the owning VCPU thread (vcpu->cpu) is allowed to change these
|
|
|
|
* values and to start/stop/enable/disable cpu timer accounting.
|
|
|
|
*/
|
|
|
|
seqcount_t cputm_seqcount;
|
2016-02-15 08:42:25 +00:00
|
|
|
__u64 cputm_start;
|
2016-11-29 06:17:55 +00:00
|
|
|
bool gs_enabled;
|
2018-07-20 12:51:21 +00:00
|
|
|
bool skey_enabled;
|
2008-03-25 17:47:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct kvm_vm_stat {
|
2018-03-08 12:48:05 +00:00
|
|
|
u64 inject_io;
|
|
|
|
u64 inject_float_mchk;
|
|
|
|
u64 inject_pfault_done;
|
|
|
|
u64 inject_service_signal;
|
|
|
|
u64 inject_virtio;
|
|
|
|
u64 remote_tlb_flush;
|
2008-03-25 17:47:20 +00:00
|
|
|
};
|
|
|
|
|
2012-02-08 04:02:18 +00:00
|
|
|
struct kvm_arch_memory_slot {
|
|
|
|
};
|
|
|
|
|
2013-07-15 11:36:01 +00:00
|
|
|
struct s390_map_info {
|
|
|
|
struct list_head list;
|
|
|
|
__u64 guest_addr;
|
|
|
|
__u64 addr;
|
|
|
|
struct page *page;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct s390_io_adapter {
|
|
|
|
unsigned int id;
|
|
|
|
int isc;
|
|
|
|
bool maskable;
|
|
|
|
bool masked;
|
|
|
|
bool swap;
|
2017-01-19 16:02:26 +00:00
|
|
|
bool suppressible;
|
2013-07-15 11:36:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#define MAX_S390_IO_ADAPTERS ((MAX_ISC + 1) * 8)
|
|
|
|
#define MAX_S390_ADAPTER_MAPS 256
|
|
|
|
|
2015-02-02 14:42:51 +00:00
|
|
|
/* maximum size of facilities and facility mask is 2k bytes */
|
|
|
|
#define S390_ARCH_FAC_LIST_SIZE_BYTE (1<<11)
|
|
|
|
#define S390_ARCH_FAC_LIST_SIZE_U64 \
|
|
|
|
(S390_ARCH_FAC_LIST_SIZE_BYTE / sizeof(u64))
|
|
|
|
#define S390_ARCH_FAC_MASK_SIZE_BYTE S390_ARCH_FAC_LIST_SIZE_BYTE
|
|
|
|
#define S390_ARCH_FAC_MASK_SIZE_U64 \
|
|
|
|
(S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64))
|
|
|
|
|
|
|
|
struct kvm_s390_cpu_model {
|
2015-12-02 07:53:52 +00:00
|
|
|
/* facility mask supported by kvm & hosting machine */
|
|
|
|
__u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64];
|
2019-02-18 12:48:25 +00:00
|
|
|
struct kvm_s390_vm_cpu_subfunc subfuncs;
|
2015-12-02 07:53:52 +00:00
|
|
|
/* facility list requested by guest (in dma page) */
|
|
|
|
__u64 *fac_list;
|
2016-04-04 12:27:51 +00:00
|
|
|
u64 cpuid;
|
2015-02-02 14:49:35 +00:00
|
|
|
unsigned short ibc;
|
2015-02-02 14:42:51 +00:00
|
|
|
};
|
|
|
|
|
2019-05-21 15:34:34 +00:00
|
|
|
struct kvm_s390_module_hook {
|
|
|
|
int (*hook)(struct kvm_vcpu *vcpu);
|
|
|
|
struct module *owner;
|
|
|
|
};
|
|
|
|
|
2014-06-27 18:46:01 +00:00
|
|
|
struct kvm_s390_crypto {
|
|
|
|
struct kvm_s390_crypto_cb *crycb;
|
2019-05-21 15:34:34 +00:00
|
|
|
struct kvm_s390_module_hook *pqap_hook;
|
2014-06-27 18:46:01 +00:00
|
|
|
__u32 crycbd;
|
2014-09-03 08:13:53 +00:00
|
|
|
__u8 aes_kw;
|
|
|
|
__u8 dea_kw;
|
2018-09-25 23:16:18 +00:00
|
|
|
__u8 apie;
|
2014-06-27 18:46:01 +00:00
|
|
|
};
|
|
|
|
|
2017-10-13 17:38:46 +00:00
|
|
|
#define APCB0_MASK_SIZE 1
|
|
|
|
struct kvm_s390_apcb0 {
|
|
|
|
__u64 apm[APCB0_MASK_SIZE]; /* 0x0000 */
|
|
|
|
__u64 aqm[APCB0_MASK_SIZE]; /* 0x0008 */
|
|
|
|
__u64 adm[APCB0_MASK_SIZE]; /* 0x0010 */
|
|
|
|
__u64 reserved18; /* 0x0018 */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define APCB1_MASK_SIZE 4
|
|
|
|
struct kvm_s390_apcb1 {
|
|
|
|
__u64 apm[APCB1_MASK_SIZE]; /* 0x0000 */
|
|
|
|
__u64 aqm[APCB1_MASK_SIZE]; /* 0x0020 */
|
|
|
|
__u64 adm[APCB1_MASK_SIZE]; /* 0x0040 */
|
|
|
|
__u64 reserved60[4]; /* 0x0060 */
|
|
|
|
};
|
|
|
|
|
2014-06-27 18:46:01 +00:00
|
|
|
struct kvm_s390_crypto_cb {
|
2017-10-13 17:38:46 +00:00
|
|
|
struct kvm_s390_apcb0 apcb0; /* 0x0000 */
|
|
|
|
__u8 reserved20[0x0048 - 0x0020]; /* 0x0020 */
|
|
|
|
__u8 dea_wrapping_key_mask[24]; /* 0x0048 */
|
|
|
|
__u8 aes_wrapping_key_mask[32]; /* 0x0060 */
|
|
|
|
struct kvm_s390_apcb1 apcb1; /* 0x0080 */
|
2014-06-27 18:46:01 +00:00
|
|
|
};
|
|
|
|
|
2017-05-30 12:26:02 +00:00
|
|
|
struct kvm_s390_gisa {
|
2017-06-23 11:51:25 +00:00
|
|
|
union {
|
|
|
|
struct { /* common to all formats */
|
|
|
|
u32 next_alert;
|
|
|
|
u8 ipm;
|
|
|
|
u8 reserved01[2];
|
|
|
|
u8 iam;
|
|
|
|
};
|
|
|
|
struct { /* format 0 */
|
|
|
|
u32 next_alert;
|
|
|
|
u8 ipm;
|
|
|
|
u8 reserved01;
|
|
|
|
u8 : 6;
|
|
|
|
u8 g : 1;
|
|
|
|
u8 c : 1;
|
|
|
|
u8 iam;
|
|
|
|
u8 reserved02[4];
|
|
|
|
u32 airq_count;
|
|
|
|
} g0;
|
|
|
|
struct { /* format 1 */
|
|
|
|
u32 next_alert;
|
|
|
|
u8 ipm;
|
|
|
|
u8 simm;
|
|
|
|
u8 nimm;
|
|
|
|
u8 iam;
|
|
|
|
u8 aism[8];
|
|
|
|
u8 : 6;
|
|
|
|
u8 g : 1;
|
|
|
|
u8 c : 1;
|
|
|
|
u8 reserved03[11];
|
|
|
|
u32 airq_count;
|
|
|
|
} g1;
|
2019-01-31 08:52:42 +00:00
|
|
|
struct {
|
|
|
|
u64 word[4];
|
|
|
|
} u64;
|
2017-06-23 11:51:25 +00:00
|
|
|
};
|
2017-05-30 12:26:02 +00:00
|
|
|
};
|
|
|
|
|
2019-01-31 08:52:40 +00:00
|
|
|
struct kvm_s390_gib {
|
|
|
|
u32 alert_list_origin;
|
|
|
|
u32 reserved01;
|
|
|
|
u8:5;
|
|
|
|
u8 nisc:3;
|
|
|
|
u8 reserved03[3];
|
|
|
|
u32 reserved04[5];
|
|
|
|
};
|
|
|
|
|
2015-12-02 07:53:52 +00:00
|
|
|
/*
|
2017-05-30 12:26:02 +00:00
|
|
|
* sie_page2 has to be allocated as DMA because fac_list, crycb and
|
|
|
|
* gisa need 31bit addresses in the sie control block.
|
2015-12-02 07:53:52 +00:00
|
|
|
*/
|
|
|
|
struct sie_page2 {
|
|
|
|
__u64 fac_list[S390_ARCH_FAC_LIST_SIZE_U64]; /* 0x0000 */
|
|
|
|
struct kvm_s390_crypto_cb crycb; /* 0x0800 */
|
2017-05-30 12:26:02 +00:00
|
|
|
struct kvm_s390_gisa gisa; /* 0x0900 */
|
2019-01-31 08:52:41 +00:00
|
|
|
struct kvm *kvm; /* 0x0920 */
|
|
|
|
u8 reserved928[0x1000 - 0x928]; /* 0x0928 */
|
2017-06-21 14:49:15 +00:00
|
|
|
};
|
2015-12-02 07:53:52 +00:00
|
|
|
|
2015-07-08 11:19:48 +00:00
|
|
|
struct kvm_s390_vsie {
|
|
|
|
struct mutex mutex;
|
|
|
|
struct radix_tree_root addr_to_page;
|
|
|
|
int page_count;
|
|
|
|
int next;
|
|
|
|
struct page *pages[KVM_MAX_VCPUS];
|
|
|
|
};
|
|
|
|
|
2019-01-31 08:52:42 +00:00
|
|
|
struct kvm_s390_gisa_iam {
|
|
|
|
u8 mask;
|
|
|
|
spinlock_t ref_lock;
|
|
|
|
u32 ref_count[MAX_ISC + 1];
|
|
|
|
};
|
|
|
|
|
2019-01-31 08:52:38 +00:00
|
|
|
struct kvm_s390_gisa_interrupt {
|
|
|
|
struct kvm_s390_gisa *origin;
|
2019-01-31 08:52:42 +00:00
|
|
|
struct kvm_s390_gisa_iam alert;
|
2019-01-31 08:52:44 +00:00
|
|
|
struct hrtimer timer;
|
|
|
|
u64 expires;
|
|
|
|
DECLARE_BITMAP(kicked_mask, KVM_MAX_VCPUS);
|
2019-01-31 08:52:38 +00:00
|
|
|
};
|
|
|
|
|
2008-03-25 17:47:20 +00:00
|
|
|
struct kvm_arch{
|
2015-04-22 15:09:44 +00:00
|
|
|
void *sca;
|
|
|
|
int use_esca;
|
2015-04-22 16:08:39 +00:00
|
|
|
rwlock_t sca_lock;
|
2008-03-25 17:47:20 +00:00
|
|
|
debug_info_t *dbf;
|
2008-06-27 13:05:40 +00:00
|
|
|
struct kvm_s390_float_interrupt float_int;
|
2013-10-07 14:13:45 +00:00
|
|
|
struct kvm_device *flic;
|
2011-07-24 08:48:21 +00:00
|
|
|
struct gmap *gmap;
|
2014-12-01 16:24:42 +00:00
|
|
|
unsigned long mem_limit;
|
2012-12-20 14:32:12 +00:00
|
|
|
int css_support;
|
2013-07-15 11:36:01 +00:00
|
|
|
int use_irqchip;
|
2014-03-25 12:47:11 +00:00
|
|
|
int use_cmma;
|
2018-02-16 11:16:14 +00:00
|
|
|
int use_pfmfi;
|
2018-02-15 15:33:47 +00:00
|
|
|
int use_skf;
|
2014-04-10 15:35:00 +00:00
|
|
|
int user_cpu_state_ctrl;
|
2014-10-09 12:10:13 +00:00
|
|
|
int user_sigp;
|
2015-01-30 15:55:56 +00:00
|
|
|
int user_stsi;
|
2016-06-21 12:19:51 +00:00
|
|
|
int user_instr0;
|
2013-07-15 11:36:01 +00:00
|
|
|
struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
|
2014-01-10 13:33:28 +00:00
|
|
|
wait_queue_head_t ipte_wq;
|
2014-10-01 12:48:42 +00:00
|
|
|
int ipte_lock_count;
|
|
|
|
struct mutex ipte_mutex;
|
2014-03-14 10:00:21 +00:00
|
|
|
spinlock_t start_stop_lock;
|
2015-12-02 07:53:52 +00:00
|
|
|
struct sie_page2 *sie_page2;
|
2015-02-02 14:42:51 +00:00
|
|
|
struct kvm_s390_cpu_model model;
|
2014-06-27 18:46:01 +00:00
|
|
|
struct kvm_s390_crypto crypto;
|
2015-07-08 11:19:48 +00:00
|
|
|
struct kvm_s390_vsie vsie;
|
2016-07-26 19:29:44 +00:00
|
|
|
u8 epdx;
|
2014-11-25 14:46:02 +00:00
|
|
|
u64 epoch;
|
2018-04-30 16:33:25 +00:00
|
|
|
int migration_mode;
|
|
|
|
atomic64_t cmma_dirty_pages;
|
2015-03-19 16:36:43 +00:00
|
|
|
/* subset of available cpu features enabled by user space */
|
|
|
|
DECLARE_BITMAP(cpu_feat, KVM_S390_VM_CPU_FEAT_NR_BITS);
|
2019-01-31 08:52:34 +00:00
|
|
|
DECLARE_BITMAP(idle_mask, KVM_MAX_VCPUS);
|
2019-01-31 08:52:38 +00:00
|
|
|
struct kvm_s390_gisa_interrupt gisa_int;
|
2008-03-25 17:47:20 +00:00
|
|
|
};
|
|
|
|
|
2013-07-26 13:04:07 +00:00
|
|
|
#define KVM_HVA_ERR_BAD (-1UL)
|
|
|
|
#define KVM_HVA_ERR_RO_BAD (-2UL)
|
|
|
|
|
|
|
|
static inline bool kvm_is_error_hva(unsigned long addr)
|
|
|
|
{
|
|
|
|
return IS_ERR_VALUE(addr);
|
|
|
|
}
|
|
|
|
|
2013-10-07 15:11:48 +00:00
|
|
|
#define ASYNC_PF_PER_VCPU 64
|
|
|
|
struct kvm_arch_async_pf {
|
|
|
|
unsigned long pfault_token;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu);
|
|
|
|
|
|
|
|
void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu,
|
|
|
|
struct kvm_async_pf *work);
|
|
|
|
|
|
|
|
void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu,
|
|
|
|
struct kvm_async_pf *work);
|
|
|
|
|
|
|
|
void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
|
|
|
|
struct kvm_async_pf *work);
|
|
|
|
|
2018-09-25 23:16:25 +00:00
|
|
|
void kvm_arch_crypto_clear_masks(struct kvm *kvm);
|
2018-10-05 08:31:09 +00:00
|
|
|
void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
|
|
|
|
unsigned long *aqm, unsigned long *adm);
|
2018-09-25 23:16:25 +00:00
|
|
|
|
2012-01-11 10:20:32 +00:00
|
|
|
extern int sie64a(struct kvm_s390_sie_block *, u64 *);
|
2013-06-12 11:54:56 +00:00
|
|
|
extern char sie_exit;
|
2014-08-28 13:13:02 +00:00
|
|
|
|
2019-01-31 08:52:42 +00:00
|
|
|
extern int kvm_s390_gisc_register(struct kvm *kvm, u32 gisc);
|
|
|
|
extern int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc);
|
|
|
|
|
2014-08-28 13:13:03 +00:00
|
|
|
static inline void kvm_arch_hardware_disable(void) {}
|
2014-08-28 13:13:02 +00:00
|
|
|
static inline void kvm_arch_sync_events(struct kvm *kvm) {}
|
|
|
|
static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {}
|
|
|
|
static inline void kvm_arch_free_memslot(struct kvm *kvm,
|
|
|
|
struct kvm_memory_slot *free, struct kvm_memory_slot *dont) {}
|
2019-02-05 20:54:17 +00:00
|
|
|
static inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {}
|
2014-08-28 13:13:02 +00:00
|
|
|
static inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {}
|
|
|
|
static inline void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
|
|
|
|
struct kvm_memory_slot *slot) {}
|
2015-08-27 14:41:15 +00:00
|
|
|
static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {}
|
|
|
|
static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {}
|
2014-08-28 13:13:02 +00:00
|
|
|
|
2016-05-13 10:16:35 +00:00
|
|
|
void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu);
|
|
|
|
|
2008-03-25 17:47:20 +00:00
|
|
|
#endif
|