18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * definition for kernel virtual machines on s390 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright IBM Corp. 2008, 2018 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Author(s): Carsten Otte <cotte@de.ibm.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef ASM_KVM_HOST_H 128c2ecf20Sopenharmony_ci#define ASM_KVM_HOST_H 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/types.h> 158c2ecf20Sopenharmony_ci#include <linux/hrtimer.h> 168c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 178c2ecf20Sopenharmony_ci#include <linux/kvm_types.h> 188c2ecf20Sopenharmony_ci#include <linux/kvm_host.h> 198c2ecf20Sopenharmony_ci#include <linux/kvm.h> 208c2ecf20Sopenharmony_ci#include <linux/seqlock.h> 218c2ecf20Sopenharmony_ci#include <linux/module.h> 228c2ecf20Sopenharmony_ci#include <asm/debug.h> 238c2ecf20Sopenharmony_ci#include <asm/cpu.h> 248c2ecf20Sopenharmony_ci#include <asm/fpu/api.h> 258c2ecf20Sopenharmony_ci#include <asm/isc.h> 268c2ecf20Sopenharmony_ci#include <asm/guarded_storage.h> 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define KVM_S390_BSCA_CPU_SLOTS 64 298c2ecf20Sopenharmony_ci#define KVM_S390_ESCA_CPU_SLOTS 248 308c2ecf20Sopenharmony_ci#define KVM_MAX_VCPUS 255 318c2ecf20Sopenharmony_ci#define KVM_USER_MEM_SLOTS 32 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* 348c2ecf20Sopenharmony_ci * These seem to be used for allocating ->chip in the routing table, which we 358c2ecf20Sopenharmony_ci * don't use. 1 is as small as we can get to reduce the needed memory. If we 368c2ecf20Sopenharmony_ci * need to look at ->chip later on, we'll need to revisit this. 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci#define KVM_NR_IRQCHIPS 1 398c2ecf20Sopenharmony_ci#define KVM_IRQCHIP_NUM_PINS 1 408c2ecf20Sopenharmony_ci#define KVM_HALT_POLL_NS_DEFAULT 50000 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* s390-specific vcpu->requests bit members */ 438c2ecf20Sopenharmony_ci#define KVM_REQ_ENABLE_IBS KVM_ARCH_REQ(0) 448c2ecf20Sopenharmony_ci#define KVM_REQ_DISABLE_IBS KVM_ARCH_REQ(1) 458c2ecf20Sopenharmony_ci#define KVM_REQ_ICPT_OPEREXC KVM_ARCH_REQ(2) 468c2ecf20Sopenharmony_ci#define KVM_REQ_START_MIGRATION KVM_ARCH_REQ(3) 478c2ecf20Sopenharmony_ci#define KVM_REQ_STOP_MIGRATION KVM_ARCH_REQ(4) 488c2ecf20Sopenharmony_ci#define KVM_REQ_VSIE_RESTART KVM_ARCH_REQ(5) 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define SIGP_CTRL_C 0x80 518c2ecf20Sopenharmony_ci#define SIGP_CTRL_SCN_MASK 0x3f 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ciunion bsca_sigp_ctrl { 548c2ecf20Sopenharmony_ci __u8 value; 558c2ecf20Sopenharmony_ci struct { 568c2ecf20Sopenharmony_ci __u8 c : 1; 578c2ecf20Sopenharmony_ci __u8 r : 1; 588c2ecf20Sopenharmony_ci __u8 scn : 6; 598c2ecf20Sopenharmony_ci }; 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ciunion esca_sigp_ctrl { 638c2ecf20Sopenharmony_ci __u16 value; 648c2ecf20Sopenharmony_ci struct { 658c2ecf20Sopenharmony_ci __u8 c : 1; 668c2ecf20Sopenharmony_ci __u8 reserved: 7; 678c2ecf20Sopenharmony_ci __u8 scn; 688c2ecf20Sopenharmony_ci }; 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistruct esca_entry { 728c2ecf20Sopenharmony_ci union esca_sigp_ctrl sigp_ctrl; 738c2ecf20Sopenharmony_ci __u16 reserved1[3]; 748c2ecf20Sopenharmony_ci __u64 sda; 758c2ecf20Sopenharmony_ci __u64 reserved2[6]; 768c2ecf20Sopenharmony_ci}; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_cistruct bsca_entry { 798c2ecf20Sopenharmony_ci __u8 reserved0; 808c2ecf20Sopenharmony_ci union bsca_sigp_ctrl sigp_ctrl; 818c2ecf20Sopenharmony_ci __u16 reserved[3]; 828c2ecf20Sopenharmony_ci __u64 sda; 838c2ecf20Sopenharmony_ci __u64 reserved2[2]; 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ciunion ipte_control { 878c2ecf20Sopenharmony_ci unsigned long val; 888c2ecf20Sopenharmony_ci struct { 898c2ecf20Sopenharmony_ci unsigned long k : 1; 908c2ecf20Sopenharmony_ci unsigned long kh : 31; 918c2ecf20Sopenharmony_ci unsigned long kg : 32; 928c2ecf20Sopenharmony_ci }; 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cistruct bsca_block { 968c2ecf20Sopenharmony_ci union ipte_control ipte_control; 978c2ecf20Sopenharmony_ci __u64 reserved[5]; 988c2ecf20Sopenharmony_ci __u64 mcn; 998c2ecf20Sopenharmony_ci __u64 reserved2; 1008c2ecf20Sopenharmony_ci struct bsca_entry cpu[KVM_S390_BSCA_CPU_SLOTS]; 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistruct esca_block { 1048c2ecf20Sopenharmony_ci union ipte_control ipte_control; 1058c2ecf20Sopenharmony_ci __u64 reserved1[7]; 1068c2ecf20Sopenharmony_ci __u64 mcn[4]; 1078c2ecf20Sopenharmony_ci __u64 reserved2[20]; 1088c2ecf20Sopenharmony_ci struct esca_entry cpu[KVM_S390_ESCA_CPU_SLOTS]; 1098c2ecf20Sopenharmony_ci}; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci/* 1128c2ecf20Sopenharmony_ci * This struct is used to store some machine check info from lowcore 1138c2ecf20Sopenharmony_ci * for machine checks that happen while the guest is running. 1148c2ecf20Sopenharmony_ci * This info in host's lowcore might be overwritten by a second machine 1158c2ecf20Sopenharmony_ci * check from host when host is in the machine check's high-level handling. 1168c2ecf20Sopenharmony_ci * The size is 24 bytes. 1178c2ecf20Sopenharmony_ci */ 1188c2ecf20Sopenharmony_cistruct mcck_volatile_info { 1198c2ecf20Sopenharmony_ci __u64 mcic; 1208c2ecf20Sopenharmony_ci __u64 failing_storage_address; 1218c2ecf20Sopenharmony_ci __u32 ext_damage_code; 1228c2ecf20Sopenharmony_ci __u32 reserved; 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci#define CR0_INITIAL_MASK (CR0_UNUSED_56 | CR0_INTERRUPT_KEY_SUBMASK | \ 1268c2ecf20Sopenharmony_ci CR0_MEASUREMENT_ALERT_SUBMASK) 1278c2ecf20Sopenharmony_ci#define CR14_INITIAL_MASK (CR14_UNUSED_32 | CR14_UNUSED_33 | \ 1288c2ecf20Sopenharmony_ci CR14_EXTERNAL_DAMAGE_SUBMASK) 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci#define SIDAD_SIZE_MASK 0xff 1318c2ecf20Sopenharmony_ci#define sida_origin(sie_block) \ 1328c2ecf20Sopenharmony_ci ((sie_block)->sidad & PAGE_MASK) 1338c2ecf20Sopenharmony_ci#define sida_size(sie_block) \ 1348c2ecf20Sopenharmony_ci ((((sie_block)->sidad & SIDAD_SIZE_MASK) + 1) * PAGE_SIZE) 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci#define CPUSTAT_STOPPED 0x80000000 1378c2ecf20Sopenharmony_ci#define CPUSTAT_WAIT 0x10000000 1388c2ecf20Sopenharmony_ci#define CPUSTAT_ECALL_PEND 0x08000000 1398c2ecf20Sopenharmony_ci#define CPUSTAT_STOP_INT 0x04000000 1408c2ecf20Sopenharmony_ci#define CPUSTAT_IO_INT 0x02000000 1418c2ecf20Sopenharmony_ci#define CPUSTAT_EXT_INT 0x01000000 1428c2ecf20Sopenharmony_ci#define CPUSTAT_RUNNING 0x00800000 1438c2ecf20Sopenharmony_ci#define CPUSTAT_RETAINED 0x00400000 1448c2ecf20Sopenharmony_ci#define CPUSTAT_TIMING_SUB 0x00020000 1458c2ecf20Sopenharmony_ci#define CPUSTAT_SIE_SUB 0x00010000 1468c2ecf20Sopenharmony_ci#define CPUSTAT_RRF 0x00008000 1478c2ecf20Sopenharmony_ci#define CPUSTAT_SLSV 0x00004000 1488c2ecf20Sopenharmony_ci#define CPUSTAT_SLSR 0x00002000 1498c2ecf20Sopenharmony_ci#define CPUSTAT_ZARCH 0x00000800 1508c2ecf20Sopenharmony_ci#define CPUSTAT_MCDS 0x00000100 1518c2ecf20Sopenharmony_ci#define CPUSTAT_KSS 0x00000200 1528c2ecf20Sopenharmony_ci#define CPUSTAT_SM 0x00000080 1538c2ecf20Sopenharmony_ci#define CPUSTAT_IBS 0x00000040 1548c2ecf20Sopenharmony_ci#define CPUSTAT_GED2 0x00000010 1558c2ecf20Sopenharmony_ci#define CPUSTAT_G 0x00000008 1568c2ecf20Sopenharmony_ci#define CPUSTAT_GED 0x00000004 1578c2ecf20Sopenharmony_ci#define CPUSTAT_J 0x00000002 1588c2ecf20Sopenharmony_ci#define CPUSTAT_P 0x00000001 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistruct kvm_s390_sie_block { 1618c2ecf20Sopenharmony_ci atomic_t cpuflags; /* 0x0000 */ 1628c2ecf20Sopenharmony_ci __u32 : 1; /* 0x0004 */ 1638c2ecf20Sopenharmony_ci __u32 prefix : 18; 1648c2ecf20Sopenharmony_ci __u32 : 1; 1658c2ecf20Sopenharmony_ci __u32 ibc : 12; 1668c2ecf20Sopenharmony_ci __u8 reserved08[4]; /* 0x0008 */ 1678c2ecf20Sopenharmony_ci#define PROG_IN_SIE (1<<0) 1688c2ecf20Sopenharmony_ci __u32 prog0c; /* 0x000c */ 1698c2ecf20Sopenharmony_ci union { 1708c2ecf20Sopenharmony_ci __u8 reserved10[16]; /* 0x0010 */ 1718c2ecf20Sopenharmony_ci struct { 1728c2ecf20Sopenharmony_ci __u64 pv_handle_cpu; 1738c2ecf20Sopenharmony_ci __u64 pv_handle_config; 1748c2ecf20Sopenharmony_ci }; 1758c2ecf20Sopenharmony_ci }; 1768c2ecf20Sopenharmony_ci#define PROG_BLOCK_SIE (1<<0) 1778c2ecf20Sopenharmony_ci#define PROG_REQUEST (1<<1) 1788c2ecf20Sopenharmony_ci atomic_t prog20; /* 0x0020 */ 1798c2ecf20Sopenharmony_ci __u8 reserved24[4]; /* 0x0024 */ 1808c2ecf20Sopenharmony_ci __u64 cputm; /* 0x0028 */ 1818c2ecf20Sopenharmony_ci __u64 ckc; /* 0x0030 */ 1828c2ecf20Sopenharmony_ci __u64 epoch; /* 0x0038 */ 1838c2ecf20Sopenharmony_ci __u32 svcc; /* 0x0040 */ 1848c2ecf20Sopenharmony_ci#define LCTL_CR0 0x8000 1858c2ecf20Sopenharmony_ci#define LCTL_CR6 0x0200 1868c2ecf20Sopenharmony_ci#define LCTL_CR9 0x0040 1878c2ecf20Sopenharmony_ci#define LCTL_CR10 0x0020 1888c2ecf20Sopenharmony_ci#define LCTL_CR11 0x0010 1898c2ecf20Sopenharmony_ci#define LCTL_CR14 0x0002 1908c2ecf20Sopenharmony_ci __u16 lctl; /* 0x0044 */ 1918c2ecf20Sopenharmony_ci __s16 icpua; /* 0x0046 */ 1928c2ecf20Sopenharmony_ci#define ICTL_OPEREXC 0x80000000 1938c2ecf20Sopenharmony_ci#define ICTL_PINT 0x20000000 1948c2ecf20Sopenharmony_ci#define ICTL_LPSW 0x00400000 1958c2ecf20Sopenharmony_ci#define ICTL_STCTL 0x00040000 1968c2ecf20Sopenharmony_ci#define ICTL_ISKE 0x00004000 1978c2ecf20Sopenharmony_ci#define ICTL_SSKE 0x00002000 1988c2ecf20Sopenharmony_ci#define ICTL_RRBE 0x00001000 1998c2ecf20Sopenharmony_ci#define ICTL_TPROT 0x00000200 2008c2ecf20Sopenharmony_ci __u32 ictl; /* 0x0048 */ 2018c2ecf20Sopenharmony_ci#define ECA_CEI 0x80000000 2028c2ecf20Sopenharmony_ci#define ECA_IB 0x40000000 2038c2ecf20Sopenharmony_ci#define ECA_SIGPI 0x10000000 2048c2ecf20Sopenharmony_ci#define ECA_MVPGI 0x01000000 2058c2ecf20Sopenharmony_ci#define ECA_AIV 0x00200000 2068c2ecf20Sopenharmony_ci#define ECA_VX 0x00020000 2078c2ecf20Sopenharmony_ci#define ECA_PROTEXCI 0x00002000 2088c2ecf20Sopenharmony_ci#define ECA_APIE 0x00000008 2098c2ecf20Sopenharmony_ci#define ECA_SII 0x00000001 2108c2ecf20Sopenharmony_ci __u32 eca; /* 0x004c */ 2118c2ecf20Sopenharmony_ci#define ICPT_INST 0x04 2128c2ecf20Sopenharmony_ci#define ICPT_PROGI 0x08 2138c2ecf20Sopenharmony_ci#define ICPT_INSTPROGI 0x0C 2148c2ecf20Sopenharmony_ci#define ICPT_EXTREQ 0x10 2158c2ecf20Sopenharmony_ci#define ICPT_EXTINT 0x14 2168c2ecf20Sopenharmony_ci#define ICPT_IOREQ 0x18 2178c2ecf20Sopenharmony_ci#define ICPT_WAIT 0x1c 2188c2ecf20Sopenharmony_ci#define ICPT_VALIDITY 0x20 2198c2ecf20Sopenharmony_ci#define ICPT_STOP 0x28 2208c2ecf20Sopenharmony_ci#define ICPT_OPEREXC 0x2C 2218c2ecf20Sopenharmony_ci#define ICPT_PARTEXEC 0x38 2228c2ecf20Sopenharmony_ci#define ICPT_IOINST 0x40 2238c2ecf20Sopenharmony_ci#define ICPT_KSS 0x5c 2248c2ecf20Sopenharmony_ci#define ICPT_MCHKREQ 0x60 2258c2ecf20Sopenharmony_ci#define ICPT_INT_ENABLE 0x64 2268c2ecf20Sopenharmony_ci#define ICPT_PV_INSTR 0x68 2278c2ecf20Sopenharmony_ci#define ICPT_PV_NOTIFY 0x6c 2288c2ecf20Sopenharmony_ci#define ICPT_PV_PREF 0x70 2298c2ecf20Sopenharmony_ci __u8 icptcode; /* 0x0050 */ 2308c2ecf20Sopenharmony_ci __u8 icptstatus; /* 0x0051 */ 2318c2ecf20Sopenharmony_ci __u16 ihcpu; /* 0x0052 */ 2328c2ecf20Sopenharmony_ci __u8 reserved54; /* 0x0054 */ 2338c2ecf20Sopenharmony_ci#define IICTL_CODE_NONE 0x00 2348c2ecf20Sopenharmony_ci#define IICTL_CODE_MCHK 0x01 2358c2ecf20Sopenharmony_ci#define IICTL_CODE_EXT 0x02 2368c2ecf20Sopenharmony_ci#define IICTL_CODE_IO 0x03 2378c2ecf20Sopenharmony_ci#define IICTL_CODE_RESTART 0x04 2388c2ecf20Sopenharmony_ci#define IICTL_CODE_SPECIFICATION 0x10 2398c2ecf20Sopenharmony_ci#define IICTL_CODE_OPERAND 0x11 2408c2ecf20Sopenharmony_ci __u8 iictl; /* 0x0055 */ 2418c2ecf20Sopenharmony_ci __u16 ipa; /* 0x0056 */ 2428c2ecf20Sopenharmony_ci __u32 ipb; /* 0x0058 */ 2438c2ecf20Sopenharmony_ci __u32 scaoh; /* 0x005c */ 2448c2ecf20Sopenharmony_ci#define FPF_BPBC 0x20 2458c2ecf20Sopenharmony_ci __u8 fpf; /* 0x0060 */ 2468c2ecf20Sopenharmony_ci#define ECB_GS 0x40 2478c2ecf20Sopenharmony_ci#define ECB_TE 0x10 2488c2ecf20Sopenharmony_ci#define ECB_SRSI 0x04 2498c2ecf20Sopenharmony_ci#define ECB_HOSTPROTINT 0x02 2508c2ecf20Sopenharmony_ci __u8 ecb; /* 0x0061 */ 2518c2ecf20Sopenharmony_ci#define ECB2_CMMA 0x80 2528c2ecf20Sopenharmony_ci#define ECB2_IEP 0x20 2538c2ecf20Sopenharmony_ci#define ECB2_PFMFI 0x08 2548c2ecf20Sopenharmony_ci#define ECB2_ESCA 0x04 2558c2ecf20Sopenharmony_ci __u8 ecb2; /* 0x0062 */ 2568c2ecf20Sopenharmony_ci#define ECB3_DEA 0x08 2578c2ecf20Sopenharmony_ci#define ECB3_AES 0x04 2588c2ecf20Sopenharmony_ci#define ECB3_RI 0x01 2598c2ecf20Sopenharmony_ci __u8 ecb3; /* 0x0063 */ 2608c2ecf20Sopenharmony_ci __u32 scaol; /* 0x0064 */ 2618c2ecf20Sopenharmony_ci __u8 sdf; /* 0x0068 */ 2628c2ecf20Sopenharmony_ci __u8 epdx; /* 0x0069 */ 2638c2ecf20Sopenharmony_ci __u8 cpnc; /* 0x006a */ 2648c2ecf20Sopenharmony_ci __u8 reserved6b; /* 0x006b */ 2658c2ecf20Sopenharmony_ci __u32 todpr; /* 0x006c */ 2668c2ecf20Sopenharmony_ci#define GISA_FORMAT1 0x00000001 2678c2ecf20Sopenharmony_ci __u32 gd; /* 0x0070 */ 2688c2ecf20Sopenharmony_ci __u8 reserved74[12]; /* 0x0074 */ 2698c2ecf20Sopenharmony_ci __u64 mso; /* 0x0080 */ 2708c2ecf20Sopenharmony_ci __u64 msl; /* 0x0088 */ 2718c2ecf20Sopenharmony_ci psw_t gpsw; /* 0x0090 */ 2728c2ecf20Sopenharmony_ci __u64 gg14; /* 0x00a0 */ 2738c2ecf20Sopenharmony_ci __u64 gg15; /* 0x00a8 */ 2748c2ecf20Sopenharmony_ci __u8 reservedb0[8]; /* 0x00b0 */ 2758c2ecf20Sopenharmony_ci#define HPID_KVM 0x4 2768c2ecf20Sopenharmony_ci#define HPID_VSIE 0x5 2778c2ecf20Sopenharmony_ci __u8 hpid; /* 0x00b8 */ 2788c2ecf20Sopenharmony_ci __u8 reservedb9[7]; /* 0x00b9 */ 2798c2ecf20Sopenharmony_ci union { 2808c2ecf20Sopenharmony_ci struct { 2818c2ecf20Sopenharmony_ci __u32 eiparams; /* 0x00c0 */ 2828c2ecf20Sopenharmony_ci __u16 extcpuaddr; /* 0x00c4 */ 2838c2ecf20Sopenharmony_ci __u16 eic; /* 0x00c6 */ 2848c2ecf20Sopenharmony_ci }; 2858c2ecf20Sopenharmony_ci __u64 mcic; /* 0x00c0 */ 2868c2ecf20Sopenharmony_ci } __packed; 2878c2ecf20Sopenharmony_ci __u32 reservedc8; /* 0x00c8 */ 2888c2ecf20Sopenharmony_ci union { 2898c2ecf20Sopenharmony_ci struct { 2908c2ecf20Sopenharmony_ci __u16 pgmilc; /* 0x00cc */ 2918c2ecf20Sopenharmony_ci __u16 iprcc; /* 0x00ce */ 2928c2ecf20Sopenharmony_ci }; 2938c2ecf20Sopenharmony_ci __u32 edc; /* 0x00cc */ 2948c2ecf20Sopenharmony_ci } __packed; 2958c2ecf20Sopenharmony_ci union { 2968c2ecf20Sopenharmony_ci struct { 2978c2ecf20Sopenharmony_ci __u32 dxc; /* 0x00d0 */ 2988c2ecf20Sopenharmony_ci __u16 mcn; /* 0x00d4 */ 2998c2ecf20Sopenharmony_ci __u8 perc; /* 0x00d6 */ 3008c2ecf20Sopenharmony_ci __u8 peratmid; /* 0x00d7 */ 3018c2ecf20Sopenharmony_ci }; 3028c2ecf20Sopenharmony_ci __u64 faddr; /* 0x00d0 */ 3038c2ecf20Sopenharmony_ci } __packed; 3048c2ecf20Sopenharmony_ci __u64 peraddr; /* 0x00d8 */ 3058c2ecf20Sopenharmony_ci __u8 eai; /* 0x00e0 */ 3068c2ecf20Sopenharmony_ci __u8 peraid; /* 0x00e1 */ 3078c2ecf20Sopenharmony_ci __u8 oai; /* 0x00e2 */ 3088c2ecf20Sopenharmony_ci __u8 armid; /* 0x00e3 */ 3098c2ecf20Sopenharmony_ci __u8 reservede4[4]; /* 0x00e4 */ 3108c2ecf20Sopenharmony_ci union { 3118c2ecf20Sopenharmony_ci __u64 tecmc; /* 0x00e8 */ 3128c2ecf20Sopenharmony_ci struct { 3138c2ecf20Sopenharmony_ci __u16 subchannel_id; /* 0x00e8 */ 3148c2ecf20Sopenharmony_ci __u16 subchannel_nr; /* 0x00ea */ 3158c2ecf20Sopenharmony_ci __u32 io_int_parm; /* 0x00ec */ 3168c2ecf20Sopenharmony_ci __u32 io_int_word; /* 0x00f0 */ 3178c2ecf20Sopenharmony_ci }; 3188c2ecf20Sopenharmony_ci } __packed; 3198c2ecf20Sopenharmony_ci __u8 reservedf4[8]; /* 0x00f4 */ 3208c2ecf20Sopenharmony_ci#define CRYCB_FORMAT_MASK 0x00000003 3218c2ecf20Sopenharmony_ci#define CRYCB_FORMAT0 0x00000000 3228c2ecf20Sopenharmony_ci#define CRYCB_FORMAT1 0x00000001 3238c2ecf20Sopenharmony_ci#define CRYCB_FORMAT2 0x00000003 3248c2ecf20Sopenharmony_ci __u32 crycbd; /* 0x00fc */ 3258c2ecf20Sopenharmony_ci __u64 gcr[16]; /* 0x0100 */ 3268c2ecf20Sopenharmony_ci union { 3278c2ecf20Sopenharmony_ci __u64 gbea; /* 0x0180 */ 3288c2ecf20Sopenharmony_ci __u64 sidad; 3298c2ecf20Sopenharmony_ci }; 3308c2ecf20Sopenharmony_ci __u8 reserved188[8]; /* 0x0188 */ 3318c2ecf20Sopenharmony_ci __u64 sdnxo; /* 0x0190 */ 3328c2ecf20Sopenharmony_ci __u8 reserved198[8]; /* 0x0198 */ 3338c2ecf20Sopenharmony_ci __u32 fac; /* 0x01a0 */ 3348c2ecf20Sopenharmony_ci __u8 reserved1a4[20]; /* 0x01a4 */ 3358c2ecf20Sopenharmony_ci __u64 cbrlo; /* 0x01b8 */ 3368c2ecf20Sopenharmony_ci __u8 reserved1c0[8]; /* 0x01c0 */ 3378c2ecf20Sopenharmony_ci#define ECD_HOSTREGMGMT 0x20000000 3388c2ecf20Sopenharmony_ci#define ECD_MEF 0x08000000 3398c2ecf20Sopenharmony_ci#define ECD_ETOKENF 0x02000000 3408c2ecf20Sopenharmony_ci#define ECD_ECC 0x00200000 3418c2ecf20Sopenharmony_ci __u32 ecd; /* 0x01c8 */ 3428c2ecf20Sopenharmony_ci __u8 reserved1cc[18]; /* 0x01cc */ 3438c2ecf20Sopenharmony_ci __u64 pp; /* 0x01de */ 3448c2ecf20Sopenharmony_ci __u8 reserved1e6[2]; /* 0x01e6 */ 3458c2ecf20Sopenharmony_ci __u64 itdba; /* 0x01e8 */ 3468c2ecf20Sopenharmony_ci __u64 riccbd; /* 0x01f0 */ 3478c2ecf20Sopenharmony_ci __u64 gvrd; /* 0x01f8 */ 3488c2ecf20Sopenharmony_ci} __packed __aligned(512); 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_cistruct kvm_s390_itdb { 3518c2ecf20Sopenharmony_ci __u8 data[256]; 3528c2ecf20Sopenharmony_ci}; 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_cistruct sie_page { 3558c2ecf20Sopenharmony_ci struct kvm_s390_sie_block sie_block; 3568c2ecf20Sopenharmony_ci struct mcck_volatile_info mcck_info; /* 0x0200 */ 3578c2ecf20Sopenharmony_ci __u8 reserved218[360]; /* 0x0218 */ 3588c2ecf20Sopenharmony_ci __u64 pv_grregs[16]; /* 0x0380 */ 3598c2ecf20Sopenharmony_ci __u8 reserved400[512]; /* 0x0400 */ 3608c2ecf20Sopenharmony_ci struct kvm_s390_itdb itdb; /* 0x0600 */ 3618c2ecf20Sopenharmony_ci __u8 reserved700[2304]; /* 0x0700 */ 3628c2ecf20Sopenharmony_ci}; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_cistruct kvm_vcpu_stat { 3658c2ecf20Sopenharmony_ci u64 exit_userspace; 3668c2ecf20Sopenharmony_ci u64 exit_null; 3678c2ecf20Sopenharmony_ci u64 exit_external_request; 3688c2ecf20Sopenharmony_ci u64 exit_io_request; 3698c2ecf20Sopenharmony_ci u64 exit_external_interrupt; 3708c2ecf20Sopenharmony_ci u64 exit_stop_request; 3718c2ecf20Sopenharmony_ci u64 exit_validity; 3728c2ecf20Sopenharmony_ci u64 exit_instruction; 3738c2ecf20Sopenharmony_ci u64 exit_pei; 3748c2ecf20Sopenharmony_ci u64 halt_successful_poll; 3758c2ecf20Sopenharmony_ci u64 halt_attempted_poll; 3768c2ecf20Sopenharmony_ci u64 halt_poll_invalid; 3778c2ecf20Sopenharmony_ci u64 halt_no_poll_steal; 3788c2ecf20Sopenharmony_ci u64 halt_wakeup; 3798c2ecf20Sopenharmony_ci u64 halt_poll_success_ns; 3808c2ecf20Sopenharmony_ci u64 halt_poll_fail_ns; 3818c2ecf20Sopenharmony_ci u64 instruction_lctl; 3828c2ecf20Sopenharmony_ci u64 instruction_lctlg; 3838c2ecf20Sopenharmony_ci u64 instruction_stctl; 3848c2ecf20Sopenharmony_ci u64 instruction_stctg; 3858c2ecf20Sopenharmony_ci u64 exit_program_interruption; 3868c2ecf20Sopenharmony_ci u64 exit_instr_and_program; 3878c2ecf20Sopenharmony_ci u64 exit_operation_exception; 3888c2ecf20Sopenharmony_ci u64 deliver_ckc; 3898c2ecf20Sopenharmony_ci u64 deliver_cputm; 3908c2ecf20Sopenharmony_ci u64 deliver_external_call; 3918c2ecf20Sopenharmony_ci u64 deliver_emergency_signal; 3928c2ecf20Sopenharmony_ci u64 deliver_service_signal; 3938c2ecf20Sopenharmony_ci u64 deliver_virtio; 3948c2ecf20Sopenharmony_ci u64 deliver_stop_signal; 3958c2ecf20Sopenharmony_ci u64 deliver_prefix_signal; 3968c2ecf20Sopenharmony_ci u64 deliver_restart_signal; 3978c2ecf20Sopenharmony_ci u64 deliver_program; 3988c2ecf20Sopenharmony_ci u64 deliver_io; 3998c2ecf20Sopenharmony_ci u64 deliver_machine_check; 4008c2ecf20Sopenharmony_ci u64 exit_wait_state; 4018c2ecf20Sopenharmony_ci u64 inject_ckc; 4028c2ecf20Sopenharmony_ci u64 inject_cputm; 4038c2ecf20Sopenharmony_ci u64 inject_external_call; 4048c2ecf20Sopenharmony_ci u64 inject_emergency_signal; 4058c2ecf20Sopenharmony_ci u64 inject_mchk; 4068c2ecf20Sopenharmony_ci u64 inject_pfault_init; 4078c2ecf20Sopenharmony_ci u64 inject_program; 4088c2ecf20Sopenharmony_ci u64 inject_restart; 4098c2ecf20Sopenharmony_ci u64 inject_set_prefix; 4108c2ecf20Sopenharmony_ci u64 inject_stop_signal; 4118c2ecf20Sopenharmony_ci u64 instruction_epsw; 4128c2ecf20Sopenharmony_ci u64 instruction_gs; 4138c2ecf20Sopenharmony_ci u64 instruction_io_other; 4148c2ecf20Sopenharmony_ci u64 instruction_lpsw; 4158c2ecf20Sopenharmony_ci u64 instruction_lpswe; 4168c2ecf20Sopenharmony_ci u64 instruction_pfmf; 4178c2ecf20Sopenharmony_ci u64 instruction_ptff; 4188c2ecf20Sopenharmony_ci u64 instruction_sck; 4198c2ecf20Sopenharmony_ci u64 instruction_sckpf; 4208c2ecf20Sopenharmony_ci u64 instruction_stidp; 4218c2ecf20Sopenharmony_ci u64 instruction_spx; 4228c2ecf20Sopenharmony_ci u64 instruction_stpx; 4238c2ecf20Sopenharmony_ci u64 instruction_stap; 4248c2ecf20Sopenharmony_ci u64 instruction_iske; 4258c2ecf20Sopenharmony_ci u64 instruction_ri; 4268c2ecf20Sopenharmony_ci u64 instruction_rrbe; 4278c2ecf20Sopenharmony_ci u64 instruction_sske; 4288c2ecf20Sopenharmony_ci u64 instruction_ipte_interlock; 4298c2ecf20Sopenharmony_ci u64 instruction_stsi; 4308c2ecf20Sopenharmony_ci u64 instruction_stfl; 4318c2ecf20Sopenharmony_ci u64 instruction_tb; 4328c2ecf20Sopenharmony_ci u64 instruction_tpi; 4338c2ecf20Sopenharmony_ci u64 instruction_tprot; 4348c2ecf20Sopenharmony_ci u64 instruction_tsch; 4358c2ecf20Sopenharmony_ci u64 instruction_sie; 4368c2ecf20Sopenharmony_ci u64 instruction_essa; 4378c2ecf20Sopenharmony_ci u64 instruction_sthyi; 4388c2ecf20Sopenharmony_ci u64 instruction_sigp_sense; 4398c2ecf20Sopenharmony_ci u64 instruction_sigp_sense_running; 4408c2ecf20Sopenharmony_ci u64 instruction_sigp_external_call; 4418c2ecf20Sopenharmony_ci u64 instruction_sigp_emergency; 4428c2ecf20Sopenharmony_ci u64 instruction_sigp_cond_emergency; 4438c2ecf20Sopenharmony_ci u64 instruction_sigp_start; 4448c2ecf20Sopenharmony_ci u64 instruction_sigp_stop; 4458c2ecf20Sopenharmony_ci u64 instruction_sigp_stop_store_status; 4468c2ecf20Sopenharmony_ci u64 instruction_sigp_store_status; 4478c2ecf20Sopenharmony_ci u64 instruction_sigp_store_adtl_status; 4488c2ecf20Sopenharmony_ci u64 instruction_sigp_arch; 4498c2ecf20Sopenharmony_ci u64 instruction_sigp_prefix; 4508c2ecf20Sopenharmony_ci u64 instruction_sigp_restart; 4518c2ecf20Sopenharmony_ci u64 instruction_sigp_init_cpu_reset; 4528c2ecf20Sopenharmony_ci u64 instruction_sigp_cpu_reset; 4538c2ecf20Sopenharmony_ci u64 instruction_sigp_unknown; 4548c2ecf20Sopenharmony_ci u64 diagnose_10; 4558c2ecf20Sopenharmony_ci u64 diagnose_44; 4568c2ecf20Sopenharmony_ci u64 diagnose_9c; 4578c2ecf20Sopenharmony_ci u64 diagnose_9c_ignored; 4588c2ecf20Sopenharmony_ci u64 diagnose_258; 4598c2ecf20Sopenharmony_ci u64 diagnose_308; 4608c2ecf20Sopenharmony_ci u64 diagnose_500; 4618c2ecf20Sopenharmony_ci u64 diagnose_other; 4628c2ecf20Sopenharmony_ci}; 4638c2ecf20Sopenharmony_ci 4648c2ecf20Sopenharmony_ci#define PGM_OPERATION 0x01 4658c2ecf20Sopenharmony_ci#define PGM_PRIVILEGED_OP 0x02 4668c2ecf20Sopenharmony_ci#define PGM_EXECUTE 0x03 4678c2ecf20Sopenharmony_ci#define PGM_PROTECTION 0x04 4688c2ecf20Sopenharmony_ci#define PGM_ADDRESSING 0x05 4698c2ecf20Sopenharmony_ci#define PGM_SPECIFICATION 0x06 4708c2ecf20Sopenharmony_ci#define PGM_DATA 0x07 4718c2ecf20Sopenharmony_ci#define PGM_FIXED_POINT_OVERFLOW 0x08 4728c2ecf20Sopenharmony_ci#define PGM_FIXED_POINT_DIVIDE 0x09 4738c2ecf20Sopenharmony_ci#define PGM_DECIMAL_OVERFLOW 0x0a 4748c2ecf20Sopenharmony_ci#define PGM_DECIMAL_DIVIDE 0x0b 4758c2ecf20Sopenharmony_ci#define PGM_HFP_EXPONENT_OVERFLOW 0x0c 4768c2ecf20Sopenharmony_ci#define PGM_HFP_EXPONENT_UNDERFLOW 0x0d 4778c2ecf20Sopenharmony_ci#define PGM_HFP_SIGNIFICANCE 0x0e 4788c2ecf20Sopenharmony_ci#define PGM_HFP_DIVIDE 0x0f 4798c2ecf20Sopenharmony_ci#define PGM_SEGMENT_TRANSLATION 0x10 4808c2ecf20Sopenharmony_ci#define PGM_PAGE_TRANSLATION 0x11 4818c2ecf20Sopenharmony_ci#define PGM_TRANSLATION_SPEC 0x12 4828c2ecf20Sopenharmony_ci#define PGM_SPECIAL_OPERATION 0x13 4838c2ecf20Sopenharmony_ci#define PGM_OPERAND 0x15 4848c2ecf20Sopenharmony_ci#define PGM_TRACE_TABEL 0x16 4858c2ecf20Sopenharmony_ci#define PGM_VECTOR_PROCESSING 0x1b 4868c2ecf20Sopenharmony_ci#define PGM_SPACE_SWITCH 0x1c 4878c2ecf20Sopenharmony_ci#define PGM_HFP_SQUARE_ROOT 0x1d 4888c2ecf20Sopenharmony_ci#define PGM_PC_TRANSLATION_SPEC 0x1f 4898c2ecf20Sopenharmony_ci#define PGM_AFX_TRANSLATION 0x20 4908c2ecf20Sopenharmony_ci#define PGM_ASX_TRANSLATION 0x21 4918c2ecf20Sopenharmony_ci#define PGM_LX_TRANSLATION 0x22 4928c2ecf20Sopenharmony_ci#define PGM_EX_TRANSLATION 0x23 4938c2ecf20Sopenharmony_ci#define PGM_PRIMARY_AUTHORITY 0x24 4948c2ecf20Sopenharmony_ci#define PGM_SECONDARY_AUTHORITY 0x25 4958c2ecf20Sopenharmony_ci#define PGM_LFX_TRANSLATION 0x26 4968c2ecf20Sopenharmony_ci#define PGM_LSX_TRANSLATION 0x27 4978c2ecf20Sopenharmony_ci#define PGM_ALET_SPECIFICATION 0x28 4988c2ecf20Sopenharmony_ci#define PGM_ALEN_TRANSLATION 0x29 4998c2ecf20Sopenharmony_ci#define PGM_ALE_SEQUENCE 0x2a 5008c2ecf20Sopenharmony_ci#define PGM_ASTE_VALIDITY 0x2b 5018c2ecf20Sopenharmony_ci#define PGM_ASTE_SEQUENCE 0x2c 5028c2ecf20Sopenharmony_ci#define PGM_EXTENDED_AUTHORITY 0x2d 5038c2ecf20Sopenharmony_ci#define PGM_LSTE_SEQUENCE 0x2e 5048c2ecf20Sopenharmony_ci#define PGM_ASTE_INSTANCE 0x2f 5058c2ecf20Sopenharmony_ci#define PGM_STACK_FULL 0x30 5068c2ecf20Sopenharmony_ci#define PGM_STACK_EMPTY 0x31 5078c2ecf20Sopenharmony_ci#define PGM_STACK_SPECIFICATION 0x32 5088c2ecf20Sopenharmony_ci#define PGM_STACK_TYPE 0x33 5098c2ecf20Sopenharmony_ci#define PGM_STACK_OPERATION 0x34 5108c2ecf20Sopenharmony_ci#define PGM_ASCE_TYPE 0x38 5118c2ecf20Sopenharmony_ci#define PGM_REGION_FIRST_TRANS 0x39 5128c2ecf20Sopenharmony_ci#define PGM_REGION_SECOND_TRANS 0x3a 5138c2ecf20Sopenharmony_ci#define PGM_REGION_THIRD_TRANS 0x3b 5148c2ecf20Sopenharmony_ci#define PGM_MONITOR 0x40 5158c2ecf20Sopenharmony_ci#define PGM_PER 0x80 5168c2ecf20Sopenharmony_ci#define PGM_CRYPTO_OPERATION 0x119 5178c2ecf20Sopenharmony_ci 5188c2ecf20Sopenharmony_ci/* irq types in ascend order of priorities */ 5198c2ecf20Sopenharmony_cienum irq_types { 5208c2ecf20Sopenharmony_ci IRQ_PEND_SET_PREFIX = 0, 5218c2ecf20Sopenharmony_ci IRQ_PEND_RESTART, 5228c2ecf20Sopenharmony_ci IRQ_PEND_SIGP_STOP, 5238c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_7, 5248c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_6, 5258c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_5, 5268c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_4, 5278c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_3, 5288c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_2, 5298c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_1, 5308c2ecf20Sopenharmony_ci IRQ_PEND_IO_ISC_0, 5318c2ecf20Sopenharmony_ci IRQ_PEND_VIRTIO, 5328c2ecf20Sopenharmony_ci IRQ_PEND_PFAULT_DONE, 5338c2ecf20Sopenharmony_ci IRQ_PEND_PFAULT_INIT, 5348c2ecf20Sopenharmony_ci IRQ_PEND_EXT_HOST, 5358c2ecf20Sopenharmony_ci IRQ_PEND_EXT_SERVICE, 5368c2ecf20Sopenharmony_ci IRQ_PEND_EXT_SERVICE_EV, 5378c2ecf20Sopenharmony_ci IRQ_PEND_EXT_TIMING, 5388c2ecf20Sopenharmony_ci IRQ_PEND_EXT_CPU_TIMER, 5398c2ecf20Sopenharmony_ci IRQ_PEND_EXT_CLOCK_COMP, 5408c2ecf20Sopenharmony_ci IRQ_PEND_EXT_EXTERNAL, 5418c2ecf20Sopenharmony_ci IRQ_PEND_EXT_EMERGENCY, 5428c2ecf20Sopenharmony_ci IRQ_PEND_EXT_MALFUNC, 5438c2ecf20Sopenharmony_ci IRQ_PEND_EXT_IRQ_KEY, 5448c2ecf20Sopenharmony_ci IRQ_PEND_MCHK_REP, 5458c2ecf20Sopenharmony_ci IRQ_PEND_PROG, 5468c2ecf20Sopenharmony_ci IRQ_PEND_SVC, 5478c2ecf20Sopenharmony_ci IRQ_PEND_MCHK_EX, 5488c2ecf20Sopenharmony_ci IRQ_PEND_COUNT 5498c2ecf20Sopenharmony_ci}; 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_ci/* We have 2M for virtio device descriptor pages. Smallest amount of 5528c2ecf20Sopenharmony_ci * memory per page is 24 bytes (1 queue), so (2048*1024) / 24 = 87381 5538c2ecf20Sopenharmony_ci */ 5548c2ecf20Sopenharmony_ci#define KVM_S390_MAX_VIRTIO_IRQS 87381 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci/* 5578c2ecf20Sopenharmony_ci * Repressible (non-floating) machine check interrupts 5588c2ecf20Sopenharmony_ci * subclass bits in MCIC 5598c2ecf20Sopenharmony_ci */ 5608c2ecf20Sopenharmony_ci#define MCHK_EXTD_BIT 58 5618c2ecf20Sopenharmony_ci#define MCHK_DEGR_BIT 56 5628c2ecf20Sopenharmony_ci#define MCHK_WARN_BIT 55 5638c2ecf20Sopenharmony_ci#define MCHK_REP_MASK ((1UL << MCHK_DEGR_BIT) | \ 5648c2ecf20Sopenharmony_ci (1UL << MCHK_EXTD_BIT) | \ 5658c2ecf20Sopenharmony_ci (1UL << MCHK_WARN_BIT)) 5668c2ecf20Sopenharmony_ci 5678c2ecf20Sopenharmony_ci/* Exigent machine check interrupts subclass bits in MCIC */ 5688c2ecf20Sopenharmony_ci#define MCHK_SD_BIT 63 5698c2ecf20Sopenharmony_ci#define MCHK_PD_BIT 62 5708c2ecf20Sopenharmony_ci#define MCHK_EX_MASK ((1UL << MCHK_SD_BIT) | (1UL << MCHK_PD_BIT)) 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci#define IRQ_PEND_EXT_MASK ((1UL << IRQ_PEND_EXT_IRQ_KEY) | \ 5738c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_CLOCK_COMP) | \ 5748c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_CPU_TIMER) | \ 5758c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_MALFUNC) | \ 5768c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_EMERGENCY) | \ 5778c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_EXTERNAL) | \ 5788c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_TIMING) | \ 5798c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_HOST) | \ 5808c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_SERVICE) | \ 5818c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_SERVICE_EV) | \ 5828c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_VIRTIO) | \ 5838c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_PFAULT_INIT) | \ 5848c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_PFAULT_DONE)) 5858c2ecf20Sopenharmony_ci 5868c2ecf20Sopenharmony_ci#define IRQ_PEND_IO_MASK ((1UL << IRQ_PEND_IO_ISC_0) | \ 5878c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_1) | \ 5888c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_2) | \ 5898c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_3) | \ 5908c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_4) | \ 5918c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_5) | \ 5928c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_6) | \ 5938c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_IO_ISC_7)) 5948c2ecf20Sopenharmony_ci 5958c2ecf20Sopenharmony_ci#define IRQ_PEND_MCHK_MASK ((1UL << IRQ_PEND_MCHK_REP) | \ 5968c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_MCHK_EX)) 5978c2ecf20Sopenharmony_ci 5988c2ecf20Sopenharmony_ci#define IRQ_PEND_EXT_II_MASK ((1UL << IRQ_PEND_EXT_CPU_TIMER) | \ 5998c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_CLOCK_COMP) | \ 6008c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_EMERGENCY) | \ 6018c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_EXTERNAL) | \ 6028c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_SERVICE) | \ 6038c2ecf20Sopenharmony_ci (1UL << IRQ_PEND_EXT_SERVICE_EV)) 6048c2ecf20Sopenharmony_ci 6058c2ecf20Sopenharmony_cistruct kvm_s390_interrupt_info { 6068c2ecf20Sopenharmony_ci struct list_head list; 6078c2ecf20Sopenharmony_ci u64 type; 6088c2ecf20Sopenharmony_ci union { 6098c2ecf20Sopenharmony_ci struct kvm_s390_io_info io; 6108c2ecf20Sopenharmony_ci struct kvm_s390_ext_info ext; 6118c2ecf20Sopenharmony_ci struct kvm_s390_pgm_info pgm; 6128c2ecf20Sopenharmony_ci struct kvm_s390_emerg_info emerg; 6138c2ecf20Sopenharmony_ci struct kvm_s390_extcall_info extcall; 6148c2ecf20Sopenharmony_ci struct kvm_s390_prefix_info prefix; 6158c2ecf20Sopenharmony_ci struct kvm_s390_stop_info stop; 6168c2ecf20Sopenharmony_ci struct kvm_s390_mchk_info mchk; 6178c2ecf20Sopenharmony_ci }; 6188c2ecf20Sopenharmony_ci}; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_cistruct kvm_s390_irq_payload { 6218c2ecf20Sopenharmony_ci struct kvm_s390_io_info io; 6228c2ecf20Sopenharmony_ci struct kvm_s390_ext_info ext; 6238c2ecf20Sopenharmony_ci struct kvm_s390_pgm_info pgm; 6248c2ecf20Sopenharmony_ci struct kvm_s390_emerg_info emerg; 6258c2ecf20Sopenharmony_ci struct kvm_s390_extcall_info extcall; 6268c2ecf20Sopenharmony_ci struct kvm_s390_prefix_info prefix; 6278c2ecf20Sopenharmony_ci struct kvm_s390_stop_info stop; 6288c2ecf20Sopenharmony_ci struct kvm_s390_mchk_info mchk; 6298c2ecf20Sopenharmony_ci}; 6308c2ecf20Sopenharmony_ci 6318c2ecf20Sopenharmony_cistruct kvm_s390_local_interrupt { 6328c2ecf20Sopenharmony_ci spinlock_t lock; 6338c2ecf20Sopenharmony_ci DECLARE_BITMAP(sigp_emerg_pending, KVM_MAX_VCPUS); 6348c2ecf20Sopenharmony_ci struct kvm_s390_irq_payload irq; 6358c2ecf20Sopenharmony_ci unsigned long pending_irqs; 6368c2ecf20Sopenharmony_ci}; 6378c2ecf20Sopenharmony_ci 6388c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_0 0 6398c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_1 1 6408c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_2 2 6418c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_3 3 6428c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_4 4 6438c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_5 5 6448c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_6 6 6458c2ecf20Sopenharmony_ci#define FIRQ_LIST_IO_ISC_7 7 6468c2ecf20Sopenharmony_ci#define FIRQ_LIST_PFAULT 8 6478c2ecf20Sopenharmony_ci#define FIRQ_LIST_VIRTIO 9 6488c2ecf20Sopenharmony_ci#define FIRQ_LIST_COUNT 10 6498c2ecf20Sopenharmony_ci#define FIRQ_CNTR_IO 0 6508c2ecf20Sopenharmony_ci#define FIRQ_CNTR_SERVICE 1 6518c2ecf20Sopenharmony_ci#define FIRQ_CNTR_VIRTIO 2 6528c2ecf20Sopenharmony_ci#define FIRQ_CNTR_PFAULT 3 6538c2ecf20Sopenharmony_ci#define FIRQ_MAX_COUNT 4 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci/* mask the AIS mode for a given ISC */ 6568c2ecf20Sopenharmony_ci#define AIS_MODE_MASK(isc) (0x80 >> isc) 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci#define KVM_S390_AIS_MODE_ALL 0 6598c2ecf20Sopenharmony_ci#define KVM_S390_AIS_MODE_SINGLE 1 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_cistruct kvm_s390_float_interrupt { 6628c2ecf20Sopenharmony_ci unsigned long pending_irqs; 6638c2ecf20Sopenharmony_ci unsigned long masked_irqs; 6648c2ecf20Sopenharmony_ci spinlock_t lock; 6658c2ecf20Sopenharmony_ci struct list_head lists[FIRQ_LIST_COUNT]; 6668c2ecf20Sopenharmony_ci int counters[FIRQ_MAX_COUNT]; 6678c2ecf20Sopenharmony_ci struct kvm_s390_mchk_info mchk; 6688c2ecf20Sopenharmony_ci struct kvm_s390_ext_info srv_signal; 6698c2ecf20Sopenharmony_ci int next_rr_cpu; 6708c2ecf20Sopenharmony_ci struct mutex ais_lock; 6718c2ecf20Sopenharmony_ci u8 simm; 6728c2ecf20Sopenharmony_ci u8 nimm; 6738c2ecf20Sopenharmony_ci}; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_cistruct kvm_hw_wp_info_arch { 6768c2ecf20Sopenharmony_ci unsigned long addr; 6778c2ecf20Sopenharmony_ci unsigned long phys_addr; 6788c2ecf20Sopenharmony_ci int len; 6798c2ecf20Sopenharmony_ci char *old_data; 6808c2ecf20Sopenharmony_ci}; 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_cistruct kvm_hw_bp_info_arch { 6838c2ecf20Sopenharmony_ci unsigned long addr; 6848c2ecf20Sopenharmony_ci int len; 6858c2ecf20Sopenharmony_ci}; 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_ci/* 6888c2ecf20Sopenharmony_ci * Only the upper 16 bits of kvm_guest_debug->control are arch specific. 6898c2ecf20Sopenharmony_ci * Further KVM_GUESTDBG flags which an be used from userspace can be found in 6908c2ecf20Sopenharmony_ci * arch/s390/include/uapi/asm/kvm.h 6918c2ecf20Sopenharmony_ci */ 6928c2ecf20Sopenharmony_ci#define KVM_GUESTDBG_EXIT_PENDING 0x10000000 6938c2ecf20Sopenharmony_ci 6948c2ecf20Sopenharmony_ci#define guestdbg_enabled(vcpu) \ 6958c2ecf20Sopenharmony_ci (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) 6968c2ecf20Sopenharmony_ci#define guestdbg_sstep_enabled(vcpu) \ 6978c2ecf20Sopenharmony_ci (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) 6988c2ecf20Sopenharmony_ci#define guestdbg_hw_bp_enabled(vcpu) \ 6998c2ecf20Sopenharmony_ci (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) 7008c2ecf20Sopenharmony_ci#define guestdbg_exit_pending(vcpu) (guestdbg_enabled(vcpu) && \ 7018c2ecf20Sopenharmony_ci (vcpu->guest_debug & KVM_GUESTDBG_EXIT_PENDING)) 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_cistruct kvm_guestdbg_info_arch { 7048c2ecf20Sopenharmony_ci unsigned long cr0; 7058c2ecf20Sopenharmony_ci unsigned long cr9; 7068c2ecf20Sopenharmony_ci unsigned long cr10; 7078c2ecf20Sopenharmony_ci unsigned long cr11; 7088c2ecf20Sopenharmony_ci struct kvm_hw_bp_info_arch *hw_bp_info; 7098c2ecf20Sopenharmony_ci struct kvm_hw_wp_info_arch *hw_wp_info; 7108c2ecf20Sopenharmony_ci int nr_hw_bp; 7118c2ecf20Sopenharmony_ci int nr_hw_wp; 7128c2ecf20Sopenharmony_ci unsigned long last_bp; 7138c2ecf20Sopenharmony_ci}; 7148c2ecf20Sopenharmony_ci 7158c2ecf20Sopenharmony_cistruct kvm_s390_pv_vcpu { 7168c2ecf20Sopenharmony_ci u64 handle; 7178c2ecf20Sopenharmony_ci unsigned long stor_base; 7188c2ecf20Sopenharmony_ci}; 7198c2ecf20Sopenharmony_ci 7208c2ecf20Sopenharmony_cistruct kvm_vcpu_arch { 7218c2ecf20Sopenharmony_ci struct kvm_s390_sie_block *sie_block; 7228c2ecf20Sopenharmony_ci /* if vsie is active, currently executed shadow sie control block */ 7238c2ecf20Sopenharmony_ci struct kvm_s390_sie_block *vsie_block; 7248c2ecf20Sopenharmony_ci unsigned int host_acrs[NUM_ACRS]; 7258c2ecf20Sopenharmony_ci struct gs_cb *host_gscb; 7268c2ecf20Sopenharmony_ci struct fpu host_fpregs; 7278c2ecf20Sopenharmony_ci struct kvm_s390_local_interrupt local_int; 7288c2ecf20Sopenharmony_ci struct hrtimer ckc_timer; 7298c2ecf20Sopenharmony_ci struct kvm_s390_pgm_info pgm; 7308c2ecf20Sopenharmony_ci struct gmap *gmap; 7318c2ecf20Sopenharmony_ci /* backup location for the currently enabled gmap when scheduled out */ 7328c2ecf20Sopenharmony_ci struct gmap *enabled_gmap; 7338c2ecf20Sopenharmony_ci struct kvm_guestdbg_info_arch guestdbg; 7348c2ecf20Sopenharmony_ci unsigned long pfault_token; 7358c2ecf20Sopenharmony_ci unsigned long pfault_select; 7368c2ecf20Sopenharmony_ci unsigned long pfault_compare; 7378c2ecf20Sopenharmony_ci bool cputm_enabled; 7388c2ecf20Sopenharmony_ci /* 7398c2ecf20Sopenharmony_ci * The seqcount protects updates to cputm_start and sie_block.cputm, 7408c2ecf20Sopenharmony_ci * this way we can have non-blocking reads with consistent values. 7418c2ecf20Sopenharmony_ci * Only the owning VCPU thread (vcpu->cpu) is allowed to change these 7428c2ecf20Sopenharmony_ci * values and to start/stop/enable/disable cpu timer accounting. 7438c2ecf20Sopenharmony_ci */ 7448c2ecf20Sopenharmony_ci seqcount_t cputm_seqcount; 7458c2ecf20Sopenharmony_ci __u64 cputm_start; 7468c2ecf20Sopenharmony_ci bool gs_enabled; 7478c2ecf20Sopenharmony_ci bool skey_enabled; 7488c2ecf20Sopenharmony_ci struct kvm_s390_pv_vcpu pv; 7498c2ecf20Sopenharmony_ci union diag318_info diag318_info; 7508c2ecf20Sopenharmony_ci}; 7518c2ecf20Sopenharmony_ci 7528c2ecf20Sopenharmony_cistruct kvm_vm_stat { 7538c2ecf20Sopenharmony_ci u64 inject_io; 7548c2ecf20Sopenharmony_ci u64 inject_float_mchk; 7558c2ecf20Sopenharmony_ci u64 inject_pfault_done; 7568c2ecf20Sopenharmony_ci u64 inject_service_signal; 7578c2ecf20Sopenharmony_ci u64 inject_virtio; 7588c2ecf20Sopenharmony_ci u64 remote_tlb_flush; 7598c2ecf20Sopenharmony_ci}; 7608c2ecf20Sopenharmony_ci 7618c2ecf20Sopenharmony_cistruct kvm_arch_memory_slot { 7628c2ecf20Sopenharmony_ci}; 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_cistruct s390_map_info { 7658c2ecf20Sopenharmony_ci struct list_head list; 7668c2ecf20Sopenharmony_ci __u64 guest_addr; 7678c2ecf20Sopenharmony_ci __u64 addr; 7688c2ecf20Sopenharmony_ci struct page *page; 7698c2ecf20Sopenharmony_ci}; 7708c2ecf20Sopenharmony_ci 7718c2ecf20Sopenharmony_cistruct s390_io_adapter { 7728c2ecf20Sopenharmony_ci unsigned int id; 7738c2ecf20Sopenharmony_ci int isc; 7748c2ecf20Sopenharmony_ci bool maskable; 7758c2ecf20Sopenharmony_ci bool masked; 7768c2ecf20Sopenharmony_ci bool swap; 7778c2ecf20Sopenharmony_ci bool suppressible; 7788c2ecf20Sopenharmony_ci}; 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ci#define MAX_S390_IO_ADAPTERS ((MAX_ISC + 1) * 8) 7818c2ecf20Sopenharmony_ci#define MAX_S390_ADAPTER_MAPS 256 7828c2ecf20Sopenharmony_ci 7838c2ecf20Sopenharmony_ci/* maximum size of facilities and facility mask is 2k bytes */ 7848c2ecf20Sopenharmony_ci#define S390_ARCH_FAC_LIST_SIZE_BYTE (1<<11) 7858c2ecf20Sopenharmony_ci#define S390_ARCH_FAC_LIST_SIZE_U64 \ 7868c2ecf20Sopenharmony_ci (S390_ARCH_FAC_LIST_SIZE_BYTE / sizeof(u64)) 7878c2ecf20Sopenharmony_ci#define S390_ARCH_FAC_MASK_SIZE_BYTE S390_ARCH_FAC_LIST_SIZE_BYTE 7888c2ecf20Sopenharmony_ci#define S390_ARCH_FAC_MASK_SIZE_U64 \ 7898c2ecf20Sopenharmony_ci (S390_ARCH_FAC_MASK_SIZE_BYTE / sizeof(u64)) 7908c2ecf20Sopenharmony_ci 7918c2ecf20Sopenharmony_cistruct kvm_s390_cpu_model { 7928c2ecf20Sopenharmony_ci /* facility mask supported by kvm & hosting machine */ 7938c2ecf20Sopenharmony_ci __u64 fac_mask[S390_ARCH_FAC_LIST_SIZE_U64]; 7948c2ecf20Sopenharmony_ci struct kvm_s390_vm_cpu_subfunc subfuncs; 7958c2ecf20Sopenharmony_ci /* facility list requested by guest (in dma page) */ 7968c2ecf20Sopenharmony_ci __u64 *fac_list; 7978c2ecf20Sopenharmony_ci u64 cpuid; 7988c2ecf20Sopenharmony_ci unsigned short ibc; 7998c2ecf20Sopenharmony_ci}; 8008c2ecf20Sopenharmony_ci 8018c2ecf20Sopenharmony_cistruct kvm_s390_module_hook { 8028c2ecf20Sopenharmony_ci int (*hook)(struct kvm_vcpu *vcpu); 8038c2ecf20Sopenharmony_ci struct module *owner; 8048c2ecf20Sopenharmony_ci}; 8058c2ecf20Sopenharmony_ci 8068c2ecf20Sopenharmony_cistruct kvm_s390_crypto { 8078c2ecf20Sopenharmony_ci struct kvm_s390_crypto_cb *crycb; 8088c2ecf20Sopenharmony_ci struct kvm_s390_module_hook *pqap_hook; 8098c2ecf20Sopenharmony_ci __u32 crycbd; 8108c2ecf20Sopenharmony_ci __u8 aes_kw; 8118c2ecf20Sopenharmony_ci __u8 dea_kw; 8128c2ecf20Sopenharmony_ci __u8 apie; 8138c2ecf20Sopenharmony_ci}; 8148c2ecf20Sopenharmony_ci 8158c2ecf20Sopenharmony_ci#define APCB0_MASK_SIZE 1 8168c2ecf20Sopenharmony_cistruct kvm_s390_apcb0 { 8178c2ecf20Sopenharmony_ci __u64 apm[APCB0_MASK_SIZE]; /* 0x0000 */ 8188c2ecf20Sopenharmony_ci __u64 aqm[APCB0_MASK_SIZE]; /* 0x0008 */ 8198c2ecf20Sopenharmony_ci __u64 adm[APCB0_MASK_SIZE]; /* 0x0010 */ 8208c2ecf20Sopenharmony_ci __u64 reserved18; /* 0x0018 */ 8218c2ecf20Sopenharmony_ci}; 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci#define APCB1_MASK_SIZE 4 8248c2ecf20Sopenharmony_cistruct kvm_s390_apcb1 { 8258c2ecf20Sopenharmony_ci __u64 apm[APCB1_MASK_SIZE]; /* 0x0000 */ 8268c2ecf20Sopenharmony_ci __u64 aqm[APCB1_MASK_SIZE]; /* 0x0020 */ 8278c2ecf20Sopenharmony_ci __u64 adm[APCB1_MASK_SIZE]; /* 0x0040 */ 8288c2ecf20Sopenharmony_ci __u64 reserved60[4]; /* 0x0060 */ 8298c2ecf20Sopenharmony_ci}; 8308c2ecf20Sopenharmony_ci 8318c2ecf20Sopenharmony_cistruct kvm_s390_crypto_cb { 8328c2ecf20Sopenharmony_ci struct kvm_s390_apcb0 apcb0; /* 0x0000 */ 8338c2ecf20Sopenharmony_ci __u8 reserved20[0x0048 - 0x0020]; /* 0x0020 */ 8348c2ecf20Sopenharmony_ci __u8 dea_wrapping_key_mask[24]; /* 0x0048 */ 8358c2ecf20Sopenharmony_ci __u8 aes_wrapping_key_mask[32]; /* 0x0060 */ 8368c2ecf20Sopenharmony_ci struct kvm_s390_apcb1 apcb1; /* 0x0080 */ 8378c2ecf20Sopenharmony_ci}; 8388c2ecf20Sopenharmony_ci 8398c2ecf20Sopenharmony_cistruct kvm_s390_gisa { 8408c2ecf20Sopenharmony_ci union { 8418c2ecf20Sopenharmony_ci struct { /* common to all formats */ 8428c2ecf20Sopenharmony_ci u32 next_alert; 8438c2ecf20Sopenharmony_ci u8 ipm; 8448c2ecf20Sopenharmony_ci u8 reserved01[2]; 8458c2ecf20Sopenharmony_ci u8 iam; 8468c2ecf20Sopenharmony_ci }; 8478c2ecf20Sopenharmony_ci struct { /* format 0 */ 8488c2ecf20Sopenharmony_ci u32 next_alert; 8498c2ecf20Sopenharmony_ci u8 ipm; 8508c2ecf20Sopenharmony_ci u8 reserved01; 8518c2ecf20Sopenharmony_ci u8 : 6; 8528c2ecf20Sopenharmony_ci u8 g : 1; 8538c2ecf20Sopenharmony_ci u8 c : 1; 8548c2ecf20Sopenharmony_ci u8 iam; 8558c2ecf20Sopenharmony_ci u8 reserved02[4]; 8568c2ecf20Sopenharmony_ci u32 airq_count; 8578c2ecf20Sopenharmony_ci } g0; 8588c2ecf20Sopenharmony_ci struct { /* format 1 */ 8598c2ecf20Sopenharmony_ci u32 next_alert; 8608c2ecf20Sopenharmony_ci u8 ipm; 8618c2ecf20Sopenharmony_ci u8 simm; 8628c2ecf20Sopenharmony_ci u8 nimm; 8638c2ecf20Sopenharmony_ci u8 iam; 8648c2ecf20Sopenharmony_ci u8 aism[8]; 8658c2ecf20Sopenharmony_ci u8 : 6; 8668c2ecf20Sopenharmony_ci u8 g : 1; 8678c2ecf20Sopenharmony_ci u8 c : 1; 8688c2ecf20Sopenharmony_ci u8 reserved03[11]; 8698c2ecf20Sopenharmony_ci u32 airq_count; 8708c2ecf20Sopenharmony_ci } g1; 8718c2ecf20Sopenharmony_ci struct { 8728c2ecf20Sopenharmony_ci u64 word[4]; 8738c2ecf20Sopenharmony_ci } u64; 8748c2ecf20Sopenharmony_ci }; 8758c2ecf20Sopenharmony_ci}; 8768c2ecf20Sopenharmony_ci 8778c2ecf20Sopenharmony_cistruct kvm_s390_gib { 8788c2ecf20Sopenharmony_ci u32 alert_list_origin; 8798c2ecf20Sopenharmony_ci u32 reserved01; 8808c2ecf20Sopenharmony_ci u8:5; 8818c2ecf20Sopenharmony_ci u8 nisc:3; 8828c2ecf20Sopenharmony_ci u8 reserved03[3]; 8838c2ecf20Sopenharmony_ci u32 reserved04[5]; 8848c2ecf20Sopenharmony_ci}; 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_ci/* 8878c2ecf20Sopenharmony_ci * sie_page2 has to be allocated as DMA because fac_list, crycb and 8888c2ecf20Sopenharmony_ci * gisa need 31bit addresses in the sie control block. 8898c2ecf20Sopenharmony_ci */ 8908c2ecf20Sopenharmony_cistruct sie_page2 { 8918c2ecf20Sopenharmony_ci __u64 fac_list[S390_ARCH_FAC_LIST_SIZE_U64]; /* 0x0000 */ 8928c2ecf20Sopenharmony_ci struct kvm_s390_crypto_cb crycb; /* 0x0800 */ 8938c2ecf20Sopenharmony_ci struct kvm_s390_gisa gisa; /* 0x0900 */ 8948c2ecf20Sopenharmony_ci struct kvm *kvm; /* 0x0920 */ 8958c2ecf20Sopenharmony_ci u8 reserved928[0x1000 - 0x928]; /* 0x0928 */ 8968c2ecf20Sopenharmony_ci}; 8978c2ecf20Sopenharmony_ci 8988c2ecf20Sopenharmony_cistruct kvm_s390_vsie { 8998c2ecf20Sopenharmony_ci struct mutex mutex; 9008c2ecf20Sopenharmony_ci struct radix_tree_root addr_to_page; 9018c2ecf20Sopenharmony_ci int page_count; 9028c2ecf20Sopenharmony_ci int next; 9038c2ecf20Sopenharmony_ci struct page *pages[KVM_MAX_VCPUS]; 9048c2ecf20Sopenharmony_ci}; 9058c2ecf20Sopenharmony_ci 9068c2ecf20Sopenharmony_cistruct kvm_s390_gisa_iam { 9078c2ecf20Sopenharmony_ci u8 mask; 9088c2ecf20Sopenharmony_ci spinlock_t ref_lock; 9098c2ecf20Sopenharmony_ci u32 ref_count[MAX_ISC + 1]; 9108c2ecf20Sopenharmony_ci}; 9118c2ecf20Sopenharmony_ci 9128c2ecf20Sopenharmony_cistruct kvm_s390_gisa_interrupt { 9138c2ecf20Sopenharmony_ci struct kvm_s390_gisa *origin; 9148c2ecf20Sopenharmony_ci struct kvm_s390_gisa_iam alert; 9158c2ecf20Sopenharmony_ci struct hrtimer timer; 9168c2ecf20Sopenharmony_ci u64 expires; 9178c2ecf20Sopenharmony_ci DECLARE_BITMAP(kicked_mask, KVM_MAX_VCPUS); 9188c2ecf20Sopenharmony_ci}; 9198c2ecf20Sopenharmony_ci 9208c2ecf20Sopenharmony_cistruct kvm_s390_pv { 9218c2ecf20Sopenharmony_ci u64 handle; 9228c2ecf20Sopenharmony_ci u64 guest_len; 9238c2ecf20Sopenharmony_ci unsigned long stor_base; 9248c2ecf20Sopenharmony_ci void *stor_var; 9258c2ecf20Sopenharmony_ci}; 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_cistruct kvm_arch{ 9288c2ecf20Sopenharmony_ci void *sca; 9298c2ecf20Sopenharmony_ci int use_esca; 9308c2ecf20Sopenharmony_ci rwlock_t sca_lock; 9318c2ecf20Sopenharmony_ci debug_info_t *dbf; 9328c2ecf20Sopenharmony_ci struct kvm_s390_float_interrupt float_int; 9338c2ecf20Sopenharmony_ci struct kvm_device *flic; 9348c2ecf20Sopenharmony_ci struct gmap *gmap; 9358c2ecf20Sopenharmony_ci unsigned long mem_limit; 9368c2ecf20Sopenharmony_ci int css_support; 9378c2ecf20Sopenharmony_ci int use_irqchip; 9388c2ecf20Sopenharmony_ci int use_cmma; 9398c2ecf20Sopenharmony_ci int use_pfmfi; 9408c2ecf20Sopenharmony_ci int use_skf; 9418c2ecf20Sopenharmony_ci int user_cpu_state_ctrl; 9428c2ecf20Sopenharmony_ci int user_sigp; 9438c2ecf20Sopenharmony_ci int user_stsi; 9448c2ecf20Sopenharmony_ci int user_instr0; 9458c2ecf20Sopenharmony_ci struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS]; 9468c2ecf20Sopenharmony_ci wait_queue_head_t ipte_wq; 9478c2ecf20Sopenharmony_ci int ipte_lock_count; 9488c2ecf20Sopenharmony_ci struct mutex ipte_mutex; 9498c2ecf20Sopenharmony_ci spinlock_t start_stop_lock; 9508c2ecf20Sopenharmony_ci struct sie_page2 *sie_page2; 9518c2ecf20Sopenharmony_ci struct kvm_s390_cpu_model model; 9528c2ecf20Sopenharmony_ci struct kvm_s390_crypto crypto; 9538c2ecf20Sopenharmony_ci struct kvm_s390_vsie vsie; 9548c2ecf20Sopenharmony_ci u8 epdx; 9558c2ecf20Sopenharmony_ci u64 epoch; 9568c2ecf20Sopenharmony_ci int migration_mode; 9578c2ecf20Sopenharmony_ci atomic64_t cmma_dirty_pages; 9588c2ecf20Sopenharmony_ci /* subset of available cpu features enabled by user space */ 9598c2ecf20Sopenharmony_ci DECLARE_BITMAP(cpu_feat, KVM_S390_VM_CPU_FEAT_NR_BITS); 9608c2ecf20Sopenharmony_ci /* indexed by vcpu_idx */ 9618c2ecf20Sopenharmony_ci DECLARE_BITMAP(idle_mask, KVM_MAX_VCPUS); 9628c2ecf20Sopenharmony_ci struct kvm_s390_gisa_interrupt gisa_int; 9638c2ecf20Sopenharmony_ci struct kvm_s390_pv pv; 9648c2ecf20Sopenharmony_ci}; 9658c2ecf20Sopenharmony_ci 9668c2ecf20Sopenharmony_ci#define KVM_HVA_ERR_BAD (-1UL) 9678c2ecf20Sopenharmony_ci#define KVM_HVA_ERR_RO_BAD (-2UL) 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_cistatic inline bool kvm_is_error_hva(unsigned long addr) 9708c2ecf20Sopenharmony_ci{ 9718c2ecf20Sopenharmony_ci return IS_ERR_VALUE(addr); 9728c2ecf20Sopenharmony_ci} 9738c2ecf20Sopenharmony_ci 9748c2ecf20Sopenharmony_ci#define ASYNC_PF_PER_VCPU 64 9758c2ecf20Sopenharmony_cistruct kvm_arch_async_pf { 9768c2ecf20Sopenharmony_ci unsigned long pfault_token; 9778c2ecf20Sopenharmony_ci}; 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_cibool kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu *vcpu); 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_civoid kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, 9828c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 9838c2ecf20Sopenharmony_ci 9848c2ecf20Sopenharmony_cibool kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, 9858c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 9868c2ecf20Sopenharmony_ci 9878c2ecf20Sopenharmony_civoid kvm_arch_async_page_present(struct kvm_vcpu *vcpu, 9888c2ecf20Sopenharmony_ci struct kvm_async_pf *work); 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_cistatic inline void kvm_arch_async_page_present_queued(struct kvm_vcpu *vcpu) {} 9918c2ecf20Sopenharmony_ci 9928c2ecf20Sopenharmony_civoid kvm_arch_crypto_clear_masks(struct kvm *kvm); 9938c2ecf20Sopenharmony_civoid kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm, 9948c2ecf20Sopenharmony_ci unsigned long *aqm, unsigned long *adm); 9958c2ecf20Sopenharmony_ci 9968c2ecf20Sopenharmony_ciextern int sie64a(struct kvm_s390_sie_block *, u64 *); 9978c2ecf20Sopenharmony_ciextern char sie_exit; 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ciextern int kvm_s390_gisc_register(struct kvm *kvm, u32 gisc); 10008c2ecf20Sopenharmony_ciextern int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc); 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_cistatic inline void kvm_arch_hardware_disable(void) {} 10038c2ecf20Sopenharmony_cistatic inline void kvm_arch_sync_events(struct kvm *kvm) {} 10048c2ecf20Sopenharmony_cistatic inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {} 10058c2ecf20Sopenharmony_cistatic inline void kvm_arch_free_memslot(struct kvm *kvm, 10068c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot) {} 10078c2ecf20Sopenharmony_cistatic inline void kvm_arch_memslots_updated(struct kvm *kvm, u64 gen) {} 10088c2ecf20Sopenharmony_cistatic inline void kvm_arch_flush_shadow_all(struct kvm *kvm) {} 10098c2ecf20Sopenharmony_cistatic inline void kvm_arch_flush_shadow_memslot(struct kvm *kvm, 10108c2ecf20Sopenharmony_ci struct kvm_memory_slot *slot) {} 10118c2ecf20Sopenharmony_cistatic inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} 10128c2ecf20Sopenharmony_cistatic inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} 10138c2ecf20Sopenharmony_ci 10148c2ecf20Sopenharmony_civoid kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu); 10158c2ecf20Sopenharmony_ci 10168c2ecf20Sopenharmony_ci#endif 1017