1 /* 2 * definition for kernel virtual machines on s390 3 * 4 * Copyright IBM Corp. 2008, 2009 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License (version 2 only) 8 * as published by the Free Software Foundation. 9 * 10 * Author(s): Carsten Otte <cotte@de.ibm.com> 11 */ 12 13 14 #ifndef ASM_KVM_HOST_H 15 #define ASM_KVM_HOST_H 16 #include <linux/hrtimer.h> 17 #include <linux/interrupt.h> 18 #include <linux/kvm_host.h> 19 #include <linux/kvm.h> 20 #include <asm/debug.h> 21 #include <asm/cpu.h> 22 #include <asm/isc.h> 23 24 #define KVM_MAX_VCPUS 64 25 #define KVM_USER_MEM_SLOTS 32 26 27 /* 28 * These seem to be used for allocating ->chip in the routing table, 29 * which we don't use. 4096 is an out-of-thin-air value. If we need 30 * to look at ->chip later on, we'll need to revisit this. 31 */ 32 #define KVM_NR_IRQCHIPS 1 33 #define KVM_IRQCHIP_NUM_PINS 4096 34 35 struct sca_entry { 36 atomic_t scn; 37 __u32 reserved; 38 __u64 sda; 39 __u64 reserved2[2]; 40 } __attribute__((packed)); 41 42 43 struct sca_block { 44 __u64 ipte_control; 45 __u64 reserved[5]; 46 __u64 mcn; 47 __u64 reserved2; 48 struct sca_entry cpu[64]; 49 } __attribute__((packed)); 50 51 #define CPUSTAT_STOPPED 0x80000000 52 #define CPUSTAT_WAIT 0x10000000 53 #define CPUSTAT_ECALL_PEND 0x08000000 54 #define CPUSTAT_STOP_INT 0x04000000 55 #define CPUSTAT_IO_INT 0x02000000 56 #define CPUSTAT_EXT_INT 0x01000000 57 #define CPUSTAT_RUNNING 0x00800000 58 #define CPUSTAT_RETAINED 0x00400000 59 #define CPUSTAT_TIMING_SUB 0x00020000 60 #define CPUSTAT_SIE_SUB 0x00010000 61 #define CPUSTAT_RRF 0x00008000 62 #define CPUSTAT_SLSV 0x00004000 63 #define CPUSTAT_SLSR 0x00002000 64 #define CPUSTAT_ZARCH 0x00000800 65 #define CPUSTAT_MCDS 0x00000100 66 #define CPUSTAT_SM 0x00000080 67 #define CPUSTAT_G 0x00000008 68 #define CPUSTAT_GED 0x00000004 69 #define CPUSTAT_J 0x00000002 70 #define CPUSTAT_P 0x00000001 71 72 struct kvm_s390_sie_block { 73 atomic_t cpuflags; /* 0x0000 */ 74 __u32 prefix; /* 0x0004 */ 75 __u8 reserved08[4]; /* 0x0008 */ 76 #define PROG_IN_SIE (1<<0) 77 __u32 prog0c; /* 0x000c */ 78 __u8 reserved10[16]; /* 0x0010 */ 79 #define PROG_BLOCK_SIE 0x00000001 80 atomic_t prog20; /* 0x0020 */ 81 __u8 reserved24[4]; /* 0x0024 */ 82 __u64 cputm; /* 0x0028 */ 83 __u64 ckc; /* 0x0030 */ 84 __u64 epoch; /* 0x0038 */ 85 __u8 reserved40[4]; /* 0x0040 */ 86 #define LCTL_CR0 0x8000 87 #define LCTL_CR6 0x0200 88 #define LCTL_CR14 0x0002 89 __u16 lctl; /* 0x0044 */ 90 __s16 icpua; /* 0x0046 */ 91 #define ICTL_LPSW 0x00400000 92 __u32 ictl; /* 0x0048 */ 93 __u32 eca; /* 0x004c */ 94 __u8 icptcode; /* 0x0050 */ 95 __u8 reserved51; /* 0x0051 */ 96 __u16 ihcpu; /* 0x0052 */ 97 __u8 reserved54[2]; /* 0x0054 */ 98 __u16 ipa; /* 0x0056 */ 99 __u32 ipb; /* 0x0058 */ 100 __u32 scaoh; /* 0x005c */ 101 __u8 reserved60; /* 0x0060 */ 102 __u8 ecb; /* 0x0061 */ 103 __u8 ecb2; /* 0x0062 */ 104 __u8 reserved63[1]; /* 0x0063 */ 105 __u32 scaol; /* 0x0064 */ 106 __u8 reserved68[4]; /* 0x0068 */ 107 __u32 todpr; /* 0x006c */ 108 __u8 reserved70[32]; /* 0x0070 */ 109 psw_t gpsw; /* 0x0090 */ 110 __u64 gg14; /* 0x00a0 */ 111 __u64 gg15; /* 0x00a8 */ 112 __u8 reservedb0[30]; /* 0x00b0 */ 113 __u16 iprcc; /* 0x00ce */ 114 __u8 reservedd0[48]; /* 0x00d0 */ 115 __u64 gcr[16]; /* 0x0100 */ 116 __u64 gbea; /* 0x0180 */ 117 __u8 reserved188[24]; /* 0x0188 */ 118 __u32 fac; /* 0x01a0 */ 119 __u8 reserved1a4[20]; /* 0x01a4 */ 120 __u64 cbrlo; /* 0x01b8 */ 121 __u8 reserved1c0[30]; /* 0x01c0 */ 122 __u64 pp; /* 0x01de */ 123 __u8 reserved1e6[2]; /* 0x01e6 */ 124 __u64 itdba; /* 0x01e8 */ 125 __u8 reserved1f0[16]; /* 0x01f0 */ 126 } __attribute__((packed)); 127 128 struct kvm_s390_itdb { 129 __u8 data[256]; 130 } __packed; 131 132 struct sie_page { 133 struct kvm_s390_sie_block sie_block; 134 __u8 reserved200[1024]; /* 0x0200 */ 135 struct kvm_s390_itdb itdb; /* 0x0600 */ 136 __u8 reserved700[2304]; /* 0x0700 */ 137 } __packed; 138 139 struct kvm_vcpu_stat { 140 u32 exit_userspace; 141 u32 exit_null; 142 u32 exit_external_request; 143 u32 exit_external_interrupt; 144 u32 exit_stop_request; 145 u32 exit_validity; 146 u32 exit_instruction; 147 u32 instruction_lctl; 148 u32 instruction_lctlg; 149 u32 exit_program_interruption; 150 u32 exit_instr_and_program; 151 u32 deliver_external_call; 152 u32 deliver_emergency_signal; 153 u32 deliver_service_signal; 154 u32 deliver_virtio_interrupt; 155 u32 deliver_stop_signal; 156 u32 deliver_prefix_signal; 157 u32 deliver_restart_signal; 158 u32 deliver_program_int; 159 u32 deliver_io_int; 160 u32 exit_wait_state; 161 u32 instruction_pfmf; 162 u32 instruction_stidp; 163 u32 instruction_spx; 164 u32 instruction_stpx; 165 u32 instruction_stap; 166 u32 instruction_storage_key; 167 u32 instruction_stsch; 168 u32 instruction_chsc; 169 u32 instruction_stsi; 170 u32 instruction_stfl; 171 u32 instruction_tprot; 172 u32 instruction_essa; 173 u32 instruction_sigp_sense; 174 u32 instruction_sigp_sense_running; 175 u32 instruction_sigp_external_call; 176 u32 instruction_sigp_emergency; 177 u32 instruction_sigp_stop; 178 u32 instruction_sigp_arch; 179 u32 instruction_sigp_prefix; 180 u32 instruction_sigp_restart; 181 u32 diagnose_10; 182 u32 diagnose_44; 183 u32 diagnose_9c; 184 }; 185 186 #define PGM_OPERATION 0x01 187 #define PGM_PRIVILEGED_OP 0x02 188 #define PGM_EXECUTE 0x03 189 #define PGM_PROTECTION 0x04 190 #define PGM_ADDRESSING 0x05 191 #define PGM_SPECIFICATION 0x06 192 #define PGM_DATA 0x07 193 194 struct kvm_s390_interrupt_info { 195 struct list_head list; 196 u64 type; 197 union { 198 struct kvm_s390_io_info io; 199 struct kvm_s390_ext_info ext; 200 struct kvm_s390_pgm_info pgm; 201 struct kvm_s390_emerg_info emerg; 202 struct kvm_s390_extcall_info extcall; 203 struct kvm_s390_prefix_info prefix; 204 struct kvm_s390_mchk_info mchk; 205 }; 206 }; 207 208 /* for local_interrupt.action_flags */ 209 #define ACTION_STORE_ON_STOP (1<<0) 210 #define ACTION_STOP_ON_STOP (1<<1) 211 212 struct kvm_s390_local_interrupt { 213 spinlock_t lock; 214 struct list_head list; 215 atomic_t active; 216 struct kvm_s390_float_interrupt *float_int; 217 int timer_due; /* event indicator for waitqueue below */ 218 wait_queue_head_t *wq; 219 atomic_t *cpuflags; 220 unsigned int action_bits; 221 }; 222 223 struct kvm_s390_float_interrupt { 224 spinlock_t lock; 225 struct list_head list; 226 atomic_t active; 227 int next_rr_cpu; 228 unsigned long idle_mask[BITS_TO_LONGS(KVM_MAX_VCPUS)]; 229 unsigned int irq_count; 230 }; 231 232 233 struct kvm_vcpu_arch { 234 struct kvm_s390_sie_block *sie_block; 235 s390_fp_regs host_fpregs; 236 unsigned int host_acrs[NUM_ACRS]; 237 s390_fp_regs guest_fpregs; 238 struct kvm_s390_local_interrupt local_int; 239 struct hrtimer ckc_timer; 240 struct tasklet_struct tasklet; 241 union { 242 struct cpuid cpu_id; 243 u64 stidp_data; 244 }; 245 struct gmap *gmap; 246 #define KVM_S390_PFAULT_TOKEN_INVALID (-1UL) 247 unsigned long pfault_token; 248 unsigned long pfault_select; 249 unsigned long pfault_compare; 250 }; 251 252 struct kvm_vm_stat { 253 u32 remote_tlb_flush; 254 }; 255 256 struct kvm_arch_memory_slot { 257 }; 258 259 struct s390_map_info { 260 struct list_head list; 261 __u64 guest_addr; 262 __u64 addr; 263 struct page *page; 264 }; 265 266 struct s390_io_adapter { 267 unsigned int id; 268 int isc; 269 bool maskable; 270 bool masked; 271 bool swap; 272 struct rw_semaphore maps_lock; 273 struct list_head maps; 274 atomic_t nr_maps; 275 }; 276 277 #define MAX_S390_IO_ADAPTERS ((MAX_ISC + 1) * 8) 278 #define MAX_S390_ADAPTER_MAPS 256 279 280 struct kvm_arch{ 281 struct sca_block *sca; 282 debug_info_t *dbf; 283 struct kvm_s390_float_interrupt float_int; 284 struct kvm_device *flic; 285 struct gmap *gmap; 286 int css_support; 287 int use_irqchip; 288 struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS]; 289 }; 290 291 #define KVM_HVA_ERR_BAD (-1UL) 292 #define KVM_HVA_ERR_RO_BAD (-2UL) 293 294 static inline bool kvm_is_error_hva(unsigned long addr) 295 { 296 return IS_ERR_VALUE(addr); 297 } 298 299 #define ASYNC_PF_PER_VCPU 64 300 struct kvm_vcpu; 301 struct kvm_async_pf; 302 struct kvm_arch_async_pf { 303 unsigned long pfault_token; 304 }; 305 306 bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu); 307 308 void kvm_arch_async_page_ready(struct kvm_vcpu *vcpu, 309 struct kvm_async_pf *work); 310 311 void kvm_arch_async_page_not_present(struct kvm_vcpu *vcpu, 312 struct kvm_async_pf *work); 313 314 void kvm_arch_async_page_present(struct kvm_vcpu *vcpu, 315 struct kvm_async_pf *work); 316 317 extern int sie64a(struct kvm_s390_sie_block *, u64 *); 318 extern char sie_exit; 319 #endif 320