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 17#include <linux/types.h> 18#include <linux/hrtimer.h> 19#include <linux/interrupt.h> 20#include <linux/kvm_types.h> 21#include <linux/kvm_host.h> 22#include <asm/debug.h> 23#include <asm/cpu.h> 24 25#define KVM_MAX_VCPUS 64 26#define KVM_USER_MEM_SLOTS 32 27 28#define KVM_HALT_POLL_NS_DEFAULT 0 29 30struct sca_entry { 31 atomic_t scn; 32 __u32 reserved; 33 __u64 sda; 34 __u64 reserved2[2]; 35} __attribute__((packed)); 36 37 38struct sca_block { 39 __u64 ipte_control; 40 __u64 reserved[5]; 41 __u64 mcn; 42 __u64 reserved2; 43 struct sca_entry cpu[64]; 44} __attribute__((packed)); 45 46#define KVM_NR_PAGE_SIZES 2 47#define KVM_HPAGE_GFN_SHIFT(x) (((x) - 1) * 8) 48#define KVM_HPAGE_SHIFT(x) (PAGE_SHIFT + KVM_HPAGE_GFN_SHIFT(x)) 49#define KVM_HPAGE_SIZE(x) (1UL << KVM_HPAGE_SHIFT(x)) 50#define KVM_HPAGE_MASK(x) (~(KVM_HPAGE_SIZE(x) - 1)) 51#define KVM_PAGES_PER_HPAGE(x) (KVM_HPAGE_SIZE(x) / PAGE_SIZE) 52 53#define CPUSTAT_STOPPED 0x80000000 54#define CPUSTAT_WAIT 0x10000000 55#define CPUSTAT_ECALL_PEND 0x08000000 56#define CPUSTAT_STOP_INT 0x04000000 57#define CPUSTAT_IO_INT 0x02000000 58#define CPUSTAT_EXT_INT 0x01000000 59#define CPUSTAT_RUNNING 0x00800000 60#define CPUSTAT_RETAINED 0x00400000 61#define CPUSTAT_TIMING_SUB 0x00020000 62#define CPUSTAT_SIE_SUB 0x00010000 63#define CPUSTAT_RRF 0x00008000 64#define CPUSTAT_SLSV 0x00004000 65#define CPUSTAT_SLSR 0x00002000 66#define CPUSTAT_ZARCH 0x00000800 67#define CPUSTAT_MCDS 0x00000100 68#define CPUSTAT_SM 0x00000080 69#define CPUSTAT_G 0x00000008 70#define CPUSTAT_GED 0x00000004 71#define CPUSTAT_J 0x00000002 72#define CPUSTAT_P 0x00000001 73 74struct kvm_s390_sie_block { 75 atomic_t cpuflags; /* 0x0000 */ 76 __u32 prefix; /* 0x0004 */ 77 __u8 reserved08[4]; /* 0x0008 */ 78#define PROG_IN_SIE (1<<0) 79 __u32 prog0c; /* 0x000c */ 80 __u8 reserved10[16]; /* 0x0010 */ 81#define PROG_BLOCK_SIE 0x00000001 82 atomic_t prog20; /* 0x0020 */ 83 __u8 reserved24[4]; /* 0x0024 */ 84 __u64 cputm; /* 0x0028 */ 85 __u64 ckc; /* 0x0030 */ 86 __u64 epoch; /* 0x0038 */ 87 __u8 reserved40[4]; /* 0x0040 */ 88#define LCTL_CR0 0x8000 89#define LCTL_CR6 0x0200 90#define LCTL_CR14 0x0002 91 __u16 lctl; /* 0x0044 */ 92 __s16 icpua; /* 0x0046 */ 93#define ICTL_LPSW 0x00400000 94 __u32 ictl; /* 0x0048 */ 95 __u32 eca; /* 0x004c */ 96 __u8 icptcode; /* 0x0050 */ 97 __u8 reserved51; /* 0x0051 */ 98 __u16 ihcpu; /* 0x0052 */ 99 __u8 reserved54[2]; /* 0x0054 */ 100 __u16 ipa; /* 0x0056 */ 101 __u32 ipb; /* 0x0058 */ 102 __u32 scaoh; /* 0x005c */ 103 __u8 reserved60; /* 0x0060 */ 104 __u8 ecb; /* 0x0061 */ 105 __u8 ecb2; /* 0x0062 */ 106 __u8 reserved63[1]; /* 0x0063 */ 107 __u32 scaol; /* 0x0064 */ 108 __u8 reserved68[4]; /* 0x0068 */ 109 __u32 todpr; /* 0x006c */ 110 __u8 reserved70[32]; /* 0x0070 */ 111 psw_t gpsw; /* 0x0090 */ 112 __u64 gg14; /* 0x00a0 */ 113 __u64 gg15; /* 0x00a8 */ 114 __u8 reservedb0[30]; /* 0x00b0 */ 115 __u16 iprcc; /* 0x00ce */ 116 __u8 reservedd0[48]; /* 0x00d0 */ 117 __u64 gcr[16]; /* 0x0100 */ 118 __u64 gbea; /* 0x0180 */ 119 __u8 reserved188[24]; /* 0x0188 */ 120 __u32 fac; /* 0x01a0 */ 121 __u8 reserved1a4[92]; /* 0x01a4 */ 122} __attribute__((packed)); 123 124struct kvm_vcpu_stat { 125 u64 exit_userspace; 126 u64 exit_null; 127 u64 exit_external_request; 128 u64 exit_external_interrupt; 129 u64 exit_stop_request; 130 u64 exit_validity; 131 u64 exit_instruction; 132 u64 halt_successful_poll; 133 u64 halt_attempted_poll; 134 u64 instruction_lctl; 135 u64 instruction_lctlg; 136 u64 exit_program_interruption; 137 u64 exit_instr_and_program; 138 u64 deliver_external_call; 139 u64 deliver_emergency_signal; 140 u64 deliver_service_signal; 141 u64 deliver_virtio_interrupt; 142 u64 deliver_stop_signal; 143 u64 deliver_prefix_signal; 144 u64 deliver_restart_signal; 145 u64 deliver_program_int; 146 u64 deliver_io_int; 147 u64 exit_wait_state; 148 u64 instruction_pfmf; 149 u64 instruction_stidp; 150 u64 instruction_spx; 151 u64 instruction_stpx; 152 u64 instruction_stap; 153 u64 instruction_storage_key; 154 u64 instruction_stsch; 155 u64 instruction_chsc; 156 u64 instruction_stsi; 157 u64 instruction_stfl; 158 u64 instruction_tprot; 159 u64 instruction_sigp_sense; 160 u64 instruction_sigp_sense_running; 161 u64 instruction_sigp_external_call; 162 u64 instruction_sigp_emergency; 163 u64 instruction_sigp_stop; 164 u64 instruction_sigp_arch; 165 u64 instruction_sigp_prefix; 166 u64 instruction_sigp_restart; 167 u64 diagnose_10; 168 u64 diagnose_44; 169 u64 diagnose_9c; 170}; 171 172struct kvm_s390_io_info { 173 __u16 subchannel_id; /* 0x0b8 */ 174 __u16 subchannel_nr; /* 0x0ba */ 175 __u32 io_int_parm; /* 0x0bc */ 176 __u32 io_int_word; /* 0x0c0 */ 177}; 178 179struct kvm_s390_ext_info { 180 __u32 ext_params; 181 __u64 ext_params2; 182}; 183 184#define PGM_OPERATION 0x01 185#define PGM_PRIVILEGED_OP 0x02 186#define PGM_EXECUTE 0x03 187#define PGM_PROTECTION 0x04 188#define PGM_ADDRESSING 0x05 189#define PGM_SPECIFICATION 0x06 190#define PGM_DATA 0x07 191 192struct kvm_s390_pgm_info { 193 __u16 code; 194}; 195 196struct kvm_s390_prefix_info { 197 __u32 address; 198}; 199 200struct kvm_s390_extcall_info { 201 __u16 code; 202}; 203 204struct kvm_s390_emerg_info { 205 __u16 code; 206}; 207 208struct kvm_s390_mchk_info { 209 __u64 cr14; 210 __u64 mcic; 211}; 212 213struct kvm_s390_interrupt_info { 214 struct list_head list; 215 u64 type; 216 union { 217 struct kvm_s390_io_info io; 218 struct kvm_s390_ext_info ext; 219 struct kvm_s390_pgm_info pgm; 220 struct kvm_s390_emerg_info emerg; 221 struct kvm_s390_extcall_info extcall; 222 struct kvm_s390_prefix_info prefix; 223 struct kvm_s390_mchk_info mchk; 224 }; 225}; 226 227/* for local_interrupt.action_flags */ 228#define ACTION_STORE_ON_STOP (1<<0) 229#define ACTION_STOP_ON_STOP (1<<1) 230#define ACTION_RELOADVCPU_ON_STOP (1<<2) 231 232struct kvm_s390_local_interrupt { 233 spinlock_t lock; 234 struct list_head list; 235 atomic_t active; 236 struct kvm_s390_float_interrupt *float_int; 237 int timer_due; /* event indicator for waitqueue below */ 238 wait_queue_head_t *wq; 239 atomic_t *cpuflags; 240 unsigned int action_bits; 241}; 242 243struct kvm_s390_float_interrupt { 244 spinlock_t lock; 245 struct list_head list; 246 atomic_t active; 247 int next_rr_cpu; 248 unsigned long idle_mask[(KVM_MAX_VCPUS + sizeof(long) - 1) 249 / sizeof(long)]; 250 struct kvm_s390_local_interrupt *local_int[KVM_MAX_VCPUS]; 251}; 252 253 254struct kvm_vcpu_arch { 255 struct kvm_s390_sie_block *sie_block; 256 s390_fp_regs host_fpregs; 257 unsigned int host_acrs[NUM_ACRS]; 258 s390_fp_regs guest_fpregs; 259 struct kvm_s390_local_interrupt local_int; 260 struct hrtimer ckc_timer; 261 struct tasklet_struct tasklet; 262 union { 263 struct cpuid cpu_id; 264 u64 stidp_data; 265 }; 266 struct gmap *gmap; 267}; 268 269struct kvm_vm_stat { 270 ulong remote_tlb_flush; 271}; 272 273struct kvm_arch_memory_slot { 274}; 275 276struct kvm_arch{ 277 struct sca_block *sca; 278 debug_info_t *dbf; 279 struct kvm_s390_float_interrupt float_int; 280 struct gmap *gmap; 281 int css_support; 282}; 283 284#define KVM_HVA_ERR_BAD (-1UL) 285#define KVM_HVA_ERR_RO_BAD (-2UL) 286 287static inline bool kvm_is_error_hva(unsigned long addr) 288{ 289 return IS_ERR_VALUE(addr); 290} 291 292extern int sie64a(struct kvm_s390_sie_block *, u64 *); 293extern char sie_exit; 294 295static inline void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) {} 296static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {} 297 298#endif 299