qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

kvm.h (8297B)


      1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
      2 #ifndef __LINUX_KVM_S390_H
      3 #define __LINUX_KVM_S390_H
      4 /*
      5  * KVM s390 specific structures and definitions
      6  *
      7  * Copyright IBM Corp. 2008, 2018
      8  *
      9  *    Author(s): Carsten Otte <cotte@de.ibm.com>
     10  *               Christian Borntraeger <borntraeger@de.ibm.com>
     11  */
     12 #include <linux/types.h>
     13 
     14 #define __KVM_S390
     15 #define __KVM_HAVE_GUEST_DEBUG
     16 
     17 /* Device control API: s390-specific devices */
     18 #define KVM_DEV_FLIC_GET_ALL_IRQS	1
     19 #define KVM_DEV_FLIC_ENQUEUE		2
     20 #define KVM_DEV_FLIC_CLEAR_IRQS		3
     21 #define KVM_DEV_FLIC_APF_ENABLE		4
     22 #define KVM_DEV_FLIC_APF_DISABLE_WAIT	5
     23 #define KVM_DEV_FLIC_ADAPTER_REGISTER	6
     24 #define KVM_DEV_FLIC_ADAPTER_MODIFY	7
     25 #define KVM_DEV_FLIC_CLEAR_IO_IRQ	8
     26 #define KVM_DEV_FLIC_AISM		9
     27 #define KVM_DEV_FLIC_AIRQ_INJECT	10
     28 #define KVM_DEV_FLIC_AISM_ALL		11
     29 /*
     30  * We can have up to 4*64k pending subchannels + 8 adapter interrupts,
     31  * as well as up  to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
     32  * There are also sclp and machine checks. This gives us
     33  * sizeof(kvm_s390_irq)*(4*65536+8+64*64+1+1) = 72 * 266250 = 19170000
     34  * Lets round up to 8192 pages.
     35  */
     36 #define KVM_S390_MAX_FLOAT_IRQS	266250
     37 #define KVM_S390_FLIC_MAX_BUFFER	0x2000000
     38 
     39 struct kvm_s390_io_adapter {
     40 	__u32 id;
     41 	__u8 isc;
     42 	__u8 maskable;
     43 	__u8 swap;
     44 	__u8 flags;
     45 };
     46 
     47 #define KVM_S390_ADAPTER_SUPPRESSIBLE 0x01
     48 
     49 struct kvm_s390_ais_req {
     50 	__u8 isc;
     51 	__u16 mode;
     52 };
     53 
     54 struct kvm_s390_ais_all {
     55 	__u8 simm;
     56 	__u8 nimm;
     57 };
     58 
     59 #define KVM_S390_IO_ADAPTER_MASK 1
     60 #define KVM_S390_IO_ADAPTER_MAP 2
     61 #define KVM_S390_IO_ADAPTER_UNMAP 3
     62 
     63 struct kvm_s390_io_adapter_req {
     64 	__u32 id;
     65 	__u8 type;
     66 	__u8 mask;
     67 	__u16 pad0;
     68 	__u64 addr;
     69 };
     70 
     71 /* kvm attr_group  on vm fd */
     72 #define KVM_S390_VM_MEM_CTRL		0
     73 #define KVM_S390_VM_TOD			1
     74 #define KVM_S390_VM_CRYPTO		2
     75 #define KVM_S390_VM_CPU_MODEL		3
     76 #define KVM_S390_VM_MIGRATION		4
     77 #define KVM_S390_VM_CPU_TOPOLOGY	5
     78 
     79 /* kvm attributes for mem_ctrl */
     80 #define KVM_S390_VM_MEM_ENABLE_CMMA	0
     81 #define KVM_S390_VM_MEM_CLR_CMMA	1
     82 #define KVM_S390_VM_MEM_LIMIT_SIZE	2
     83 
     84 #define KVM_S390_NO_MEM_LIMIT		U64_MAX
     85 
     86 /* kvm attributes for KVM_S390_VM_TOD */
     87 #define KVM_S390_VM_TOD_LOW		0
     88 #define KVM_S390_VM_TOD_HIGH		1
     89 #define KVM_S390_VM_TOD_EXT		2
     90 
     91 struct kvm_s390_vm_tod_clock {
     92 	__u8  epoch_idx;
     93 	__u64 tod;
     94 };
     95 
     96 /* kvm attributes for KVM_S390_VM_CPU_MODEL */
     97 /* processor related attributes are r/w */
     98 #define KVM_S390_VM_CPU_PROCESSOR	0
     99 struct kvm_s390_vm_cpu_processor {
    100 	__u64 cpuid;
    101 	__u16 ibc;
    102 	__u8  pad[6];
    103 	__u64 fac_list[256];
    104 };
    105 
    106 /* machine related attributes are r/o */
    107 #define KVM_S390_VM_CPU_MACHINE		1
    108 struct kvm_s390_vm_cpu_machine {
    109 	__u64 cpuid;
    110 	__u32 ibc;
    111 	__u8  pad[4];
    112 	__u64 fac_mask[256];
    113 	__u64 fac_list[256];
    114 };
    115 
    116 #define KVM_S390_VM_CPU_PROCESSOR_FEAT	2
    117 #define KVM_S390_VM_CPU_MACHINE_FEAT	3
    118 
    119 #define KVM_S390_VM_CPU_FEAT_NR_BITS	1024
    120 #define KVM_S390_VM_CPU_FEAT_ESOP	0
    121 #define KVM_S390_VM_CPU_FEAT_SIEF2	1
    122 #define KVM_S390_VM_CPU_FEAT_64BSCAO	2
    123 #define KVM_S390_VM_CPU_FEAT_SIIF	3
    124 #define KVM_S390_VM_CPU_FEAT_GPERE	4
    125 #define KVM_S390_VM_CPU_FEAT_GSLS	5
    126 #define KVM_S390_VM_CPU_FEAT_IB		6
    127 #define KVM_S390_VM_CPU_FEAT_CEI	7
    128 #define KVM_S390_VM_CPU_FEAT_IBS	8
    129 #define KVM_S390_VM_CPU_FEAT_SKEY	9
    130 #define KVM_S390_VM_CPU_FEAT_CMMA	10
    131 #define KVM_S390_VM_CPU_FEAT_PFMFI	11
    132 #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
    133 #define KVM_S390_VM_CPU_FEAT_KSS	13
    134 struct kvm_s390_vm_cpu_feat {
    135 	__u64 feat[16];
    136 };
    137 
    138 #define KVM_S390_VM_CPU_PROCESSOR_SUBFUNC	4
    139 #define KVM_S390_VM_CPU_MACHINE_SUBFUNC		5
    140 /* for "test bit" instructions MSB 0 bit ordering, for "query" raw blocks */
    141 struct kvm_s390_vm_cpu_subfunc {
    142 	__u8 plo[32];		/* always */
    143 	__u8 ptff[16];		/* with TOD-clock steering */
    144 	__u8 kmac[16];		/* with MSA */
    145 	__u8 kmc[16];		/* with MSA */
    146 	__u8 km[16];		/* with MSA */
    147 	__u8 kimd[16];		/* with MSA */
    148 	__u8 klmd[16];		/* with MSA */
    149 	__u8 pckmo[16];		/* with MSA3 */
    150 	__u8 kmctr[16];		/* with MSA4 */
    151 	__u8 kmf[16];		/* with MSA4 */
    152 	__u8 kmo[16];		/* with MSA4 */
    153 	__u8 pcc[16];		/* with MSA4 */
    154 	__u8 ppno[16];		/* with MSA5 */
    155 	__u8 kma[16];		/* with MSA8 */
    156 	__u8 kdsa[16];		/* with MSA9 */
    157 	__u8 sortl[32];		/* with STFLE.150 */
    158 	__u8 dfltcc[32];	/* with STFLE.151 */
    159 	__u8 reserved[1728];
    160 };
    161 
    162 /* kvm attributes for crypto */
    163 #define KVM_S390_VM_CRYPTO_ENABLE_AES_KW	0
    164 #define KVM_S390_VM_CRYPTO_ENABLE_DEA_KW	1
    165 #define KVM_S390_VM_CRYPTO_DISABLE_AES_KW	2
    166 #define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW	3
    167 #define KVM_S390_VM_CRYPTO_ENABLE_APIE		4
    168 #define KVM_S390_VM_CRYPTO_DISABLE_APIE		5
    169 
    170 /* kvm attributes for migration mode */
    171 #define KVM_S390_VM_MIGRATION_STOP	0
    172 #define KVM_S390_VM_MIGRATION_START	1
    173 #define KVM_S390_VM_MIGRATION_STATUS	2
    174 
    175 /* for KVM_GET_REGS and KVM_SET_REGS */
    176 struct kvm_regs {
    177 	/* general purpose regs for s390 */
    178 	__u64 gprs[16];
    179 };
    180 
    181 /* for KVM_GET_SREGS and KVM_SET_SREGS */
    182 struct kvm_sregs {
    183 	__u32 acrs[16];
    184 	__u64 crs[16];
    185 };
    186 
    187 /* for KVM_GET_FPU and KVM_SET_FPU */
    188 struct kvm_fpu {
    189 	__u32 fpc;
    190 	__u64 fprs[16];
    191 };
    192 
    193 #define KVM_GUESTDBG_USE_HW_BP		0x00010000
    194 
    195 #define KVM_HW_BP			1
    196 #define KVM_HW_WP_WRITE			2
    197 #define KVM_SINGLESTEP			4
    198 
    199 struct kvm_debug_exit_arch {
    200 	__u64 addr;
    201 	__u8 type;
    202 	__u8 pad[7]; /* Should be set to 0 */
    203 };
    204 
    205 struct kvm_hw_breakpoint {
    206 	__u64 addr;
    207 	__u64 phys_addr;
    208 	__u64 len;
    209 	__u8 type;
    210 	__u8 pad[7]; /* Should be set to 0 */
    211 };
    212 
    213 /* for KVM_SET_GUEST_DEBUG */
    214 struct kvm_guest_debug_arch {
    215 	__u32 nr_hw_bp;
    216 	__u32 pad; /* Should be set to 0 */
    217 	struct kvm_hw_breakpoint *hw_bp;
    218 };
    219 
    220 /* for KVM_SYNC_PFAULT and KVM_REG_S390_PFTOKEN */
    221 #define KVM_S390_PFAULT_TOKEN_INVALID	0xffffffffffffffffULL
    222 
    223 #define KVM_SYNC_PREFIX (1UL << 0)
    224 #define KVM_SYNC_GPRS   (1UL << 1)
    225 #define KVM_SYNC_ACRS   (1UL << 2)
    226 #define KVM_SYNC_CRS    (1UL << 3)
    227 #define KVM_SYNC_ARCH0  (1UL << 4)
    228 #define KVM_SYNC_PFAULT (1UL << 5)
    229 #define KVM_SYNC_VRS    (1UL << 6)
    230 #define KVM_SYNC_RICCB  (1UL << 7)
    231 #define KVM_SYNC_FPRS   (1UL << 8)
    232 #define KVM_SYNC_GSCB   (1UL << 9)
    233 #define KVM_SYNC_BPBC   (1UL << 10)
    234 #define KVM_SYNC_ETOKEN (1UL << 11)
    235 #define KVM_SYNC_DIAG318 (1UL << 12)
    236 
    237 #define KVM_SYNC_S390_VALID_FIELDS \
    238 	(KVM_SYNC_PREFIX | KVM_SYNC_GPRS | KVM_SYNC_ACRS | KVM_SYNC_CRS | \
    239 	 KVM_SYNC_ARCH0 | KVM_SYNC_PFAULT | KVM_SYNC_VRS | KVM_SYNC_RICCB | \
    240 	 KVM_SYNC_FPRS | KVM_SYNC_GSCB | KVM_SYNC_BPBC | KVM_SYNC_ETOKEN | \
    241 	 KVM_SYNC_DIAG318)
    242 
    243 /* length and alignment of the sdnx as a power of two */
    244 #define SDNXC 8
    245 #define SDNXL (1UL << SDNXC)
    246 /* definition of registers in kvm_run */
    247 struct kvm_sync_regs {
    248 	__u64 prefix;	/* prefix register */
    249 	__u64 gprs[16];	/* general purpose registers */
    250 	__u32 acrs[16];	/* access registers */
    251 	__u64 crs[16];	/* control registers */
    252 	__u64 todpr;	/* tod programmable register [ARCH0] */
    253 	__u64 cputm;	/* cpu timer [ARCH0] */
    254 	__u64 ckc;	/* clock comparator [ARCH0] */
    255 	__u64 pp;	/* program parameter [ARCH0] */
    256 	__u64 gbea;	/* guest breaking-event address [ARCH0] */
    257 	__u64 pft;	/* pfault token [PFAULT] */
    258 	__u64 pfs;	/* pfault select [PFAULT] */
    259 	__u64 pfc;	/* pfault compare [PFAULT] */
    260 	union {
    261 		__u64 vrs[32][2];	/* vector registers (KVM_SYNC_VRS) */
    262 		__u64 fprs[16];		/* fp registers (KVM_SYNC_FPRS) */
    263 	};
    264 	__u8  reserved[512];	/* for future vector expansion */
    265 	__u32 fpc;		/* valid on KVM_SYNC_VRS or KVM_SYNC_FPRS */
    266 	__u8 bpbc : 1;		/* bp mode */
    267 	__u8 reserved2 : 7;
    268 	__u8 padding1[51];	/* riccb needs to be 64byte aligned */
    269 	__u8 riccb[64];		/* runtime instrumentation controls block */
    270 	__u64 diag318;		/* diagnose 0x318 info */
    271 	__u8 padding2[184];	/* sdnx needs to be 256byte aligned */
    272 	union {
    273 		__u8 sdnx[SDNXL];  /* state description annex */
    274 		struct {
    275 			__u64 reserved1[2];
    276 			__u64 gscb[4];
    277 			__u64 etoken;
    278 			__u64 etoken_extension;
    279 		};
    280 	};
    281 };
    282 
    283 #define KVM_REG_S390_TODPR	(KVM_REG_S390 | KVM_REG_SIZE_U32 | 0x1)
    284 #define KVM_REG_S390_EPOCHDIFF	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x2)
    285 #define KVM_REG_S390_CPU_TIMER  (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x3)
    286 #define KVM_REG_S390_CLOCK_COMP (KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x4)
    287 #define KVM_REG_S390_PFTOKEN	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x5)
    288 #define KVM_REG_S390_PFCOMPARE	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x6)
    289 #define KVM_REG_S390_PFSELECT	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x7)
    290 #define KVM_REG_S390_PP		(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x8)
    291 #define KVM_REG_S390_GBEA	(KVM_REG_S390 | KVM_REG_SIZE_U64 | 0x9)
    292 #endif