162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci#ifndef __LINUX_KVM_S390_H
362306a36Sopenharmony_ci#define __LINUX_KVM_S390_H
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * KVM s390 specific structures and definitions
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright IBM Corp. 2008, 2018
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *    Author(s): Carsten Otte <cotte@de.ibm.com>
1062306a36Sopenharmony_ci *               Christian Borntraeger <borntraeger@de.ibm.com>
1162306a36Sopenharmony_ci */
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define __KVM_S390
1562306a36Sopenharmony_ci#define __KVM_HAVE_GUEST_DEBUG
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/* Device control API: s390-specific devices */
1862306a36Sopenharmony_ci#define KVM_DEV_FLIC_GET_ALL_IRQS	1
1962306a36Sopenharmony_ci#define KVM_DEV_FLIC_ENQUEUE		2
2062306a36Sopenharmony_ci#define KVM_DEV_FLIC_CLEAR_IRQS		3
2162306a36Sopenharmony_ci#define KVM_DEV_FLIC_APF_ENABLE		4
2262306a36Sopenharmony_ci#define KVM_DEV_FLIC_APF_DISABLE_WAIT	5
2362306a36Sopenharmony_ci#define KVM_DEV_FLIC_ADAPTER_REGISTER	6
2462306a36Sopenharmony_ci#define KVM_DEV_FLIC_ADAPTER_MODIFY	7
2562306a36Sopenharmony_ci#define KVM_DEV_FLIC_CLEAR_IO_IRQ	8
2662306a36Sopenharmony_ci#define KVM_DEV_FLIC_AISM		9
2762306a36Sopenharmony_ci#define KVM_DEV_FLIC_AIRQ_INJECT	10
2862306a36Sopenharmony_ci#define KVM_DEV_FLIC_AISM_ALL		11
2962306a36Sopenharmony_ci/*
3062306a36Sopenharmony_ci * We can have up to 4*64k pending subchannels + 8 adapter interrupts,
3162306a36Sopenharmony_ci * as well as up  to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
3262306a36Sopenharmony_ci * There are also sclp and machine checks. This gives us
3362306a36Sopenharmony_ci * sizeof(kvm_s390_irq)*(4*65536+8+64*64+1+1) = 72 * 266250 = 19170000
3462306a36Sopenharmony_ci * Lets round up to 8192 pages.
3562306a36Sopenharmony_ci */
3662306a36Sopenharmony_ci#define KVM_S390_MAX_FLOAT_IRQS	266250
3762306a36Sopenharmony_ci#define KVM_S390_FLIC_MAX_BUFFER	0x2000000
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct kvm_s390_io_adapter {
4062306a36Sopenharmony_ci	__u32 id;
4162306a36Sopenharmony_ci	__u8 isc;
4262306a36Sopenharmony_ci	__u8 maskable;
4362306a36Sopenharmony_ci	__u8 swap;
4462306a36Sopenharmony_ci	__u8 flags;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define KVM_S390_ADAPTER_SUPPRESSIBLE 0x01
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct kvm_s390_ais_req {
5062306a36Sopenharmony_ci	__u8 isc;
5162306a36Sopenharmony_ci	__u16 mode;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct kvm_s390_ais_all {
5562306a36Sopenharmony_ci	__u8 simm;
5662306a36Sopenharmony_ci	__u8 nimm;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define KVM_S390_IO_ADAPTER_MASK 1
6062306a36Sopenharmony_ci#define KVM_S390_IO_ADAPTER_MAP 2
6162306a36Sopenharmony_ci#define KVM_S390_IO_ADAPTER_UNMAP 3
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistruct kvm_s390_io_adapter_req {
6462306a36Sopenharmony_ci	__u32 id;
6562306a36Sopenharmony_ci	__u8 type;
6662306a36Sopenharmony_ci	__u8 mask;
6762306a36Sopenharmony_ci	__u16 pad0;
6862306a36Sopenharmony_ci	__u64 addr;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci/* kvm attr_group  on vm fd */
7262306a36Sopenharmony_ci#define KVM_S390_VM_MEM_CTRL		0
7362306a36Sopenharmony_ci#define KVM_S390_VM_TOD			1
7462306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO		2
7562306a36Sopenharmony_ci#define KVM_S390_VM_CPU_MODEL		3
7662306a36Sopenharmony_ci#define KVM_S390_VM_MIGRATION		4
7762306a36Sopenharmony_ci#define KVM_S390_VM_CPU_TOPOLOGY	5
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/* kvm attributes for mem_ctrl */
8062306a36Sopenharmony_ci#define KVM_S390_VM_MEM_ENABLE_CMMA	0
8162306a36Sopenharmony_ci#define KVM_S390_VM_MEM_CLR_CMMA	1
8262306a36Sopenharmony_ci#define KVM_S390_VM_MEM_LIMIT_SIZE	2
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci#define KVM_S390_NO_MEM_LIMIT		U64_MAX
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/* kvm attributes for KVM_S390_VM_TOD */
8762306a36Sopenharmony_ci#define KVM_S390_VM_TOD_LOW		0
8862306a36Sopenharmony_ci#define KVM_S390_VM_TOD_HIGH		1
8962306a36Sopenharmony_ci#define KVM_S390_VM_TOD_EXT		2
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistruct kvm_s390_vm_tod_clock {
9262306a36Sopenharmony_ci	__u8  epoch_idx;
9362306a36Sopenharmony_ci	__u64 tod;
9462306a36Sopenharmony_ci};
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci/* kvm attributes for KVM_S390_VM_CPU_MODEL */
9762306a36Sopenharmony_ci/* processor related attributes are r/w */
9862306a36Sopenharmony_ci#define KVM_S390_VM_CPU_PROCESSOR	0
9962306a36Sopenharmony_cistruct kvm_s390_vm_cpu_processor {
10062306a36Sopenharmony_ci	__u64 cpuid;
10162306a36Sopenharmony_ci	__u16 ibc;
10262306a36Sopenharmony_ci	__u8  pad[6];
10362306a36Sopenharmony_ci	__u64 fac_list[256];
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* machine related attributes are r/o */
10762306a36Sopenharmony_ci#define KVM_S390_VM_CPU_MACHINE		1
10862306a36Sopenharmony_cistruct kvm_s390_vm_cpu_machine {
10962306a36Sopenharmony_ci	__u64 cpuid;
11062306a36Sopenharmony_ci	__u32 ibc;
11162306a36Sopenharmony_ci	__u8  pad[4];
11262306a36Sopenharmony_ci	__u64 fac_mask[256];
11362306a36Sopenharmony_ci	__u64 fac_list[256];
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define KVM_S390_VM_CPU_PROCESSOR_FEAT	2
11762306a36Sopenharmony_ci#define KVM_S390_VM_CPU_MACHINE_FEAT	3
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_NR_BITS	1024
12062306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_ESOP	0
12162306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_SIEF2	1
12262306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_64BSCAO	2
12362306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_SIIF	3
12462306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_GPERE	4
12562306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_GSLS	5
12662306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_IB		6
12762306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_CEI	7
12862306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_IBS	8
12962306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_SKEY	9
13062306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_CMMA	10
13162306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_PFMFI	11
13262306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_SIGPIF	12
13362306a36Sopenharmony_ci#define KVM_S390_VM_CPU_FEAT_KSS	13
13462306a36Sopenharmony_cistruct kvm_s390_vm_cpu_feat {
13562306a36Sopenharmony_ci	__u64 feat[16];
13662306a36Sopenharmony_ci};
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci#define KVM_S390_VM_CPU_PROCESSOR_SUBFUNC	4
13962306a36Sopenharmony_ci#define KVM_S390_VM_CPU_MACHINE_SUBFUNC		5
14062306a36Sopenharmony_ci/* for "test bit" instructions MSB 0 bit ordering, for "query" raw blocks */
14162306a36Sopenharmony_cistruct kvm_s390_vm_cpu_subfunc {
14262306a36Sopenharmony_ci	__u8 plo[32];		/* always */
14362306a36Sopenharmony_ci	__u8 ptff[16];		/* with TOD-clock steering */
14462306a36Sopenharmony_ci	__u8 kmac[16];		/* with MSA */
14562306a36Sopenharmony_ci	__u8 kmc[16];		/* with MSA */
14662306a36Sopenharmony_ci	__u8 km[16];		/* with MSA */
14762306a36Sopenharmony_ci	__u8 kimd[16];		/* with MSA */
14862306a36Sopenharmony_ci	__u8 klmd[16];		/* with MSA */
14962306a36Sopenharmony_ci	__u8 pckmo[16];		/* with MSA3 */
15062306a36Sopenharmony_ci	__u8 kmctr[16];		/* with MSA4 */
15162306a36Sopenharmony_ci	__u8 kmf[16];		/* with MSA4 */
15262306a36Sopenharmony_ci	__u8 kmo[16];		/* with MSA4 */
15362306a36Sopenharmony_ci	__u8 pcc[16];		/* with MSA4 */
15462306a36Sopenharmony_ci	__u8 ppno[16];		/* with MSA5 */
15562306a36Sopenharmony_ci	__u8 kma[16];		/* with MSA8 */
15662306a36Sopenharmony_ci	__u8 kdsa[16];		/* with MSA9 */
15762306a36Sopenharmony_ci	__u8 sortl[32];		/* with STFLE.150 */
15862306a36Sopenharmony_ci	__u8 dfltcc[32];	/* with STFLE.151 */
15962306a36Sopenharmony_ci	__u8 reserved[1728];
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci/* kvm attributes for crypto */
16362306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_ENABLE_AES_KW	0
16462306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW	1
16562306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW	2
16662306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW	3
16762306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_ENABLE_APIE		4
16862306a36Sopenharmony_ci#define KVM_S390_VM_CRYPTO_DISABLE_APIE		5
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/* kvm attributes for migration mode */
17162306a36Sopenharmony_ci#define KVM_S390_VM_MIGRATION_STOP	0
17262306a36Sopenharmony_ci#define KVM_S390_VM_MIGRATION_START	1
17362306a36Sopenharmony_ci#define KVM_S390_VM_MIGRATION_STATUS	2
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci/* for KVM_GET_REGS and KVM_SET_REGS */
17662306a36Sopenharmony_cistruct kvm_regs {
17762306a36Sopenharmony_ci	/* general purpose regs for s390 */
17862306a36Sopenharmony_ci	__u64 gprs[16];
17962306a36Sopenharmony_ci};
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci/* for KVM_GET_SREGS and KVM_SET_SREGS */
18262306a36Sopenharmony_cistruct kvm_sregs {
18362306a36Sopenharmony_ci	__u32 acrs[16];
18462306a36Sopenharmony_ci	__u64 crs[16];
18562306a36Sopenharmony_ci};
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci/* for KVM_GET_FPU and KVM_SET_FPU */
18862306a36Sopenharmony_cistruct kvm_fpu {
18962306a36Sopenharmony_ci	__u32 fpc;
19062306a36Sopenharmony_ci	__u64 fprs[16];
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#define KVM_GUESTDBG_USE_HW_BP		0x00010000
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci#define KVM_HW_BP			1
19662306a36Sopenharmony_ci#define KVM_HW_WP_WRITE			2
19762306a36Sopenharmony_ci#define KVM_SINGLESTEP			4
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistruct kvm_debug_exit_arch {
20062306a36Sopenharmony_ci	__u64 addr;
20162306a36Sopenharmony_ci	__u8 type;
20262306a36Sopenharmony_ci	__u8 pad[7]; /* Should be set to 0 */
20362306a36Sopenharmony_ci};
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cistruct kvm_hw_breakpoint {
20662306a36Sopenharmony_ci	__u64 addr;
20762306a36Sopenharmony_ci	__u64 phys_addr;
20862306a36Sopenharmony_ci	__u64 len;
20962306a36Sopenharmony_ci	__u8 type;
21062306a36Sopenharmony_ci	__u8 pad[7]; /* Should be set to 0 */
21162306a36Sopenharmony_ci};
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci/* for KVM_SET_GUEST_DEBUG */
21462306a36Sopenharmony_cistruct kvm_guest_debug_arch {
21562306a36Sopenharmony_ci	__u32 nr_hw_bp;
21662306a36Sopenharmony_ci	__u32 pad; /* Should be set to 0 */
21762306a36Sopenharmony_ci	struct kvm_hw_breakpoint __user *hw_bp;
21862306a36Sopenharmony_ci};
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci/* for KVM_SYNC_PFAULT and KVM_REG_S390_PFTOKEN */
22162306a36Sopenharmony_ci#define KVM_S390_PFAULT_TOKEN_INVALID	0xffffffffffffffffULL
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci#define KVM_SYNC_PREFIX (1UL << 0)
22462306a36Sopenharmony_ci#define KVM_SYNC_GPRS   (1UL << 1)
22562306a36Sopenharmony_ci#define KVM_SYNC_ACRS   (1UL << 2)
22662306a36Sopenharmony_ci#define KVM_SYNC_CRS    (1UL << 3)
22762306a36Sopenharmony_ci#define KVM_SYNC_ARCH0  (1UL << 4)
22862306a36Sopenharmony_ci#define KVM_SYNC_PFAULT (1UL << 5)
22962306a36Sopenharmony_ci#define KVM_SYNC_VRS    (1UL << 6)
23062306a36Sopenharmony_ci#define KVM_SYNC_RICCB  (1UL << 7)
23162306a36Sopenharmony_ci#define KVM_SYNC_FPRS   (1UL << 8)
23262306a36Sopenharmony_ci#define KVM_SYNC_GSCB   (1UL << 9)
23362306a36Sopenharmony_ci#define KVM_SYNC_BPBC   (1UL << 10)
23462306a36Sopenharmony_ci#define KVM_SYNC_ETOKEN (1UL << 11)
23562306a36Sopenharmony_ci#define KVM_SYNC_DIAG318 (1UL << 12)
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci#define KVM_SYNC_S390_VALID_FIELDS \
23862306a36Sopenharmony_ci	(KVM_SYNC_PREFIX | KVM_SYNC_GPRS | KVM_SYNC_ACRS | KVM_SYNC_CRS | \
23962306a36Sopenharmony_ci	 KVM_SYNC_ARCH0 | KVM_SYNC_PFAULT | KVM_SYNC_VRS | KVM_SYNC_RICCB | \
24062306a36Sopenharmony_ci	 KVM_SYNC_FPRS | KVM_SYNC_GSCB | KVM_SYNC_BPBC | KVM_SYNC_ETOKEN | \
24162306a36Sopenharmony_ci	 KVM_SYNC_DIAG318)
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci/* length and alignment of the sdnx as a power of two */
24462306a36Sopenharmony_ci#define SDNXC 8
24562306a36Sopenharmony_ci#define SDNXL (1UL << SDNXC)
24662306a36Sopenharmony_ci/* definition of registers in kvm_run */
24762306a36Sopenharmony_cistruct kvm_sync_regs {
24862306a36Sopenharmony_ci	__u64 prefix;	/* prefix register */
24962306a36Sopenharmony_ci	__u64 gprs[16];	/* general purpose registers */
25062306a36Sopenharmony_ci	__u32 acrs[16];	/* access registers */
25162306a36Sopenharmony_ci	__u64 crs[16];	/* control registers */
25262306a36Sopenharmony_ci	__u64 todpr;	/* tod programmable register [ARCH0] */
25362306a36Sopenharmony_ci	__u64 cputm;	/* cpu timer [ARCH0] */
25462306a36Sopenharmony_ci	__u64 ckc;	/* clock comparator [ARCH0] */
25562306a36Sopenharmony_ci	__u64 pp;	/* program parameter [ARCH0] */
25662306a36Sopenharmony_ci	__u64 gbea;	/* guest breaking-event address [ARCH0] */
25762306a36Sopenharmony_ci	__u64 pft;	/* pfault token [PFAULT] */
25862306a36Sopenharmony_ci	__u64 pfs;	/* pfault select [PFAULT] */
25962306a36Sopenharmony_ci	__u64 pfc;	/* pfault compare [PFAULT] */
26062306a36Sopenharmony_ci	union {
26162306a36Sopenharmony_ci		__u64 vrs[32][2];	/* vector registers (KVM_SYNC_VRS) */
26262306a36Sopenharmony_ci		__u64 fprs[16];		/* fp registers (KVM_SYNC_FPRS) */
26362306a36Sopenharmony_ci	};
26462306a36Sopenharmony_ci	__u8  reserved[512];	/* for future vector expansion */
26562306a36Sopenharmony_ci	__u32 fpc;		/* valid on KVM_SYNC_VRS or KVM_SYNC_FPRS */
26662306a36Sopenharmony_ci	__u8 bpbc : 1;		/* bp mode */
26762306a36Sopenharmony_ci	__u8 reserved2 : 7;
26862306a36Sopenharmony_ci	__u8 padding1[51];	/* riccb needs to be 64byte aligned */
26962306a36Sopenharmony_ci	__u8 riccb[64];		/* runtime instrumentation controls block */
27062306a36Sopenharmony_ci	__u64 diag318;		/* diagnose 0x318 info */
27162306a36Sopenharmony_ci	__u8 padding2[184];	/* sdnx needs to be 256byte aligned */
27262306a36Sopenharmony_ci	union {
27362306a36Sopenharmony_ci		__u8 sdnx[SDNXL];  /* state description annex */
27462306a36Sopenharmony_ci		struct {
27562306a36Sopenharmony_ci			__u64 reserved1[2];
27662306a36Sopenharmony_ci			__u64 gscb[4];
27762306a36Sopenharmony_ci			__u64 etoken;
27862306a36Sopenharmony_ci			__u64 etoken_extension;
27962306a36Sopenharmony_ci		};
28062306a36Sopenharmony_ci	};
28162306a36Sopenharmony_ci};
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci#define KVM_REG_S390_TODPR	(KVM_REG_S390 | KVM_REG_SIZE_U32 | 0x1)
28462306a36Sopenharmony_ci#define KVM_REG_S390_EPOCHDIFF	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2)
28562306a36Sopenharmony_ci#define KVM_REG_S390_CPU_TIMER  (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3)
28662306a36Sopenharmony_ci#define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4)
28762306a36Sopenharmony_ci#define KVM_REG_S390_PFTOKEN	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5)
28862306a36Sopenharmony_ci#define KVM_REG_S390_PFCOMPARE	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6)
28962306a36Sopenharmony_ci#define KVM_REG_S390_PFSELECT	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7)
29062306a36Sopenharmony_ci#define KVM_REG_S390_PP		(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8)
29162306a36Sopenharmony_ci#define KVM_REG_S390_GBEA	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9)
29262306a36Sopenharmony_ci#endif
293