| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * asm-s390/kvm_host.h - definition for kernel virtual machines on s390 | 
|  | 3 | * | 
|  | 4 | * Copyright IBM Corp. 2008 | 
|  | 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/kvm_host.h> | 
|  | 17 | #include <asm/debug.h> | 
|  | 18 |  | 
|  | 19 | #define KVM_MAX_VCPUS 64 | 
|  | 20 | #define KVM_MEMORY_SLOTS 32 | 
|  | 21 | /* memory slots that does not exposed to userspace */ | 
|  | 22 | #define KVM_PRIVATE_MEM_SLOTS 4 | 
|  | 23 |  | 
|  | 24 | struct kvm_guest_debug { | 
|  | 25 | }; | 
|  | 26 |  | 
|  | 27 | struct sca_entry { | 
|  | 28 | atomic_t scn; | 
|  | 29 | __u64	reserved; | 
|  | 30 | __u64	sda; | 
|  | 31 | __u64	reserved2[2]; | 
|  | 32 | } __attribute__((packed)); | 
|  | 33 |  | 
|  | 34 |  | 
|  | 35 | struct sca_block { | 
|  | 36 | __u64	ipte_control; | 
|  | 37 | __u64	reserved[5]; | 
|  | 38 | __u64	mcn; | 
|  | 39 | __u64	reserved2; | 
|  | 40 | struct sca_entry cpu[64]; | 
|  | 41 | } __attribute__((packed)); | 
|  | 42 |  | 
|  | 43 | #define KVM_PAGES_PER_HPAGE 256 | 
|  | 44 |  | 
|  | 45 | #define CPUSTAT_HOST       0x80000000 | 
|  | 46 | #define CPUSTAT_WAIT       0x10000000 | 
|  | 47 | #define CPUSTAT_ECALL_PEND 0x08000000 | 
|  | 48 | #define CPUSTAT_STOP_INT   0x04000000 | 
|  | 49 | #define CPUSTAT_IO_INT     0x02000000 | 
|  | 50 | #define CPUSTAT_EXT_INT    0x01000000 | 
|  | 51 | #define CPUSTAT_RUNNING    0x00800000 | 
|  | 52 | #define CPUSTAT_RETAINED   0x00400000 | 
|  | 53 | #define CPUSTAT_TIMING_SUB 0x00020000 | 
|  | 54 | #define CPUSTAT_SIE_SUB    0x00010000 | 
|  | 55 | #define CPUSTAT_RRF        0x00008000 | 
|  | 56 | #define CPUSTAT_SLSV       0x00004000 | 
|  | 57 | #define CPUSTAT_SLSR       0x00002000 | 
|  | 58 | #define CPUSTAT_ZARCH      0x00000800 | 
|  | 59 | #define CPUSTAT_MCDS       0x00000100 | 
|  | 60 | #define CPUSTAT_SM         0x00000080 | 
|  | 61 | #define CPUSTAT_G          0x00000008 | 
|  | 62 | #define CPUSTAT_J          0x00000002 | 
|  | 63 | #define CPUSTAT_P          0x00000001 | 
|  | 64 |  | 
|  | 65 | struct sie_block { | 
|  | 66 | atomic_t cpuflags;		/* 0x0000 */ | 
|  | 67 | __u32	prefix;			/* 0x0004 */ | 
|  | 68 | __u8	reserved8[32];		/* 0x0008 */ | 
|  | 69 | __u64	cputm;			/* 0x0028 */ | 
|  | 70 | __u64	ckc;			/* 0x0030 */ | 
|  | 71 | __u64	epoch;			/* 0x0038 */ | 
|  | 72 | __u8	reserved40[4];		/* 0x0040 */ | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 73 | #define LCTL_CR0	0x8000 | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 74 | __u16   lctl;			/* 0x0044 */ | 
|  | 75 | __s16	icpua;			/* 0x0046 */ | 
|  | 76 | __u32	ictl;			/* 0x0048 */ | 
|  | 77 | __u32	eca;			/* 0x004c */ | 
|  | 78 | __u8	icptcode;		/* 0x0050 */ | 
|  | 79 | __u8	reserved51;		/* 0x0051 */ | 
|  | 80 | __u16	ihcpu;			/* 0x0052 */ | 
|  | 81 | __u8	reserved54[2];		/* 0x0054 */ | 
|  | 82 | __u16	ipa;			/* 0x0056 */ | 
|  | 83 | __u32	ipb;			/* 0x0058 */ | 
|  | 84 | __u32	scaoh;			/* 0x005c */ | 
|  | 85 | __u8	reserved60;		/* 0x0060 */ | 
|  | 86 | __u8	ecb;			/* 0x0061 */ | 
|  | 87 | __u8	reserved62[2];		/* 0x0062 */ | 
|  | 88 | __u32	scaol;			/* 0x0064 */ | 
|  | 89 | __u8	reserved68[4];		/* 0x0068 */ | 
|  | 90 | __u32	todpr;			/* 0x006c */ | 
|  | 91 | __u8	reserved70[16];		/* 0x0070 */ | 
|  | 92 | __u64	gmsor;			/* 0x0080 */ | 
|  | 93 | __u64	gmslm;			/* 0x0088 */ | 
|  | 94 | psw_t	gpsw;			/* 0x0090 */ | 
|  | 95 | __u64	gg14;			/* 0x00a0 */ | 
|  | 96 | __u64	gg15;			/* 0x00a8 */ | 
| Christian Borntraeger | e28acfe | 2008-03-25 18:47:34 +0100 | [diff] [blame] | 97 | __u8	reservedb0[30];		/* 0x00b0 */ | 
|  | 98 | __u16   iprcc;			/* 0x00ce */ | 
|  | 99 | __u8	reservedd0[48];		/* 0x00d0 */ | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 100 | __u64	gcr[16];		/* 0x0100 */ | 
|  | 101 | __u64	gbea;			/* 0x0180 */ | 
|  | 102 | __u8	reserved188[120];	/* 0x0188 */ | 
|  | 103 | } __attribute__((packed)); | 
|  | 104 |  | 
|  | 105 | struct kvm_vcpu_stat { | 
|  | 106 | u32 exit_userspace; | 
| Christian Borntraeger | 0eaeafa | 2008-05-07 09:22:53 +0200 | [diff] [blame] | 107 | u32 exit_null; | 
| Christian Borntraeger | 8f2abe6 | 2008-03-25 18:47:23 +0100 | [diff] [blame] | 108 | u32 exit_external_request; | 
|  | 109 | u32 exit_external_interrupt; | 
|  | 110 | u32 exit_stop_request; | 
|  | 111 | u32 exit_validity; | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 112 | u32 exit_instruction; | 
|  | 113 | u32 instruction_lctl; | 
|  | 114 | u32 instruction_lctg; | 
|  | 115 | u32 exit_program_interruption; | 
|  | 116 | u32 exit_instr_and_program; | 
|  | 117 | u32 deliver_emergency_signal; | 
|  | 118 | u32 deliver_service_signal; | 
|  | 119 | u32 deliver_virtio_interrupt; | 
|  | 120 | u32 deliver_stop_signal; | 
|  | 121 | u32 deliver_prefix_signal; | 
|  | 122 | u32 deliver_restart_signal; | 
|  | 123 | u32 deliver_program_int; | 
|  | 124 | u32 exit_wait_state; | 
| Christian Borntraeger | 453423d | 2008-03-25 18:47:29 +0100 | [diff] [blame] | 125 | u32 instruction_stidp; | 
|  | 126 | u32 instruction_spx; | 
|  | 127 | u32 instruction_stpx; | 
|  | 128 | u32 instruction_stap; | 
|  | 129 | u32 instruction_storage_key; | 
|  | 130 | u32 instruction_stsch; | 
|  | 131 | u32 instruction_chsc; | 
|  | 132 | u32 instruction_stsi; | 
|  | 133 | u32 instruction_stfl; | 
| Christian Borntraeger | 5288fbf | 2008-03-25 18:47:31 +0100 | [diff] [blame] | 134 | u32 instruction_sigp_sense; | 
|  | 135 | u32 instruction_sigp_emergency; | 
|  | 136 | u32 instruction_sigp_stop; | 
|  | 137 | u32 instruction_sigp_arch; | 
|  | 138 | u32 instruction_sigp_prefix; | 
|  | 139 | u32 instruction_sigp_restart; | 
| Christian Borntraeger | e28acfe | 2008-03-25 18:47:34 +0100 | [diff] [blame] | 140 | u32 diagnose_44; | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 141 | }; | 
|  | 142 |  | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 143 | struct io_info { | 
|  | 144 | __u16        subchannel_id;            /* 0x0b8 */ | 
|  | 145 | __u16        subchannel_nr;            /* 0x0ba */ | 
|  | 146 | __u32        io_int_parm;              /* 0x0bc */ | 
|  | 147 | __u32        io_int_word;              /* 0x0c0 */ | 
|  | 148 | }; | 
|  | 149 |  | 
|  | 150 | struct ext_info { | 
|  | 151 | __u32 ext_params; | 
|  | 152 | __u64 ext_params2; | 
|  | 153 | }; | 
|  | 154 |  | 
|  | 155 | #define PGM_OPERATION            0x01 | 
|  | 156 | #define PGM_PRIVILEGED_OPERATION 0x02 | 
|  | 157 | #define PGM_EXECUTE              0x03 | 
|  | 158 | #define PGM_PROTECTION           0x04 | 
|  | 159 | #define PGM_ADDRESSING           0x05 | 
|  | 160 | #define PGM_SPECIFICATION        0x06 | 
|  | 161 | #define PGM_DATA                 0x07 | 
|  | 162 |  | 
|  | 163 | struct pgm_info { | 
|  | 164 | __u16 code; | 
|  | 165 | }; | 
|  | 166 |  | 
|  | 167 | struct prefix_info { | 
|  | 168 | __u32 address; | 
|  | 169 | }; | 
|  | 170 |  | 
|  | 171 | struct interrupt_info { | 
|  | 172 | struct list_head list; | 
|  | 173 | u64	type; | 
|  | 174 | union { | 
|  | 175 | struct io_info io; | 
|  | 176 | struct ext_info ext; | 
|  | 177 | struct pgm_info pgm; | 
|  | 178 | struct prefix_info prefix; | 
|  | 179 | }; | 
|  | 180 | }; | 
|  | 181 |  | 
| Christian Borntraeger | 5288fbf | 2008-03-25 18:47:31 +0100 | [diff] [blame] | 182 | /* for local_interrupt.action_flags */ | 
|  | 183 | #define ACTION_STORE_ON_STOP 1 | 
|  | 184 | #define ACTION_STOP_ON_STOP  2 | 
|  | 185 |  | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 186 | struct local_interrupt { | 
|  | 187 | spinlock_t lock; | 
|  | 188 | struct list_head list; | 
|  | 189 | atomic_t active; | 
|  | 190 | struct float_interrupt *float_int; | 
|  | 191 | int timer_due; /* event indicator for waitqueue below */ | 
|  | 192 | wait_queue_head_t wq; | 
| Christian Borntraeger | 5288fbf | 2008-03-25 18:47:31 +0100 | [diff] [blame] | 193 | atomic_t *cpuflags; | 
|  | 194 | unsigned int action_bits; | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 195 | }; | 
|  | 196 |  | 
|  | 197 | struct float_interrupt { | 
|  | 198 | spinlock_t lock; | 
|  | 199 | struct list_head list; | 
|  | 200 | atomic_t active; | 
|  | 201 | int next_rr_cpu; | 
|  | 202 | unsigned long idle_mask [(64 + sizeof(long) - 1) / sizeof(long)]; | 
|  | 203 | struct local_interrupt *local_int[64]; | 
|  | 204 | }; | 
|  | 205 |  | 
|  | 206 |  | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 207 | struct kvm_vcpu_arch { | 
|  | 208 | struct sie_block *sie_block; | 
|  | 209 | unsigned long	  guest_gprs[16]; | 
|  | 210 | s390_fp_regs      host_fpregs; | 
|  | 211 | unsigned int      host_acrs[NUM_ACRS]; | 
|  | 212 | s390_fp_regs      guest_fpregs; | 
|  | 213 | unsigned int      guest_acrs[NUM_ACRS]; | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 214 | struct local_interrupt local_int; | 
|  | 215 | struct timer_list ckc_timer; | 
| Christian Borntraeger | 453423d | 2008-03-25 18:47:29 +0100 | [diff] [blame] | 216 | union  { | 
|  | 217 | cpuid_t	  cpu_id; | 
|  | 218 | u64	  stidp_data; | 
|  | 219 | }; | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 220 | }; | 
|  | 221 |  | 
|  | 222 | struct kvm_vm_stat { | 
|  | 223 | u32 remote_tlb_flush; | 
|  | 224 | }; | 
|  | 225 |  | 
|  | 226 | struct kvm_arch{ | 
|  | 227 | unsigned long guest_origin; | 
|  | 228 | unsigned long guest_memsize; | 
|  | 229 | struct sca_block *sca; | 
|  | 230 | debug_info_t *dbf; | 
| Carsten Otte | ba5c1e9 | 2008-03-25 18:47:26 +0100 | [diff] [blame] | 231 | struct float_interrupt float_int; | 
| Heiko Carstens | b0c632d | 2008-03-25 18:47:20 +0100 | [diff] [blame] | 232 | }; | 
|  | 233 |  | 
|  | 234 | extern int sie64a(struct sie_block *, __u64 *); | 
|  | 235 | #endif |